diff --git a/build/build.csproj b/build/build.csproj index 409d1932d2..16dd69a0fe 100644 --- a/build/build.csproj +++ b/build/build.csproj @@ -36,6 +36,7 @@ + @@ -71,6 +72,9 @@ $(SourceDirectory)\AddressBook + + $(SourceDirectory)\ProtocolBuffers.Test\TestProtos + $(SourceDirectory)\ProtocolBuffers.Test\TestProtos diff --git a/protos/extest/unittest_issues.proto b/protos/extest/unittest_issues.proto new file mode 100644 index 0000000000..459e58f865 --- /dev/null +++ b/protos/extest/unittest_issues.proto @@ -0,0 +1,88 @@ +// These proto descriptors have at one time been reported as an issue or defect. +// They are kept here to replicate the issue, and continue to verify the fix. +import "google/protobuf/csharp_options.proto"; + +// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified +option (google.protobuf.csharp_file_options).namespace = "UnitTest.Issues.TestProtos"; +option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasIssuesProtoFile"; + +package unittest_issues; +option optimize_for = SPEED; + +// The following is a representative set of features +/* +enum EnumOptions { + ONE = 0; + TWO = 1; + THREE = 2; +} + +message TestBasicChild +{ + repeated EnumOptions options = 3; + optional bytes binary = 4; +} + +message TestBasicNoFields { +} + +message TestBasicRescursive { + optional TestBasicRescursive child = 1; +} + +message TestBasicMessage { + + optional int64 number = 6; + repeated int32 numbers = 2; + optional string text = 3; + repeated string textlines = 700; + optional bool valid = 5; + + optional TestBasicChild child = 1; + repeated group Children = 401 + { + repeated EnumOptions options = 3; + optional bytes binary = 4; + } + + extensions 100 to 199; +} + +message TestBasicExtension { + required int32 number = 1; +} + +extend TestBasicMessage { + optional EnumOptions extension_enum = 101; + optional string extension_text = 102; + repeated int32 extension_number = 103 [packed = true]; + optional TestBasicExtension extension_message = 199; +} + +// Issue for non-qualified type reference in new services generation +option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; + +service TestGenericService { + rpc Foo(TestBasicNoFields) returns (TestBasicMessage); + rpc Bar(TestBasicNoFields) returns (TestBasicMessage); +} +*/ +// Issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13 + +message A { + optional int32 _A = 1; +} + +message B { + optional int32 B_ = 1; +} + +message AB { + optional int32 a_b = 1; +} + +// Similar issue with numeric names +message NumberField { + optional int32 _01 = 1; +} + diff --git a/src/ProtoGen/ExtensionGenerator.cs b/src/ProtoGen/ExtensionGenerator.cs index b779c0a4d4..a862a7a0ad 100644 --- a/src/ProtoGen/ExtensionGenerator.cs +++ b/src/ProtoGen/ExtensionGenerator.cs @@ -75,6 +75,11 @@ namespace Google.ProtocolBuffers.ProtoGen public void Generate(TextGenerator writer) { + if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(Descriptor).StartsWith("_")) + { + writer.WriteLine("[global::System.CLSCompliant(false)]"); + } + writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(Descriptor), Descriptor.FieldNumber); if (UseLiteRuntime) diff --git a/src/ProtoGen/MessageGenerator.cs b/src/ProtoGen/MessageGenerator.cs index 8d41cde1d9..01d47ce216 100644 --- a/src/ProtoGen/MessageGenerator.cs +++ b/src/ProtoGen/MessageGenerator.cs @@ -246,6 +246,11 @@ namespace Google.ProtocolBuffers.ProtoGen foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields) { + if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(fieldDescriptor).StartsWith("_")) + { + writer.WriteLine("[global::System.CLSCompliant(false)]"); + } + // Rats: we lose the debug comment here :( writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(fieldDescriptor), fieldDescriptor.FieldNumber); diff --git a/src/ProtocolBuffers.Test/NameHelpersTest.cs b/src/ProtocolBuffers.Test/NameHelpersTest.cs index b14b0fcfde..a33de67278 100644 --- a/src/ProtocolBuffers.Test/NameHelpersTest.cs +++ b/src/ProtocolBuffers.Test/NameHelpersTest.cs @@ -48,6 +48,11 @@ namespace Google.ProtocolBuffers Assert.AreEqual("FooBar", NameHelpers.UnderscoresToPascalCase("foo_bar")); Assert.AreEqual("Foo0Bar", NameHelpers.UnderscoresToPascalCase("Foo0bar")); Assert.AreEqual("FooBar", NameHelpers.UnderscoresToPascalCase("Foo_+_Bar")); + + Assert.AreEqual("Bar", NameHelpers.UnderscoresToPascalCase("__+bar")); + Assert.AreEqual("Bar", NameHelpers.UnderscoresToPascalCase("bar_")); + Assert.AreEqual("_0Bar", NameHelpers.UnderscoresToPascalCase("_0bar")); + Assert.AreEqual("_1Bar", NameHelpers.UnderscoresToPascalCase("_1_bar")); } [Test] @@ -57,6 +62,11 @@ namespace Google.ProtocolBuffers Assert.AreEqual("fooBar", NameHelpers.UnderscoresToCamelCase("foo_bar")); Assert.AreEqual("foo0Bar", NameHelpers.UnderscoresToCamelCase("Foo0bar")); Assert.AreEqual("fooBar", NameHelpers.UnderscoresToCamelCase("Foo_+_Bar")); + + Assert.AreEqual("bar", NameHelpers.UnderscoresToCamelCase("__+bar")); + Assert.AreEqual("bar", NameHelpers.UnderscoresToCamelCase("bar_")); + Assert.AreEqual("_0Bar", NameHelpers.UnderscoresToCamelCase("_0bar")); + Assert.AreEqual("_1Bar", NameHelpers.UnderscoresToCamelCase("_1_bar")); } [Test] diff --git a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj index bf22426450..f380cf6ad9 100644 --- a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj +++ b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj @@ -104,6 +104,7 @@ + diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs new file mode 100644 index 0000000000..a818fca28f --- /dev/null +++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestExtrasIssuesProtoFile.cs @@ -0,0 +1,1036 @@ +// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48. DO NOT EDIT! + +using pb = global::Google.ProtocolBuffers; +using pbc = global::Google.ProtocolBuffers.Collections; +using pbd = global::Google.ProtocolBuffers.Descriptors; +using scg = global::System.Collections.Generic; +namespace UnitTest.Issues.TestProtos { + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public static partial class UnitTestExtrasIssuesProtoFile { + + #region Extension registration + public static void RegisterAllExtensions(pb::ExtensionRegistry registry) { + } + #endregion + #region Static variables + internal static pbd::MessageDescriptor internal__static_unittest_issues_A__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_unittest_issues_A__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_unittest_issues_B__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_unittest_issues_B__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_unittest_issues_AB__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_unittest_issues_AB__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_unittest_issues_NumberField__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_unittest_issues_NumberField__FieldAccessorTable; + #endregion + #region Descriptor + public static pbd::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbd::FileDescriptor descriptor; + + static UnitTestExtrasIssuesProtoFile() { + byte[] descriptorData = global::System.Convert.FromBase64String( + "ChxleHRlc3QvdW5pdHRlc3RfaXNzdWVzLnByb3RvEg91bml0dGVzdF9pc3N1" + + "ZXMaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIPCgFB" + + "EgoKAl9BGAEgASgFIg8KAUISCgoCQl8YASABKAUiEQoCQUISCwoDYV9iGAEg" + + "ASgFIhoKC051bWJlckZpZWxkEgsKA18wMRgBIAEoBUJASAHCPjsKGlVuaXRU" + + "ZXN0Lklzc3Vlcy5UZXN0UHJvdG9zEh1Vbml0VGVzdEV4dHJhc0lzc3Vlc1By" + + "b3RvRmlsZQ=="); + pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) { + descriptor = root; + internal__static_unittest_issues_A__Descriptor = Descriptor.MessageTypes[0]; + internal__static_unittest_issues_A__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_unittest_issues_A__Descriptor, + new string[] { "A_", }); + internal__static_unittest_issues_B__Descriptor = Descriptor.MessageTypes[1]; + internal__static_unittest_issues_B__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_unittest_issues_B__Descriptor, + new string[] { "B_", }); + internal__static_unittest_issues_AB__Descriptor = Descriptor.MessageTypes[2]; + internal__static_unittest_issues_AB__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_unittest_issues_AB__Descriptor, + new string[] { "AB_", }); + internal__static_unittest_issues_NumberField__Descriptor = Descriptor.MessageTypes[3]; + internal__static_unittest_issues_NumberField__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_unittest_issues_NumberField__Descriptor, + new string[] { "_01", }); + pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance(); + RegisterAllExtensions(registry); + global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry); + return registry; + }; + pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData, + new pbd::FileDescriptor[] { + global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, + }, assigner); + } + #endregion + + } + #region Messages + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class A : pb::GeneratedMessage { + private static readonly A defaultInstance = new Builder().BuildPartial(); + private static readonly string[] _aFieldNames = new string[] { "_A" }; + private static readonly uint[] _aFieldTags = new uint[] { 8 }; + public static A DefaultInstance { + get { return defaultInstance; } + } + + public override A DefaultInstanceForType { + get { return defaultInstance; } + } + + protected override A ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_A__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_A__FieldAccessorTable; } + } + + public const int A_FieldNumber = 1; + private bool hasA_; + private int a_; + public bool HasA_ { + get { return hasA_; } + } + public int A_ { + get { return a_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _aFieldNames; + if (hasA_) { + output.WriteInt32(1, field_names[0], A_); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasA_) { + size += pb::CodedOutputStream.ComputeInt32Size(1, A_); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static A ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static A ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static A ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static A ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static A ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static A ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static A ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static A ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static A ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static A ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(A prototype) { + return (Builder) new Builder().MergeFrom(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() {} + + A result = new A(); + + protected override A MessageBeingBuilt { + get { return result; } + } + + public override Builder Clear() { + result = new A(); + return this; + } + + public override Builder Clone() { + return new Builder().MergeFrom(result); + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::UnitTest.Issues.TestProtos.A.Descriptor; } + } + + public override A DefaultInstanceForType { + get { return global::UnitTest.Issues.TestProtos.A.DefaultInstance; } + } + + public override A BuildPartial() { + if (result == null) { + throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + } + A returnMe = result; + result = null; + return returnMe; + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is A) { + return MergeFrom((A) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(A other) { + if (other == global::UnitTest.Issues.TestProtos.A.DefaultInstance) return this; + if (other.HasA_) { + A_ = other.A_; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_aFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _aFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.hasA_ = input.ReadInt32(ref result.a_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasA_ { + get { return result.hasA_; } + } + public int A_ { + get { return result.A_; } + set { SetA_(value); } + } + public Builder SetA_(int value) { + result.hasA_ = true; + result.a_ = value; + return this; + } + public Builder ClearA_() { + result.hasA_ = false; + result.a_ = 0; + return this; + } + } + static A() { + object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class B : pb::GeneratedMessage { + private static readonly B defaultInstance = new Builder().BuildPartial(); + private static readonly string[] _bFieldNames = new string[] { "B_" }; + private static readonly uint[] _bFieldTags = new uint[] { 8 }; + public static B DefaultInstance { + get { return defaultInstance; } + } + + public override B DefaultInstanceForType { + get { return defaultInstance; } + } + + protected override B ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_B__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_B__FieldAccessorTable; } + } + + public const int B_FieldNumber = 1; + private bool hasB_; + private int b_; + public bool HasB_ { + get { return hasB_; } + } + public int B_ { + get { return b_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _bFieldNames; + if (hasB_) { + output.WriteInt32(1, field_names[0], B_); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasB_) { + size += pb::CodedOutputStream.ComputeInt32Size(1, B_); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static B ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static B ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static B ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static B ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static B ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static B ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static B ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static B ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static B ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static B ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(B prototype) { + return (Builder) new Builder().MergeFrom(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() {} + + B result = new B(); + + protected override B MessageBeingBuilt { + get { return result; } + } + + public override Builder Clear() { + result = new B(); + return this; + } + + public override Builder Clone() { + return new Builder().MergeFrom(result); + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::UnitTest.Issues.TestProtos.B.Descriptor; } + } + + public override B DefaultInstanceForType { + get { return global::UnitTest.Issues.TestProtos.B.DefaultInstance; } + } + + public override B BuildPartial() { + if (result == null) { + throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + } + B returnMe = result; + result = null; + return returnMe; + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is B) { + return MergeFrom((B) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(B other) { + if (other == global::UnitTest.Issues.TestProtos.B.DefaultInstance) return this; + if (other.HasB_) { + B_ = other.B_; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_bFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _bFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.hasB_ = input.ReadInt32(ref result.b_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasB_ { + get { return result.hasB_; } + } + public int B_ { + get { return result.B_; } + set { SetB_(value); } + } + public Builder SetB_(int value) { + result.hasB_ = true; + result.b_ = value; + return this; + } + public Builder ClearB_() { + result.hasB_ = false; + result.b_ = 0; + return this; + } + } + static B() { + object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class AB : pb::GeneratedMessage { + private static readonly AB defaultInstance = new Builder().BuildPartial(); + private static readonly string[] _aBFieldNames = new string[] { "a_b" }; + private static readonly uint[] _aBFieldTags = new uint[] { 8 }; + public static AB DefaultInstance { + get { return defaultInstance; } + } + + public override AB DefaultInstanceForType { + get { return defaultInstance; } + } + + protected override AB ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_AB__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_AB__FieldAccessorTable; } + } + + public const int AB_FieldNumber = 1; + private bool hasAB_; + private int aB_; + public bool HasAB_ { + get { return hasAB_; } + } + public int AB_ { + get { return aB_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _aBFieldNames; + if (hasAB_) { + output.WriteInt32(1, field_names[0], AB_); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasAB_) { + size += pb::CodedOutputStream.ComputeInt32Size(1, AB_); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static AB ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static AB ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static AB ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static AB ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static AB ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static AB ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static AB ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static AB ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static AB ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static AB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(AB prototype) { + return (Builder) new Builder().MergeFrom(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() {} + + AB result = new AB(); + + protected override AB MessageBeingBuilt { + get { return result; } + } + + public override Builder Clear() { + result = new AB(); + return this; + } + + public override Builder Clone() { + return new Builder().MergeFrom(result); + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::UnitTest.Issues.TestProtos.AB.Descriptor; } + } + + public override AB DefaultInstanceForType { + get { return global::UnitTest.Issues.TestProtos.AB.DefaultInstance; } + } + + public override AB BuildPartial() { + if (result == null) { + throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + } + AB returnMe = result; + result = null; + return returnMe; + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is AB) { + return MergeFrom((AB) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(AB other) { + if (other == global::UnitTest.Issues.TestProtos.AB.DefaultInstance) return this; + if (other.HasAB_) { + AB_ = other.AB_; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_aBFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _aBFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.hasAB_ = input.ReadInt32(ref result.aB_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasAB_ { + get { return result.hasAB_; } + } + public int AB_ { + get { return result.AB_; } + set { SetAB_(value); } + } + public Builder SetAB_(int value) { + result.hasAB_ = true; + result.aB_ = value; + return this; + } + public Builder ClearAB_() { + result.hasAB_ = false; + result.aB_ = 0; + return this; + } + } + static AB() { + object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class NumberField : pb::GeneratedMessage { + private static readonly NumberField defaultInstance = new Builder().BuildPartial(); + private static readonly string[] _numberFieldFieldNames = new string[] { "_01" }; + private static readonly uint[] _numberFieldFieldTags = new uint[] { 8 }; + public static NumberField DefaultInstance { + get { return defaultInstance; } + } + + public override NumberField DefaultInstanceForType { + get { return defaultInstance; } + } + + protected override NumberField ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_NumberField__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.internal__static_unittest_issues_NumberField__FieldAccessorTable; } + } + + [global::System.CLSCompliant(false)] + public const int _01FieldNumber = 1; + private bool has_01; + private int _01_; + public bool Has_01 { + get { return has_01; } + } + [global::System.CLSCompliant(false)] + public int _01 { + get { return _01_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _numberFieldFieldNames; + if (has_01) { + output.WriteInt32(1, field_names[0], _01); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (has_01) { + size += pb::CodedOutputStream.ComputeInt32Size(1, _01); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static NumberField ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static NumberField ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static NumberField ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static NumberField ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static NumberField ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static NumberField ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static NumberField ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static NumberField ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static NumberField ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static NumberField ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(NumberField prototype) { + return (Builder) new Builder().MergeFrom(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() {} + + NumberField result = new NumberField(); + + protected override NumberField MessageBeingBuilt { + get { return result; } + } + + public override Builder Clear() { + result = new NumberField(); + return this; + } + + public override Builder Clone() { + return new Builder().MergeFrom(result); + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::UnitTest.Issues.TestProtos.NumberField.Descriptor; } + } + + public override NumberField DefaultInstanceForType { + get { return global::UnitTest.Issues.TestProtos.NumberField.DefaultInstance; } + } + + public override NumberField BuildPartial() { + if (result == null) { + throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + } + NumberField returnMe = result; + result = null; + return returnMe; + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is NumberField) { + return MergeFrom((NumberField) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(NumberField other) { + if (other == global::UnitTest.Issues.TestProtos.NumberField.DefaultInstance) return this; + if (other.Has_01) { + _01 = other._01; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_numberFieldFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _numberFieldFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.has_01 = input.ReadInt32(ref result._01_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool Has_01 { + get { return result.has_01; } + } + [global::System.CLSCompliant(false)] + public int _01 { + get { return result._01; } + set { Set_01(value); } + } + [global::System.CLSCompliant(false)] + public Builder Set_01(int value) { + result.has_01 = true; + result._01_ = value; + return this; + } + public Builder Clear_01() { + result.has_01 = false; + result._01_ = 0; + return this; + } + } + static NumberField() { + object.ReferenceEquals(global::UnitTest.Issues.TestProtos.UnitTestExtrasIssuesProtoFile.Descriptor, null); + } + } + + #endregion + +} diff --git a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs index 8653a0785b..6d9de74f2b 100644 --- a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs @@ -352,7 +352,12 @@ namespace Google.ProtocolBuffers.Descriptors public bool IsCLSCompliant { - get { return mappedType != MappedType.UInt32 && mappedType != MappedType.UInt64; } + get + { + return mappedType != MappedType.UInt32 && + mappedType != MappedType.UInt64 && + !NameHelpers.UnderscoresToPascalCase(Name).StartsWith("_"); + } } public int FieldNumber diff --git a/src/ProtocolBuffers/ICodedInputStream.cs b/src/ProtocolBuffers/ICodedInputStream.cs index f2360021e0..1d9d26e3a7 100644 --- a/src/ProtocolBuffers/ICodedInputStream.cs +++ b/src/ProtocolBuffers/ICodedInputStream.cs @@ -177,7 +177,7 @@ namespace Google.ProtocolBuffers /// /// Reads an array of primitive values into the list, if the wire-type of fieldTag is length-prefixed and the - /// type is numberic, it will read a packed array. + /// type is numeric, it will read a packed array. /// [CLSCompliant(false)] void ReadPrimitiveArray(FieldType fieldType, uint fieldTag, string fieldName, ICollection list); diff --git a/src/ProtocolBuffers/NameHelpers.cs b/src/ProtocolBuffers/NameHelpers.cs index cd8f2a79db..80a1f9aaeb 100644 --- a/src/ProtocolBuffers/NameHelpers.cs +++ b/src/ProtocolBuffers/NameHelpers.cs @@ -34,8 +34,8 @@ #endregion -using System.Globalization; -using System.Text; +using System; +using System.Text.RegularExpressions; namespace Google.ProtocolBuffers { @@ -44,69 +44,74 @@ namespace Google.ProtocolBuffers /// public class NameHelpers { + /// + /// All characters that are not alpha-numeric + /// + private static readonly Regex NonAlphaNumericCharacters = new Regex(@"[^a-zA-Z0-9]+"); + + /// + /// Matches lower-case character that follow either an underscore, or a number + /// + private static readonly Regex UnderscoreOrNumberWithLowerCase = new Regex(@"[0-9_][a-z]"); + + /// + /// Removes non alpha numeric characters while capitalizing letters that follow + /// a number or underscore. The first letter is always upper case. + /// public static string UnderscoresToPascalCase(string input) { - return UnderscoresToPascalOrCamelCase(input, true); + string name = UnderscoresToUpperCase(input); + + // Pascal case always begins with upper-case letter + if (Char.IsLower(name[0])) + { + char[] chars = name.ToCharArray(); + chars[0] = char.ToUpper(chars[0]); + return new string(chars); + } + return name; } + /// + /// Removes non alpha numeric characters while capitalizing letters that follow + /// a number or underscore. The first letter is always lower case. + /// public static string UnderscoresToCamelCase(string input) { - return UnderscoresToPascalOrCamelCase(input, false); + string name = UnderscoresToUpperCase(input); + + // Camel case always begins with lower-case letter + if (Char.IsUpper(name[0])) + { + char[] chars = name.ToCharArray(); + chars[0] = char.ToLower(chars[0]); + return new string(chars); + } + return name; } /// - /// Converts a string to Pascal or Camel case. The first letter is capitalized or - /// lower-cased depending on is true. - /// After the first letter, any punctuation is removed but triggers capitalization - /// of the next letter. Digits are preserved but trigger capitalization of the next - /// letter. - /// All capitalisation is done in the invariant culture. + /// Capitalizes any characters following an '_' or a number '0' - '9' and removes + /// all non alpha-numeric characters. If the resulting string begins with a number + /// an '_' will be prefixed. /// - private static string UnderscoresToPascalOrCamelCase(string input, bool pascal) + private static string UnderscoresToUpperCase(string input) { - StringBuilder result = new StringBuilder(); - bool capitaliseNext = pascal; - for (int i = 0; i < input.Length; i++) + string name = UnderscoreOrNumberWithLowerCase.Replace(input, x => x.Value.ToUpper()); + name = NonAlphaNumericCharacters.Replace(name, String.Empty); + + if (name.Length == 0) { - char c = input[i]; - if ('a' <= c && c <= 'z') - { - if (capitaliseNext) - { - result.Append(char.ToUpper(c, CultureInfo.InvariantCulture)); - } - else - { - result.Append(c); - } - capitaliseNext = false; - } - else if ('A' <= c && c <= 'Z') - { - if (i == 0 && !pascal) - { - // Force first letter to lower-case unless explicitly told to - // capitalize it. - result.Append(char.ToLower(c, CultureInfo.InvariantCulture)); - } - else - { - // Capital letters after the first are left as-is. - result.Append(c); - } - capitaliseNext = false; - } - else if ('0' <= c && c <= '9') - { - result.Append(c); - capitaliseNext = true; - } - else - { - capitaliseNext = true; - } + throw new ArgumentException(String.Format("The field name '{0}' is invalid.", input)); } - return result.ToString(); + + // Fields can not start with a number + if (Char.IsNumber(name[0])) + { + name = '_' + name; + } + + return name; } internal static string StripProto(string text) diff --git a/src/ProtocolBuffers2008.sln b/src/ProtocolBuffers2008.sln index fc0bf81d8f..6ef7bb4d8b 100644 --- a/src/ProtocolBuffers2008.sln +++ b/src/ProtocolBuffers2008.sln @@ -23,6 +23,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unittest", "unittest", "{C8 ..\protos\extest\unittest_generic_services.proto = ..\protos\extest\unittest_generic_services.proto ..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto ..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto + ..\protos\extest\unittest_issues.proto = ..\protos\extest\unittest_issues.proto ..\protos\google\protobuf\unittest_lite.proto = ..\protos\google\protobuf\unittest_lite.proto ..\protos\google\protobuf\unittest_lite_imports_nonlite.proto = ..\protos\google\protobuf\unittest_lite_imports_nonlite.proto ..\protos\google\protobuf\unittest_mset.proto = ..\protos\google\protobuf\unittest_mset.proto @@ -67,7 +68,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{66ED1950 ..\build\RunBenchmarks.bat = ..\build\RunBenchmarks.bat EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers.Serialization", "ProtocolBuffers.Serialization\ProtocolBuffers.Serialization.csproj", "{231391AF-449C-4a39-986C-AD7F270F4750}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers.Serialization", "ProtocolBuffers.Serialization\ProtocolBuffers.Serialization.csproj", "{231391AF-449C-4A39-986C-AD7F270F4750}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -147,14 +148,10 @@ Global {EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU {EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU {EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Debug_Silverlight2|Any CPU.Build.0 = Debug_Silverlight2|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Debug|Any CPU.Build.0 = Debug|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Release_Silverlight2|Any CPU.Build.0 = Release_Silverlight2|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Release|Any CPU.ActiveCfg = Release|Any CPU - {231391AF-449C-4a39-986C-AD7F270F4750}.Release|Any CPU.Build.0 = Release|Any CPU + {231391AF-449C-4A39-986C-AD7F270F4750}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU + {231391AF-449C-4A39-986C-AD7F270F4750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {231391AF-449C-4A39-986C-AD7F270F4750}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU + {231391AF-449C-4A39-986C-AD7F270F4750}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE