diff options
7 files changed, 23 insertions, 9 deletions
diff --git a/src/ProtoGen/MessageGenerator.cs b/src/ProtoGen/MessageGenerator.cs index 1e10ce6c..efd02db1 100644 --- a/src/ProtoGen/MessageGenerator.cs +++ b/src/ProtoGen/MessageGenerator.cs @@ -351,6 +351,10 @@ namespace Google.ProtocolBuffers.ProtoGen { foreach (FieldDescriptor field in Descriptor.Fields) { SourceGenerators.CreateFieldGenerator(field).GenerateMergingCode(writer); } + // if message type has extensions + if (Descriptor.Proto.ExtensionRangeCount > 0) { + writer.WriteLine(" this.MergeExtensionFields(other);"); + } writer.WriteLine("this.MergeUnknownFields(other.UnknownFields);"); writer.WriteLine("return this;"); writer.Outdent(); diff --git a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs index 5d0a9291..80923ca0 100644 --- a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs +++ b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs @@ -313,7 +313,6 @@ namespace Google.ProtocolBuffers { .GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension)); } - /* Reinstate this test in the commit where it's fixed... [Test] public void ExtensionMergeFrom() { TestAllExtensions original = TestAllExtensions.CreateBuilder() @@ -322,8 +321,7 @@ namespace Google.ProtocolBuffers { TestAllExtensions.CreateBuilder().MergeFrom(original).Build(); Assert.IsTrue((merged.HasExtension(UnitTestProtoFile.OptionalInt32Extension))); Assert.AreEqual(1, (int)merged.GetExtension(UnitTestProtoFile.OptionalInt32Extension)); - } - */ + } /* Removed multiple files option for the moment [Test] diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs index 796d74a8..88e10f6c 100644 --- a/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs +++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs @@ -194,6 +194,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestMessageSet other) { if (other == TestMessageSet.DefaultInstance) return this; + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs index 17501997..3d3e699c 100644 --- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs +++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs @@ -4884,6 +4884,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestAllExtensions other) { if (other == TestAllExtensions.DefaultInstance) return this; + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -7597,6 +7598,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestEmptyMessageWithExtensions other) { if (other == TestEmptyMessageWithExtensions.DefaultInstance) return this; + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -10714,6 +10716,7 @@ namespace Google.ProtocolBuffers.TestProtos { if (other.HasMyFloat) { MyFloat = other.MyFloat; } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } diff --git a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs index 67fdf966..4206f261 100644 --- a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs +++ b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs @@ -3936,6 +3936,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -4273,6 +4274,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -4565,6 +4567,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -4839,6 +4842,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -5063,6 +5067,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -5287,6 +5292,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -5511,6 +5517,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { if (other.uninterpretedOption_.Count != 0) { base.AddRange(other.uninterpretedOption_, result.uninterpretedOption_); } + this.MergeExtensionFields(other); this.MergeUnknownFields(other.UnknownFields); return this; } diff --git a/src/ProtocolBuffers/DynamicMessage.cs b/src/ProtocolBuffers/DynamicMessage.cs index 812be1c8..b740013b 100644 --- a/src/ProtocolBuffers/DynamicMessage.cs +++ b/src/ProtocolBuffers/DynamicMessage.cs @@ -284,15 +284,12 @@ namespace Google.ProtocolBuffers { throw new ArgumentException("MergeFrom(IMessage) can only merge messages of the same type."); } fields.MergeFrom(other); + MergeUnknownFields(other.UnknownFields); return this; } public override Builder MergeFrom(DynamicMessage other) { - if (other.DescriptorForType != type) { - throw new ArgumentException("MergeFrom(IMessage) can only merge messages of the same type."); - } - fields.MergeFrom(other); - return this; + return MergeFrom((IMessage)other); } public override DynamicMessage Build() { diff --git a/src/ProtocolBuffers/ExtendableBuilder.cs b/src/ProtocolBuffers/ExtendableBuilder.cs index 7f4461cb..b88f2994 100644 --- a/src/ProtocolBuffers/ExtendableBuilder.cs +++ b/src/ProtocolBuffers/ExtendableBuilder.cs @@ -159,12 +159,16 @@ namespace Google.ProtocolBuffers { public override TBuilder AddRepeatedField(FieldDescriptor field, object value) { if (field.IsExtension) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; - message.VerifyContainingType(field); + message.VerifyContainingType(field); message.Extensions.AddRepeatedField(field, value); return ThisBuilder; } else { return base.AddRepeatedField(field, value); } } + + protected void MergeExtensionFields(ExtendableMessage<TMessage, TBuilder> other) { + MessageBeingBuilt.Extensions.MergeFrom(other.Extensions); + } } } |