diff --git a/lib/protoc.exe b/lib/protoc.exe index d408e9ed57..efda94d62d 100644 Binary files a/lib/protoc.exe and b/lib/protoc.exe differ diff --git a/protos/google/protobuf/csharp_options.proto b/protos/google/protobuf/csharp_options.proto index 41deafa304..b58a549172 100644 --- a/protos/google/protobuf/csharp_options.proto +++ b/protos/google/protobuf/csharp_options.proto @@ -6,10 +6,11 @@ package google.protobuf; message CSharpFileOptions { optional string namespace = 1; - optional string umbrella_classname= 2; - optional bool public_classes = 3; + optional string umbrella_classname = 2; + optional bool public_classes = 3 [default = true]; optional bool multiple_files = 4; optional bool nest_classes = 5; + optional bool code_contracts = 6; } extend FileOptions { diff --git a/src/ProtoGen/UmbrellaClassGenerator.cs b/src/ProtoGen/UmbrellaClassGenerator.cs index d41e70eb1c..9dcbcab906 100644 --- a/src/ProtoGen/UmbrellaClassGenerator.cs +++ b/src/ProtoGen/UmbrellaClassGenerator.cs @@ -115,8 +115,10 @@ namespace Google.ProtocolBuffers.ProtoGen { writer.WriteLine("namespace {0} {{", Descriptor.CSharpOptions.Namespace); writer.Indent(); writer.WriteLine(); + } + if (Descriptor.CSharpOptions.CodeContracts) { + writer.WriteLine("[global::System.Diagnostics.Contracts.ContractVerificationAttribute(false)]"); } - writer.WriteLine("{0} static partial class {1} {{", ClassAccessLevel, Descriptor.CSharpOptions.UmbrellaClassname); writer.WriteLine(); writer.Indent(); diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs index 0185870680..9ab99dfe32 100644 --- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs +++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs @@ -37,21 +37,22 @@ namespace Google.ProtocolBuffers.DescriptorProtos { byte[] descriptorData = global::System.Convert.FromBase64String( "CiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8SD2dvb2ds" + "ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8i" + - "iAEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + - "bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSFgoOcHVibGljX2NsYXNzZXMYAyAB" + - "KAgSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFzc2VzGAUg" + - "ASgIIisKEkNTaGFycEZpZWxkT3B0aW9ucxIVCg1wcm9wZXJ0eV9uYW1lGAEg" + - "ASgJOl4KE2NzaGFycF9maWxlX29wdGlvbnMSHC5nb29nbGUucHJvdG9idWYu" + - "RmlsZU9wdGlvbnMY6AcgASgLMiIuZ29vZ2xlLnByb3RvYnVmLkNTaGFycEZp" + - "bGVPcHRpb25zOmEKFGNzaGFycF9maWVsZF9vcHRpb25zEh0uZ29vZ2xlLnBy" + - "b3RvYnVmLkZpZWxkT3B0aW9ucxjoByABKAsyIy5nb29nbGUucHJvdG9idWYu" + - "Q1NoYXJwRmllbGRPcHRpb25z"); + "pgEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + + "bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSHAoOcHVibGljX2NsYXNzZXMYAyAB" + + "KAg6BHRydWUSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFz" + + "c2VzGAUgASgIEhYKDmNvZGVfY29udHJhY3RzGAYgASgIIisKEkNTaGFycEZp" + + "ZWxkT3B0aW9ucxIVCg1wcm9wZXJ0eV9uYW1lGAEgASgJOl4KE2NzaGFycF9m" + + "aWxlX29wdGlvbnMSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6Acg" + + "ASgLMiIuZ29vZ2xlLnByb3RvYnVmLkNTaGFycEZpbGVPcHRpb25zOmEKFGNz" + + "aGFycF9maWVsZF9vcHRpb25zEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0" + + "aW9ucxjoByABKAsyIy5nb29nbGUucHJvdG9idWYuQ1NoYXJwRmllbGRPcHRp" + + "b25z"); pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) { descriptor = root; internal__static_google_protobuf_CSharpFileOptions__Descriptor = Descriptor.MessageTypes[0]; internal__static_google_protobuf_CSharpFileOptions__FieldAccessorTable = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_CSharpFileOptions__Descriptor, - new string[] { "Namespace", "UmbrellaClassname", "PublicClasses", "MultipleFiles", "NestClasses", }); + new string[] { "Namespace", "UmbrellaClassname", "PublicClasses", "MultipleFiles", "NestClasses", "CodeContracts", }); internal__static_google_protobuf_CSharpFieldOptions__Descriptor = Descriptor.MessageTypes[1]; internal__static_google_protobuf_CSharpFieldOptions__FieldAccessorTable = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_CSharpFieldOptions__Descriptor, @@ -113,7 +114,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { public const int PublicClassesFieldNumber = 3; private bool hasPublicClasses; - private bool publicClasses_ = false; + private bool publicClasses_ = true; public bool HasPublicClasses { get { return hasPublicClasses; } } @@ -141,6 +142,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return nestClasses_; } } + public const int CodeContractsFieldNumber = 6; + private bool hasCodeContracts; + private bool codeContracts_ = false; + public bool HasCodeContracts { + get { return hasCodeContracts; } + } + public bool CodeContracts { + get { return codeContracts_; } + } + public override bool IsInitialized { get { return true; @@ -163,6 +174,9 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (HasNestClasses) { output.WriteBool(5, NestClasses); } + if (HasCodeContracts) { + output.WriteBool(6, CodeContracts); + } UnknownFields.WriteTo(output); } @@ -188,6 +202,9 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (HasNestClasses) { size += pb::CodedOutputStream.ComputeBoolSize(5, NestClasses); } + if (HasCodeContracts) { + size += pb::CodedOutputStream.ComputeBoolSize(6, CodeContracts); + } size += UnknownFields.SerializedSize; memoizedSerializedSize = size; return size; @@ -295,6 +312,9 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.HasNestClasses) { NestClasses = other.NestClasses; } + if (other.HasCodeContracts) { + CodeContracts = other.CodeContracts; + } this.MergeUnknownFields(other.UnknownFields); return this; } @@ -347,6 +367,10 @@ namespace Google.ProtocolBuffers.DescriptorProtos { NestClasses = input.ReadBool(); break; } + case 48: { + CodeContracts = input.ReadBool(); + break; + } } } } @@ -404,7 +428,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public Builder ClearPublicClasses() { result.hasPublicClasses = false; - result.publicClasses_ = false; + result.publicClasses_ = true; return this; } @@ -443,6 +467,24 @@ namespace Google.ProtocolBuffers.DescriptorProtos { result.nestClasses_ = false; return this; } + + public bool HasCodeContracts { + get { return result.HasCodeContracts; } + } + public bool CodeContracts { + get { return result.CodeContracts; } + set { SetCodeContracts(value); } + } + public Builder SetCodeContracts(bool value) { + result.hasCodeContracts = true; + result.codeContracts_ = value; + return this; + } + public Builder ClearCodeContracts() { + result.hasCodeContracts = false; + result.codeContracts_ = false; + return this; + } } static CSharpFileOptions() { object.ReferenceEquals(global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, null); diff --git a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs index a6dd7f85e0..4d7b54e080 100644 --- a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs @@ -94,15 +94,6 @@ namespace Google.ProtocolBuffers.Descriptors { if (!builder.HasNamespace) { builder.Namespace = Package; } - if (!builder.HasMultipleFiles) { - builder.MultipleFiles = false; - } - if (!builder.HasNestClasses) { - builder.NestClasses = false; - } - if (!builder.HasPublicClasses) { - builder.PublicClasses = true; - } if (!builder.HasUmbrellaClassname) { int lastSlash = Name.LastIndexOf('/'); string baseName = Name.Substring(lastSlash + 1); diff --git a/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs b/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs index cdd75a0cac..79356170e7 100644 --- a/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs @@ -57,6 +57,7 @@ namespace Google.ProtocolBuffers.Descriptors { enumTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.EnumTypeList, (type, index) => new EnumDescriptor(type, file, this, index)); + // TODO(jonskeet): Sort fields first? fields = DescriptorUtil.ConvertAndMakeReadOnly(proto.FieldList, (field, index) => new FieldDescriptor(field, file, this, index, false));