From 1a0764ab27ae7189ae4b2b8a1d9f7a0599568282 Mon Sep 17 00:00:00 2001 From: csharptest Date: Fri, 9 Sep 2011 21:05:29 -0500 Subject: First pass at implementation and testing of reusable builders. --- .../UnitTestXmlSerializerTestProtoFile.cs | 352 ++++++++++++++++----- 1 file changed, 281 insertions(+), 71 deletions(-) (limited to 'src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs') diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs index 3d818a60..c0e53348 100644 --- a/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs +++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs @@ -261,7 +261,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(TestXmlChild prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -271,21 +271,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new TestXmlChild(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(TestXmlChild cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - TestXmlChild result = new TestXmlChild(); + bool builderIsReadOnly; + TestXmlChild result; + + private TestXmlChild PrepareBuilder() { + if (builderIsReadOnly) { + TestXmlChild original = result; + result = new TestXmlChild(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override TestXmlChild MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new TestXmlChild(); + result = DefaultInstance ?? new TestXmlChild(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -297,13 +324,12 @@ namespace Google.ProtocolBuffers.TestProtos { } public override TestXmlChild BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } result.options_.MakeReadOnly(); - TestXmlChild returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -317,6 +343,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestXmlChild other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) return this; + PrepareBuilder(); if (other.options_.Count != 0) { base.AddRange(other.options_, result.options_); } @@ -332,6 +359,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -394,7 +422,7 @@ namespace Google.ProtocolBuffers.TestProtos { public pbc::IPopsicleList OptionsList { - get { return result.options_; } + get { return PrepareBuilder().options_; } } public int OptionsCount { get { return result.OptionsCount; } @@ -403,18 +431,22 @@ namespace Google.ProtocolBuffers.TestProtos { return result.GetOptions(index); } public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) { + PrepareBuilder(); result.options_[index] = value; return this; } public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) { + PrepareBuilder(); result.options_.Add(value); return this; } public Builder AddRangeOptions(scg::IEnumerable values) { + PrepareBuilder(); base.AddRange(values, result.options_); return this; } public Builder ClearOptions() { + PrepareBuilder(); result.options_.Clear(); return this; } @@ -428,11 +460,13 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetBinary(pb::ByteString value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.hasBinary = true; result.binary_ = value; return this; } public Builder ClearBinary() { + PrepareBuilder(); result.hasBinary = false; result.binary_ = pb::ByteString.Empty; return this; @@ -529,7 +563,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(TestXmlNoFields prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -539,21 +573,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new TestXmlNoFields(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(TestXmlNoFields cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - TestXmlNoFields result = new TestXmlNoFields(); + bool builderIsReadOnly; + TestXmlNoFields result; + + private TestXmlNoFields PrepareBuilder() { + if (builderIsReadOnly) { + TestXmlNoFields original = result; + result = new TestXmlNoFields(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override TestXmlNoFields MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new TestXmlNoFields(); + result = DefaultInstance ?? new TestXmlNoFields(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -565,12 +626,11 @@ namespace Google.ProtocolBuffers.TestProtos { } public override TestXmlNoFields BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } - TestXmlNoFields returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -584,6 +644,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestXmlNoFields other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.DefaultInstance) return this; + PrepareBuilder(); this.MergeUnknownFields(other.UnknownFields); return this; } @@ -593,6 +654,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -743,7 +805,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(TestXmlRescursive prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -753,21 +815,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new TestXmlRescursive(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(TestXmlRescursive cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - TestXmlRescursive result = new TestXmlRescursive(); + bool builderIsReadOnly; + TestXmlRescursive result; + + private TestXmlRescursive PrepareBuilder() { + if (builderIsReadOnly) { + TestXmlRescursive original = result; + result = new TestXmlRescursive(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override TestXmlRescursive MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new TestXmlRescursive(); + result = DefaultInstance ?? new TestXmlRescursive(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -779,12 +868,11 @@ namespace Google.ProtocolBuffers.TestProtos { } public override TestXmlRescursive BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } - TestXmlRescursive returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -798,6 +886,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestXmlRescursive other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance) return this; + PrepareBuilder(); if (other.HasChild) { MergeChild(other.Child); } @@ -810,6 +899,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -871,18 +961,21 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.hasChild = true; result.child_ = value; return this; } public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.Builder builderForValue) { pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); result.hasChild = true; result.child_ = builderForValue.Build(); return this; } public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); if (result.hasChild && result.child_ != global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance) { result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.CreateBuilder(result.child_).MergeFrom(value).BuildPartial(); @@ -893,6 +986,7 @@ namespace Google.ProtocolBuffers.TestProtos { return this; } public Builder ClearChild() { + PrepareBuilder(); result.hasChild = false; result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlRescursive.DefaultInstance; return this; @@ -1062,7 +1156,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(Children prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -1072,21 +1166,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new Children(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(Children cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - Children result = new Children(); + bool builderIsReadOnly; + Children result; + + private Children PrepareBuilder() { + if (builderIsReadOnly) { + Children original = result; + result = new Children(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override Children MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new Children(); + result = DefaultInstance ?? new Children(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -1098,13 +1219,12 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Children BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } result.options_.MakeReadOnly(); - Children returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -1118,6 +1238,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(Children other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.DefaultInstance) return this; + PrepareBuilder(); if (other.options_.Count != 0) { base.AddRange(other.options_, result.options_); } @@ -1133,6 +1254,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -1195,7 +1317,7 @@ namespace Google.ProtocolBuffers.TestProtos { public pbc::IPopsicleList OptionsList { - get { return result.options_; } + get { return PrepareBuilder().options_; } } public int OptionsCount { get { return result.OptionsCount; } @@ -1204,18 +1326,22 @@ namespace Google.ProtocolBuffers.TestProtos { return result.GetOptions(index); } public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) { + PrepareBuilder(); result.options_[index] = value; return this; } public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) { + PrepareBuilder(); result.options_.Add(value); return this; } public Builder AddRangeOptions(scg::IEnumerable values) { + PrepareBuilder(); base.AddRange(values, result.options_); return this; } public Builder ClearOptions() { + PrepareBuilder(); result.options_.Clear(); return this; } @@ -1229,11 +1355,13 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetBinary(pb::ByteString value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.hasBinary = true; result.binary_ = value; return this; } public Builder ClearBinary() { + PrepareBuilder(); result.hasBinary = false; result.binary_ = pb::ByteString.Empty; return this; @@ -1438,7 +1566,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(TestXmlMessage prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -1448,21 +1576,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new TestXmlMessage(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(TestXmlMessage cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - TestXmlMessage result = new TestXmlMessage(); + bool builderIsReadOnly; + TestXmlMessage result; + + private TestXmlMessage PrepareBuilder() { + if (builderIsReadOnly) { + TestXmlMessage original = result; + result = new TestXmlMessage(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override TestXmlMessage MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new TestXmlMessage(); + result = DefaultInstance ?? new TestXmlMessage(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -1474,15 +1629,14 @@ namespace Google.ProtocolBuffers.TestProtos { } public override TestXmlMessage BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } result.numbers_.MakeReadOnly(); result.textlines_.MakeReadOnly(); result.children_.MakeReadOnly(); - TestXmlMessage returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -1496,6 +1650,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestXmlMessage other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.DefaultInstance) return this; + PrepareBuilder(); if (other.HasNumber) { Number = other.Number; } @@ -1527,6 +1682,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -1612,18 +1768,20 @@ namespace Google.ProtocolBuffers.TestProtos { set { SetNumber(value); } } public Builder SetNumber(long value) { + PrepareBuilder(); result.hasNumber = true; result.number_ = value; return this; } public Builder ClearNumber() { + PrepareBuilder(); result.hasNumber = false; result.number_ = 0L; return this; } public pbc::IPopsicleList NumbersList { - get { return result.numbers_; } + get { return PrepareBuilder().numbers_; } } public int NumbersCount { get { return result.NumbersCount; } @@ -1632,18 +1790,22 @@ namespace Google.ProtocolBuffers.TestProtos { return result.GetNumbers(index); } public Builder SetNumbers(int index, int value) { + PrepareBuilder(); result.numbers_[index] = value; return this; } public Builder AddNumbers(int value) { + PrepareBuilder(); result.numbers_.Add(value); return this; } public Builder AddRangeNumbers(scg::IEnumerable values) { + PrepareBuilder(); base.AddRange(values, result.numbers_); return this; } public Builder ClearNumbers() { + PrepareBuilder(); result.numbers_.Clear(); return this; } @@ -1657,18 +1819,20 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetText(string value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.hasText = true; result.text_ = value; return this; } public Builder ClearText() { + PrepareBuilder(); result.hasText = false; result.text_ = ""; return this; } public pbc::IPopsicleList TextlinesList { - get { return result.textlines_; } + get { return PrepareBuilder().textlines_; } } public int TextlinesCount { get { return result.TextlinesCount; } @@ -1678,19 +1842,23 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetTextlines(int index, string value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.textlines_[index] = value; return this; } public Builder AddTextlines(string value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.textlines_.Add(value); return this; } public Builder AddRangeTextlines(scg::IEnumerable values) { + PrepareBuilder(); base.AddRange(values, result.textlines_); return this; } public Builder ClearTextlines() { + PrepareBuilder(); result.textlines_.Clear(); return this; } @@ -1703,11 +1871,13 @@ namespace Google.ProtocolBuffers.TestProtos { set { SetValid(value); } } public Builder SetValid(bool value) { + PrepareBuilder(); result.hasValid = true; result.valid_ = value; return this; } public Builder ClearValid() { + PrepareBuilder(); result.hasValid = false; result.valid_ = false; return this; @@ -1722,18 +1892,21 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.hasChild = true; result.child_ = value; return this; } public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder builderForValue) { pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); result.hasChild = true; result.child_ = builderForValue.Build(); return this; } public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); if (result.hasChild && result.child_ != global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) { result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.CreateBuilder(result.child_).MergeFrom(value).BuildPartial(); @@ -1744,13 +1917,14 @@ namespace Google.ProtocolBuffers.TestProtos { return this; } public Builder ClearChild() { + PrepareBuilder(); result.hasChild = false; result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance; return this; } public pbc::IPopsicleList ChildrenList { - get { return result.children_; } + get { return PrepareBuilder().children_; } } public int ChildrenCount { get { return result.ChildrenCount; } @@ -1760,29 +1934,35 @@ namespace Google.ProtocolBuffers.TestProtos { } public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.children_[index] = value; return this; } public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) { pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); result.children_[index] = builderForValue.Build(); return this; } public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) { pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); result.children_.Add(value); return this; } public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) { pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); result.children_.Add(builderForValue.Build()); return this; } public Builder AddRangeChildren(scg::IEnumerable values) { + PrepareBuilder(); base.AddRange(values, result.children_); return this; } public Builder ClearChildren() { + PrepareBuilder(); result.children_.Clear(); return this; } @@ -1895,7 +2075,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(TestXmlExtension prototype) { - return (Builder) new Builder().MergeFrom(prototype); + return new Builder(prototype); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -1905,21 +2085,48 @@ namespace Google.ProtocolBuffers.TestProtos { protected override Builder ThisBuilder { get { return this; } } - public Builder() {} + public Builder() { + result = DefaultInstance ?? new TestXmlExtension(); + builderIsReadOnly = result == DefaultInstance; + } + internal Builder(TestXmlExtension cloneFrom) { + result = cloneFrom; + builderIsReadOnly = true; + } - TestXmlExtension result = new TestXmlExtension(); + bool builderIsReadOnly; + TestXmlExtension result; + + private TestXmlExtension PrepareBuilder() { + if (builderIsReadOnly) { + TestXmlExtension original = result; + result = new TestXmlExtension(); + builderIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } protected override TestXmlExtension MessageBeingBuilt { - get { return result; } + get { return PrepareBuilder(); } } public override Builder Clear() { - result = new TestXmlExtension(); + result = DefaultInstance ?? new TestXmlExtension(); + builderIsReadOnly = true; return this; } public override Builder Clone() { - return new Builder().MergeFrom(result); + if (builderIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } } public override pbd::MessageDescriptor DescriptorForType { @@ -1931,12 +2138,11 @@ namespace Google.ProtocolBuffers.TestProtos { } public override TestXmlExtension BuildPartial() { - if (result == null) { - throw new global::System.InvalidOperationException("build() has already been called on this Builder"); + if (builderIsReadOnly) { + return result; } - TestXmlExtension returnMe = result; - result = null; - return returnMe; + builderIsReadOnly = true; + return result; } public override Builder MergeFrom(pb::IMessage other) { @@ -1950,6 +2156,7 @@ namespace Google.ProtocolBuffers.TestProtos { public override Builder MergeFrom(TestXmlExtension other) { if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.DefaultInstance) return this; + PrepareBuilder(); if (other.HasNumber) { Number = other.Number; } @@ -1962,6 +2169,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); pb::UnknownFieldSet.Builder unknownFields = null; uint tag; string field_name; @@ -2017,11 +2225,13 @@ namespace Google.ProtocolBuffers.TestProtos { set { SetNumber(value); } } public Builder SetNumber(int value) { + PrepareBuilder(); result.hasNumber = true; result.number_ = value; return this; } public Builder ClearNumber() { + PrepareBuilder(); result.hasNumber = false; result.number_ = 0; return this; -- cgit v1.2.3