Commit 1a0764ab authored by csharptest's avatar csharptest Committed by rogerk

First pass at implementation and testing of reusable builders.

parent 8f0dcf3d
This diff is collapsed.
...@@ -70,11 +70,13 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -70,11 +70,13 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("}"); writer.WriteLine("}");
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = true;", PropertyName); writer.WriteLine(" result.has{0} = true;", PropertyName);
writer.WriteLine(" result.{0}_ = value;", Name); writer.WriteLine(" result.{0}_ = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = false;", PropertyName); writer.WriteLine(" result.has{0} = false;", PropertyName);
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
......
...@@ -68,18 +68,21 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -68,18 +68,21 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = true;", PropertyName); writer.WriteLine(" result.has{0} = true;", PropertyName);
writer.WriteLine(" result.{0}_ = value;", Name); writer.WriteLine(" result.{0}_ = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Set{0}({1}.Builder builderForValue) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}({1}.Builder builderForValue) {{", PropertyName, TypeName);
AddNullCheck(writer, "builderForValue"); AddNullCheck(writer, "builderForValue");
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = true;", PropertyName); writer.WriteLine(" result.has{0} = true;", PropertyName);
writer.WriteLine(" result.{0}_ = builderForValue.Build();", Name); writer.WriteLine(" result.{0}_ = builderForValue.Build();", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Merge{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Merge{0}({1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" if (result.has{0} &&", PropertyName); writer.WriteLine(" if (result.has{0} &&", PropertyName);
writer.WriteLine(" result.{0}_ != {1}) {{", Name, DefaultValue); writer.WriteLine(" result.{0}_ != {1}) {{", Name, DefaultValue);
writer.WriteLine(" result.{0}_ = {1}.CreateBuilder(result.{0}_).MergeFrom(value).BuildPartial();", Name, writer.WriteLine(" result.{0}_ = {1}.CreateBuilder(result.{0}_).MergeFrom(value).BuildPartial();", Name,
...@@ -91,6 +94,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -91,6 +94,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = false;", PropertyName); writer.WriteLine(" result.has{0} = false;", PropertyName);
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
......
...@@ -551,7 +551,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -551,7 +551,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("public override Builder ToBuilder() { return CreateBuilder(this); }"); writer.WriteLine("public override Builder ToBuilder() { return CreateBuilder(this); }");
writer.WriteLine("public override Builder CreateBuilderForType() { return new Builder(); }"); writer.WriteLine("public override Builder CreateBuilderForType() { return new Builder(); }");
writer.WriteLine("public static Builder CreateBuilder({0} prototype) {{", ClassName); writer.WriteLine("public static Builder CreateBuilder({0} prototype) {{", ClassName);
writer.WriteLine(" return (Builder) new Builder().MergeFrom(prototype);"); writer.WriteLine(" return new Builder(prototype);");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]");
...@@ -582,21 +582,52 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -582,21 +582,52 @@ namespace Google.ProtocolBuffers.ProtoGen
private void GenerateCommonBuilderMethods(TextGenerator writer) private void GenerateCommonBuilderMethods(TextGenerator writer)
{ {
writer.WriteLine("public Builder() {{}}", ClassAccessLevel); //default constructor
writer.WriteLine("public Builder() {");
//Durring static initialization of message, DefaultInstance is expected to return null.
writer.WriteLine(" result = DefaultInstance ?? new {0}();", ClassName);
writer.WriteLine(" builderIsReadOnly = result == DefaultInstance;");
writer.WriteLine("}");
//clone constructor
writer.WriteLine("internal Builder({0} cloneFrom) {{", ClassName);
writer.WriteLine(" result = cloneFrom;");
writer.WriteLine(" builderIsReadOnly = true;");
writer.WriteLine("}");
writer.WriteLine();
writer.WriteLine("bool builderIsReadOnly;");
writer.WriteLine("{0} result;", ClassName);
writer.WriteLine();
writer.WriteLine("private {0} PrepareBuilder() {{", ClassName);
writer.WriteLine(" if (builderIsReadOnly) {");
writer.WriteLine(" {0} original = result;", ClassName);
writer.WriteLine(" result = new {0}();", ClassName);
writer.WriteLine(" builderIsReadOnly = false;");
writer.WriteLine(" MergeFrom(original);");
writer.WriteLine(" }");
writer.WriteLine(" return result;");
writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("{0} result = new {0}();", ClassName); writer.WriteLine("public override bool IsInitialized {");
writer.WriteLine(" get { return result.IsInitialized; }");
writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("protected override {0} MessageBeingBuilt {{", ClassName); writer.WriteLine("protected override {0} MessageBeingBuilt {{", ClassName);
writer.WriteLine(" get { return result; }"); writer.WriteLine(" get { return PrepareBuilder(); }");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
//Not actually expecting that DefaultInstance would ever be null here; however, we will ensure it does not break
writer.WriteLine("public override Builder Clear() {"); writer.WriteLine("public override Builder Clear() {");
writer.WriteLine(" result = new {0}();", ClassName); writer.WriteLine(" result = DefaultInstance ?? new {0}();", ClassName);
writer.WriteLine(" builderIsReadOnly = true;");
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("public override Builder Clone() {"); writer.WriteLine("public override Builder Clone() {");
writer.WriteLine(" return new Builder().MergeFrom(result);"); writer.WriteLine(" if (builderIsReadOnly) {");
writer.WriteLine(" return new Builder(result);");
writer.WriteLine(" } else {");
writer.WriteLine(" return new Builder().MergeFrom(result);");
writer.WriteLine(" }");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
if (!UseLiteRuntime) if (!UseLiteRuntime)
...@@ -613,17 +644,15 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -613,17 +644,15 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("public override {0} BuildPartial() {{", ClassName); writer.WriteLine("public override {0} BuildPartial() {{", ClassName);
writer.Indent(); writer.Indent();
writer.WriteLine("if (result == null) {"); writer.WriteLine("if (builderIsReadOnly) {");
writer.WriteLine( writer.WriteLine(" return result;");
" throw new global::System.InvalidOperationException(\"build() has already been called on this Builder\");");
writer.WriteLine("}"); writer.WriteLine("}");
foreach (FieldDescriptor field in Descriptor.Fields) foreach (FieldDescriptor field in Descriptor.Fields)
{ {
CreateFieldGenerator(field).GenerateBuildingCode(writer); CreateFieldGenerator(field).GenerateBuildingCode(writer);
} }
writer.WriteLine("{0} returnMe = result;", ClassName); writer.WriteLine("builderIsReadOnly = true;");
writer.WriteLine("result = null;"); writer.WriteLine("return result;");
writer.WriteLine("return returnMe;");
writer.Outdent(); writer.Outdent();
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
...@@ -644,6 +673,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -644,6 +673,7 @@ namespace Google.ProtocolBuffers.ProtoGen
// fields are set so we can skip the merge. // fields are set so we can skip the merge.
writer.Indent(); writer.Indent();
writer.WriteLine("if (other == {0}.DefaultInstance) return this;", FullClassName); writer.WriteLine("if (other == {0}.DefaultInstance) return this;", FullClassName);
writer.WriteLine("PrepareBuilder();");
foreach (FieldDescriptor field in Descriptor.Fields) foreach (FieldDescriptor field in Descriptor.Fields)
{ {
CreateFieldGenerator(field).GenerateMergingCode(writer); CreateFieldGenerator(field).GenerateMergingCode(writer);
...@@ -676,6 +706,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -676,6 +706,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine( writer.WriteLine(
"public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {"); "public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {");
writer.Indent(); writer.Indent();
writer.WriteLine("PrepareBuilder();");
if (!UseLiteRuntime) if (!UseLiteRuntime)
{ {
writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = null;"); writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = null;");
......
...@@ -72,11 +72,13 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -72,11 +72,13 @@ namespace Google.ProtocolBuffers.ProtoGen
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = true;", PropertyName); writer.WriteLine(" result.has{0} = true;", PropertyName);
writer.WriteLine(" result.{0}_ = value;", Name); writer.WriteLine(" result.{0}_ = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.has{0} = false;", PropertyName); writer.WriteLine(" result.has{0} = false;", PropertyName);
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
......
...@@ -71,7 +71,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -71,7 +71,7 @@ namespace Google.ProtocolBuffers.ProtoGen
// Note: We can return the original list here, because we make it unmodifiable when we build // Note: We can return the original list here, because we make it unmodifiable when we build
// We return it via IPopsicleList so that collection initializers work more pleasantly. // We return it via IPopsicleList so that collection initializers work more pleasantly.
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName);
writer.WriteLine(" get {{ return result.{0}_; }}", Name); writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name);
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public int {0}Count {{", PropertyName); writer.WriteLine("public int {0}Count {{", PropertyName);
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName);
...@@ -80,18 +80,22 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -80,18 +80,22 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(" return result.Get{0}(index);", PropertyName); writer.WriteLine(" return result.Get{0}(index);", PropertyName);
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_[index] = value;", Name); writer.WriteLine(" result.{0}_[index] = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" base.AddRange(values, result.{0}_);", Name); writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Clear();", Name); writer.WriteLine(" result.{0}_.Clear();", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
......
...@@ -67,7 +67,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -67,7 +67,7 @@ namespace Google.ProtocolBuffers.ProtoGen
// Note: We can return the original list here, because we make it unmodifiable when we build // Note: We can return the original list here, because we make it unmodifiable when we build
// We return it via IPopsicleList so that collection initializers work more pleasantly. // We return it via IPopsicleList so that collection initializers work more pleasantly.
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName);
writer.WriteLine(" get {{ return result.{0}_; }}", Name); writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name);
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public int {0}Count {{", PropertyName); writer.WriteLine("public int {0}Count {{", PropertyName);
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName);
...@@ -77,31 +77,37 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -77,31 +77,37 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_[index] = value;", Name); writer.WriteLine(" result.{0}_[index] = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
// Extra overload for builder (just on messages) // Extra overload for builder (just on messages)
writer.WriteLine("public Builder Set{0}(int index, {1}.Builder builderForValue) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}(int index, {1}.Builder builderForValue) {{", PropertyName, TypeName);
AddNullCheck(writer, "builderForValue"); AddNullCheck(writer, "builderForValue");
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_[index] = builderForValue.Build();", Name); writer.WriteLine(" result.{0}_[index] = builderForValue.Build();", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
// Extra overload for builder (just on messages) // Extra overload for builder (just on messages)
writer.WriteLine("public Builder Add{0}({1}.Builder builderForValue) {{", PropertyName, TypeName); writer.WriteLine("public Builder Add{0}({1}.Builder builderForValue) {{", PropertyName, TypeName);
AddNullCheck(writer, "builderForValue"); AddNullCheck(writer, "builderForValue");
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Add(builderForValue.Build());", Name); writer.WriteLine(" result.{0}_.Add(builderForValue.Build());", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" base.AddRange(values, result.{0}_);", Name); writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Clear();", Name); writer.WriteLine(" result.{0}_.Clear();", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
......
...@@ -74,7 +74,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -74,7 +74,7 @@ namespace Google.ProtocolBuffers.ProtoGen
// We return it via IPopsicleList so that collection initializers work more pleasantly. // We return it via IPopsicleList so that collection initializers work more pleasantly.
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName);
writer.WriteLine(" get {{ return result.{0}_; }}", Name); writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name);
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public int {0}Count {{", PropertyName); writer.WriteLine("public int {0}Count {{", PropertyName);
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName);
...@@ -86,21 +86,25 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -86,21 +86,25 @@ namespace Google.ProtocolBuffers.ProtoGen
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_[index] = value;", Name); writer.WriteLine(" result.{0}_[index] = value;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName);
AddNullCheck(writer); AddNullCheck(writer);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
AddClsComplianceCheck(writer); AddClsComplianceCheck(writer);
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" base.AddRange(values, result.{0}_);", Name); writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();");
writer.WriteLine(" result.{0}_.Clear();", Name); writer.WriteLine(" result.{0}_.Clear();", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
......
...@@ -111,22 +111,6 @@ namespace Google.ProtocolBuffers ...@@ -111,22 +111,6 @@ namespace Google.ProtocolBuffers
} }
} }
[Test]
public void DoubleBuildError()
{
TestAllTypes.Builder builder = new TestAllTypes.Builder();
builder.Build();
try
{
builder.Build();
Assert.Fail("Should have thrown exception.");
}
catch (InvalidOperationException)
{
// Success.
}
}
[Test] [Test]
public void DefaultInstance() public void DefaultInstance()
{ {
......
...@@ -105,6 +105,7 @@ ...@@ -105,6 +105,7 @@
<Compile Include="NameHelpersTest.cs" /> <Compile Include="NameHelpersTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ReflectionTester.cs" /> <Compile Include="ReflectionTester.cs" />
<Compile Include="ReusableBuilderTest.cs" />
<Compile Include="ServiceTest.cs" /> <Compile Include="ServiceTest.cs" />
<Compile Include="TestProtos\UnitTestCSharpOptionsProtoFile.cs" /> <Compile Include="TestProtos\UnitTestCSharpOptionsProtoFile.cs" />
<Compile Include="TestProtos\UnitTestCustomOptionsProtoFile.cs" /> <Compile Include="TestProtos\UnitTestCustomOptionsProtoFile.cs" />
......
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using Google.ProtocolBuffers.TestProtos;
namespace Google.ProtocolBuffers
{
[TestFixture]
public class ReusableBuilderTest
{
[Test]
public void TestUnmodifiedDefaultInstance()
{
//Simply calling ToBuilder().Build() no longer creates a copy of the message
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void BuildMultipleWithoutChange()
{
//Calling Build() or BuildPartial() does not require a copy of the message
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
builder.SetDefaultBool(true);
TestAllTypes first = builder.BuildPartial();
//Still the same instance?
Assert.IsTrue(ReferenceEquals(first, builder.Build()));
//Still the same instance?
Assert.IsTrue(ReferenceEquals(first, builder.BuildPartial().ToBuilder().Build()));
}
[Test]
public void MergeFromDefaultInstance()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.MergeFrom(TestAllTypes.DefaultInstance);
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void BuildNewBuilderIsDefaultInstance()
{
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, new TestAllTypes.Builder().Build()));
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().Build()));
//last test, if you clear a builder it reverts to default instance
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance,
TestAllTypes.CreateBuilder().SetOptionalBool(true).Build().ToBuilder().Clear().Build()));
}
[Test]
public void CloneOnChangePrimitive()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.SetDefaultBool(true);
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnAddRepeatedBool()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.AddRepeatedBool(true);
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnChangeMessage()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.SetOptionalForeignMessage(new ForeignMessage.Builder());
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnClearMessage()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.ClearOptionalForeignMessage();
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnAddRepeatedForeignMessage()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.AddRepeatedForeignMessage(ForeignMessage.DefaultInstance);
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnChangeEnumValue()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.SetOptionalForeignEnum(ForeignEnum.FOREIGN_BAR);
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
[Test]
public void CloneOnAddRepeatedForeignEnum()
{
TestAllTypes.Builder builder = TestAllTypes.DefaultInstance.ToBuilder();
Assert.IsTrue(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
builder.AddRepeatedForeignEnum(ForeignEnum.FOREIGN_BAR);
Assert.IsFalse(ReferenceEquals(TestAllTypes.DefaultInstance, builder.Build()));
}
}
}
...@@ -190,7 +190,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -190,7 +190,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(OptionsMessage prototype) { public static Builder CreateBuilder(OptionsMessage prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -200,21 +200,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -200,21 +200,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new OptionsMessage();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(OptionsMessage cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
OptionsMessage result;
OptionsMessage result = new OptionsMessage(); private OptionsMessage PrepareBuilder() {
if (builderIsReadOnly) {
OptionsMessage original = result;
result = new OptionsMessage();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override OptionsMessage MessageBeingBuilt { protected override OptionsMessage MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new OptionsMessage(); result = DefaultInstance ?? new OptionsMessage();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { 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 { public override pbd::MessageDescriptor DescriptorForType {
...@@ -226,12 +253,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -226,12 +253,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override OptionsMessage BuildPartial() { public override OptionsMessage BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
OptionsMessage returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -245,6 +271,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -245,6 +271,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(OptionsMessage other) { public override Builder MergeFrom(OptionsMessage other) {
if (other == global::Google.ProtocolBuffers.TestProtos.OptionsMessage.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.OptionsMessage.DefaultInstance) return this;
PrepareBuilder();
if (other.HasNormal) { if (other.HasNormal) {
Normal = other.Normal; Normal = other.Normal;
} }
...@@ -263,6 +290,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -263,6 +290,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
pb::UnknownFieldSet.Builder unknownFields = null; pb::UnknownFieldSet.Builder unknownFields = null;
uint tag; uint tag;
string field_name; string field_name;
...@@ -327,11 +355,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -327,11 +355,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetNormal(string value) { public Builder SetNormal(string value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.hasNormal = true; result.hasNormal = true;
result.normal_ = value; result.normal_ = value;
return this; return this;
} }
public Builder ClearNormal() { public Builder ClearNormal() {
PrepareBuilder();
result.hasNormal = false; result.hasNormal = false;
result.normal_ = ""; result.normal_ = "";
return this; return this;
...@@ -346,11 +376,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -346,11 +376,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetOptionsMessage_(string value) { public Builder SetOptionsMessage_(string value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.hasOptionsMessage_ = true; result.hasOptionsMessage_ = true;
result.optionsMessage_ = value; result.optionsMessage_ = value;
return this; return this;
} }
public Builder ClearOptionsMessage_() { public Builder ClearOptionsMessage_() {
PrepareBuilder();
result.hasOptionsMessage_ = false; result.hasOptionsMessage_ = false;
result.optionsMessage_ = ""; result.optionsMessage_ = "";
return this; return this;
...@@ -365,11 +397,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -365,11 +397,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetCustomName(string value) { public Builder SetCustomName(string value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.hasCustomName = true; result.hasCustomName = true;
result.customized_ = value; result.customized_ = value;
return this; return this;
} }
public Builder ClearCustomName() { public Builder ClearCustomName() {
PrepareBuilder();
result.hasCustomName = false; result.hasCustomName = false;
result.customized_ = ""; result.customized_ = "";
return this; return this;
......
...@@ -186,7 +186,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -186,7 +186,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(TestEmbedOptimizedForSize prototype) { public static Builder CreateBuilder(TestEmbedOptimizedForSize prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -196,21 +196,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -196,21 +196,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new TestEmbedOptimizedForSize();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(TestEmbedOptimizedForSize cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
TestEmbedOptimizedForSize result;
TestEmbedOptimizedForSize result = new TestEmbedOptimizedForSize(); private TestEmbedOptimizedForSize PrepareBuilder() {
if (builderIsReadOnly) {
TestEmbedOptimizedForSize original = result;
result = new TestEmbedOptimizedForSize();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override TestEmbedOptimizedForSize MessageBeingBuilt { protected override TestEmbedOptimizedForSize MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new TestEmbedOptimizedForSize(); result = DefaultInstance ?? new TestEmbedOptimizedForSize();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { 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 { public override pbd::MessageDescriptor DescriptorForType {
...@@ -222,13 +249,12 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -222,13 +249,12 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override TestEmbedOptimizedForSize BuildPartial() { public override TestEmbedOptimizedForSize BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
result.repeatedMessage_.MakeReadOnly(); result.repeatedMessage_.MakeReadOnly();
TestEmbedOptimizedForSize returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -242,6 +268,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -242,6 +268,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(TestEmbedOptimizedForSize other) { public override Builder MergeFrom(TestEmbedOptimizedForSize other) {
if (other == global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.DefaultInstance) return this;
PrepareBuilder();
if (other.HasOptionalMessage) { if (other.HasOptionalMessage) {
MergeOptionalMessage(other.OptionalMessage); MergeOptionalMessage(other.OptionalMessage);
} }
...@@ -257,6 +284,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -257,6 +284,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
pb::UnknownFieldSet.Builder unknownFields = null; pb::UnknownFieldSet.Builder unknownFields = null;
uint tag; uint tag;
string field_name; string field_name;
...@@ -322,18 +350,21 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -322,18 +350,21 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) { public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.hasOptionalMessage = true; result.hasOptionalMessage = true;
result.optionalMessage_ = value; result.optionalMessage_ = value;
return this; return this;
} }
public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) { public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) {
pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
PrepareBuilder();
result.hasOptionalMessage = true; result.hasOptionalMessage = true;
result.optionalMessage_ = builderForValue.Build(); result.optionalMessage_ = builderForValue.Build();
return this; return this;
} }
public Builder MergeOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) { public Builder MergeOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
if (result.hasOptionalMessage && if (result.hasOptionalMessage &&
result.optionalMessage_ != global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance) { result.optionalMessage_ != global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance) {
result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial(); result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
...@@ -344,13 +375,14 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -344,13 +375,14 @@ namespace Google.ProtocolBuffers.TestProtos {
return this; return this;
} }
public Builder ClearOptionalMessage() { public Builder ClearOptionalMessage() {
PrepareBuilder();
result.hasOptionalMessage = false; result.hasOptionalMessage = false;
result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance; result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance;
return this; return this;
} }
public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize> RepeatedMessageList { public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize> RepeatedMessageList {
get { return result.repeatedMessage_; } get { return PrepareBuilder().repeatedMessage_; }
} }
public int RepeatedMessageCount { public int RepeatedMessageCount {
get { return result.RepeatedMessageCount; } get { return result.RepeatedMessageCount; }
...@@ -360,29 +392,35 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -360,29 +392,35 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) { public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.repeatedMessage_[index] = value; result.repeatedMessage_[index] = value;
return this; return this;
} }
public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) { public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) {
pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
PrepareBuilder();
result.repeatedMessage_[index] = builderForValue.Build(); result.repeatedMessage_[index] = builderForValue.Build();
return this; return this;
} }
public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) { public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.repeatedMessage_.Add(value); result.repeatedMessage_.Add(value);
return this; return this;
} }
public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) { public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder builderForValue) {
pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
PrepareBuilder();
result.repeatedMessage_.Add(builderForValue.Build()); result.repeatedMessage_.Add(builderForValue.Build());
return this; return this;
} }
public Builder AddRangeRepeatedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize> values) { public Builder AddRangeRepeatedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize> values) {
PrepareBuilder();
base.AddRange(values, result.repeatedMessage_); base.AddRange(values, result.repeatedMessage_);
return this; return this;
} }
public Builder ClearRepeatedMessage() { public Builder ClearRepeatedMessage() {
PrepareBuilder();
result.repeatedMessage_.Clear(); result.repeatedMessage_.Clear();
return this; return this;
} }
......
...@@ -150,7 +150,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -150,7 +150,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(ImportMessageLite prototype) { public static Builder CreateBuilder(ImportMessageLite prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -160,21 +160,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -160,21 +160,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new ImportMessageLite();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(ImportMessageLite cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
ImportMessageLite result;
ImportMessageLite result = new ImportMessageLite(); private ImportMessageLite PrepareBuilder() {
if (builderIsReadOnly) {
ImportMessageLite original = result;
result = new ImportMessageLite();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override ImportMessageLite MessageBeingBuilt { protected override ImportMessageLite MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new ImportMessageLite(); result = DefaultInstance ?? new ImportMessageLite();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
return new Builder().MergeFrom(result); if (builderIsReadOnly) {
return new Builder(result);
} else {
return new Builder().MergeFrom(result);
}
} }
public override ImportMessageLite DefaultInstanceForType { public override ImportMessageLite DefaultInstanceForType {
...@@ -182,12 +209,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -182,12 +209,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessageLite BuildPartial() { public override ImportMessageLite BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
ImportMessageLite returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessageLite other) { public override Builder MergeFrom(pb::IMessageLite other) {
...@@ -201,6 +227,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -201,6 +227,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(ImportMessageLite other) { public override Builder MergeFrom(ImportMessageLite other) {
if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance) return this;
PrepareBuilder();
if (other.HasD) { if (other.HasD) {
D = other.D; D = other.D;
} }
...@@ -212,6 +239,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -212,6 +239,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
uint tag; uint tag;
string field_name; string field_name;
while (input.ReadTag(out tag, out field_name)) { while (input.ReadTag(out tag, out field_name)) {
...@@ -254,11 +282,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -254,11 +282,13 @@ namespace Google.ProtocolBuffers.TestProtos {
set { SetD(value); } set { SetD(value); }
} }
public Builder SetD(int value) { public Builder SetD(int value) {
PrepareBuilder();
result.hasD = true; result.hasD = true;
result.d_ = value; result.d_ = value;
return this; return this;
} }
public Builder ClearD() { public Builder ClearD() {
PrepareBuilder();
result.hasD = false; result.hasD = false;
result.d_ = 0; result.d_ = 0;
return this; return this;
......
...@@ -169,7 +169,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -169,7 +169,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(ImportMessage prototype) { public static Builder CreateBuilder(ImportMessage prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -179,21 +179,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -179,21 +179,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new ImportMessage();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(ImportMessage cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
ImportMessage result;
ImportMessage result = new ImportMessage(); private ImportMessage PrepareBuilder() {
if (builderIsReadOnly) {
ImportMessage original = result;
result = new ImportMessage();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override ImportMessage MessageBeingBuilt { protected override ImportMessage MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new ImportMessage(); result = DefaultInstance ?? new ImportMessage();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { 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 { public override pbd::MessageDescriptor DescriptorForType {
...@@ -205,12 +232,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -205,12 +232,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessage BuildPartial() { public override ImportMessage BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
ImportMessage returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -224,6 +250,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -224,6 +250,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(ImportMessage other) { public override Builder MergeFrom(ImportMessage other) {
if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this;
PrepareBuilder();
if (other.HasD) { if (other.HasD) {
D = other.D; D = other.D;
} }
...@@ -236,6 +263,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -236,6 +263,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
pb::UnknownFieldSet.Builder unknownFields = null; pb::UnknownFieldSet.Builder unknownFields = null;
uint tag; uint tag;
string field_name; string field_name;
...@@ -291,11 +319,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -291,11 +319,13 @@ namespace Google.ProtocolBuffers.TestProtos {
set { SetD(value); } set { SetD(value); }
} }
public Builder SetD(int value) { public Builder SetD(int value) {
PrepareBuilder();
result.hasD = true; result.hasD = true;
result.d_ = value; result.d_ = value;
return this; return this;
} }
public Builder ClearD() { public Builder ClearD() {
PrepareBuilder();
result.hasD = false; result.hasD = false;
result.d_ = 0; result.d_ = 0;
return this; return this;
......
...@@ -183,7 +183,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -183,7 +183,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(TestMessage prototype) { public static Builder CreateBuilder(TestMessage prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -193,21 +193,48 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -193,21 +193,48 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new TestMessage();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(TestMessage cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
TestMessage result;
TestMessage result = new TestMessage(); private TestMessage PrepareBuilder() {
if (builderIsReadOnly) {
TestMessage original = result;
result = new TestMessage();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override TestMessage MessageBeingBuilt { protected override TestMessage MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new TestMessage(); result = DefaultInstance ?? new TestMessage();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { 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 { public override pbd::MessageDescriptor DescriptorForType {
...@@ -219,12 +246,11 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -219,12 +246,11 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
} }
public override TestMessage BuildPartial() { public override TestMessage BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
TestMessage returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -238,6 +264,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -238,6 +264,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
public override Builder MergeFrom(TestMessage other) { public override Builder MergeFrom(TestMessage other) {
if (other == global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance) return this;
PrepareBuilder();
if (other.HasA) { if (other.HasA) {
A = other.A; A = other.A;
} }
...@@ -251,6 +278,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -251,6 +278,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
pb::UnknownFieldSet.Builder unknownFields = null; pb::UnknownFieldSet.Builder unknownFields = null;
uint tag; uint tag;
string field_name; string field_name;
...@@ -306,11 +334,13 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -306,11 +334,13 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
set { SetA(value); } set { SetA(value); }
} }
public Builder SetA(int value) { public Builder SetA(int value) {
PrepareBuilder();
result.hasA = true; result.hasA = true;
result.a_ = value; result.a_ = value;
return this; return this;
} }
public Builder ClearA() { public Builder ClearA() {
PrepareBuilder();
result.hasA = false; result.hasA = false;
result.a_ = 0; result.a_ = 0;
return this; return this;
......
...@@ -58,12 +58,7 @@ namespace Google.ProtocolBuffers ...@@ -58,12 +58,7 @@ namespace Google.ProtocolBuffers
protected internal FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors protected internal FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors
{ {
get { return MessageBeingBuilt.FieldAccessorsFromBuilder; } get { return DefaultInstanceForType.FieldAccessorsFromBuilder; }
}
public override bool IsInitialized
{
get { return MessageBeingBuilt.IsInitialized; }
} }
public override IDictionary<FieldDescriptor, object> AllFields public override IDictionary<FieldDescriptor, object> AllFields
...@@ -123,7 +118,7 @@ namespace Google.ProtocolBuffers ...@@ -123,7 +118,7 @@ namespace Google.ProtocolBuffers
public override MessageDescriptor DescriptorForType public override MessageDescriptor DescriptorForType
{ {
get { return MessageBeingBuilt.DescriptorForType; } get { return DefaultInstanceForType.DescriptorForType; }
} }
public override int GetRepeatedFieldCount(FieldDescriptor field) public override int GetRepeatedFieldCount(FieldDescriptor field)
...@@ -230,7 +225,7 @@ namespace Google.ProtocolBuffers ...@@ -230,7 +225,7 @@ namespace Google.ProtocolBuffers
public override TMessage Build() public override TMessage Build()
{ {
// If the message is null, we'll throw a more appropriate exception in BuildPartial. // If the message is null, we'll throw a more appropriate exception in BuildPartial.
if (MessageBeingBuilt != null && !IsInitialized) if (!IsInitialized)
{ {
throw new UninitializedMessageException(MessageBeingBuilt); throw new UninitializedMessageException(MessageBeingBuilt);
} }
......
...@@ -61,11 +61,6 @@ namespace Google.ProtocolBuffers ...@@ -61,11 +61,6 @@ namespace Google.ProtocolBuffers
public abstract TBuilder MergeFrom(TMessage other); public abstract TBuilder MergeFrom(TMessage other);
public override bool IsInitialized
{
get { return MessageBeingBuilt.IsInitialized; }
}
/// <summary> /// <summary>
/// Adds all of the specified values to the given collection. /// Adds all of the specified values to the given collection.
/// </summary> /// </summary>
...@@ -122,7 +117,7 @@ namespace Google.ProtocolBuffers ...@@ -122,7 +117,7 @@ namespace Google.ProtocolBuffers
public override TMessage Build() public override TMessage Build()
{ {
// If the message is null, we'll throw a more appropriate exception in BuildPartial. // If the message is null, we'll throw a more appropriate exception in BuildPartial.
if (MessageBeingBuilt != null && !IsInitialized) if (!IsInitialized)
{ {
throw new UninitializedMessageException(MessageBeingBuilt); throw new UninitializedMessageException(MessageBeingBuilt);
} }
......
...@@ -150,7 +150,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -150,7 +150,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(ImportMessageLite prototype) { public static Builder CreateBuilder(ImportMessageLite prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -160,21 +160,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -160,21 +160,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new ImportMessageLite();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(ImportMessageLite cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
ImportMessageLite result;
ImportMessageLite result = new ImportMessageLite(); private ImportMessageLite PrepareBuilder() {
if (builderIsReadOnly) {
ImportMessageLite original = result;
result = new ImportMessageLite();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override ImportMessageLite MessageBeingBuilt { protected override ImportMessageLite MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new ImportMessageLite(); result = DefaultInstance ?? new ImportMessageLite();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
return new Builder().MergeFrom(result); if (builderIsReadOnly) {
return new Builder(result);
} else {
return new Builder().MergeFrom(result);
}
} }
public override ImportMessageLite DefaultInstanceForType { public override ImportMessageLite DefaultInstanceForType {
...@@ -182,12 +209,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -182,12 +209,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessageLite BuildPartial() { public override ImportMessageLite BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
ImportMessageLite returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessageLite other) { public override Builder MergeFrom(pb::IMessageLite other) {
...@@ -201,6 +227,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -201,6 +227,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(ImportMessageLite other) { public override Builder MergeFrom(ImportMessageLite other) {
if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessageLite.DefaultInstance) return this;
PrepareBuilder();
if (other.HasD) { if (other.HasD) {
D = other.D; D = other.D;
} }
...@@ -212,6 +239,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -212,6 +239,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
uint tag; uint tag;
string field_name; string field_name;
while (input.ReadTag(out tag, out field_name)) { while (input.ReadTag(out tag, out field_name)) {
...@@ -254,11 +282,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -254,11 +282,13 @@ namespace Google.ProtocolBuffers.TestProtos {
set { SetD(value); } set { SetD(value); }
} }
public Builder SetD(int value) { public Builder SetD(int value) {
PrepareBuilder();
result.hasD = true; result.hasD = true;
result.d_ = value; result.d_ = value;
return this; return this;
} }
public Builder ClearD() { public Builder ClearD() {
PrepareBuilder();
result.hasD = false; result.hasD = false;
result.d_ = 0; result.d_ = 0;
return this; return this;
......
...@@ -169,7 +169,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -169,7 +169,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(ImportMessage prototype) { public static Builder CreateBuilder(ImportMessage prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -179,21 +179,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -179,21 +179,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new ImportMessage();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(ImportMessage cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
ImportMessage result;
ImportMessage result = new ImportMessage(); private ImportMessage PrepareBuilder() {
if (builderIsReadOnly) {
ImportMessage original = result;
result = new ImportMessage();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override ImportMessage MessageBeingBuilt { protected override ImportMessage MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new ImportMessage(); result = DefaultInstance ?? new ImportMessage();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { 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 { public override pbd::MessageDescriptor DescriptorForType {
...@@ -205,12 +232,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -205,12 +232,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessage BuildPartial() { public override ImportMessage BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
ImportMessage returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -224,6 +250,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -224,6 +250,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(ImportMessage other) { public override Builder MergeFrom(ImportMessage other) {
if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this;
PrepareBuilder();
if (other.HasD) { if (other.HasD) {
D = other.D; D = other.D;
} }
...@@ -236,6 +263,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -236,6 +263,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
pb::UnknownFieldSet.Builder unknownFields = null; pb::UnknownFieldSet.Builder unknownFields = null;
uint tag; uint tag;
string field_name; string field_name;
...@@ -291,11 +319,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -291,11 +319,13 @@ namespace Google.ProtocolBuffers.TestProtos {
set { SetD(value); } set { SetD(value); }
} }
public Builder SetD(int value) { public Builder SetD(int value) {
PrepareBuilder();
result.hasD = true; result.hasD = true;
result.d_ = value; result.d_ = value;
return this; return this;
} }
public Builder ClearD() { public Builder ClearD() {
PrepareBuilder();
result.hasD = false; result.hasD = false;
result.d_ = 0; result.d_ = 0;
return this; return this;
......
...@@ -139,7 +139,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -139,7 +139,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder ToBuilder() { return CreateBuilder(this); } public override Builder ToBuilder() { return CreateBuilder(this); }
public override Builder CreateBuilderForType() { return new Builder(); } public override Builder CreateBuilderForType() { return new Builder(); }
public static Builder CreateBuilder(TestLiteImportsNonlite prototype) { public static Builder CreateBuilder(TestLiteImportsNonlite prototype) {
return (Builder) new Builder().MergeFrom(prototype); return new Builder(prototype);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
...@@ -149,21 +149,48 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -149,21 +149,48 @@ namespace Google.ProtocolBuffers.TestProtos {
protected override Builder ThisBuilder { protected override Builder ThisBuilder {
get { return this; } get { return this; }
} }
public Builder() {} public Builder() {
result = DefaultInstance ?? new TestLiteImportsNonlite();
builderIsReadOnly = result == DefaultInstance;
}
internal Builder(TestLiteImportsNonlite cloneFrom) {
result = cloneFrom;
builderIsReadOnly = true;
}
bool builderIsReadOnly;
TestLiteImportsNonlite result;
TestLiteImportsNonlite result = new TestLiteImportsNonlite(); private TestLiteImportsNonlite PrepareBuilder() {
if (builderIsReadOnly) {
TestLiteImportsNonlite original = result;
result = new TestLiteImportsNonlite();
builderIsReadOnly = false;
MergeFrom(original);
}
return result;
}
public override bool IsInitialized {
get { return result.IsInitialized; }
}
protected override TestLiteImportsNonlite MessageBeingBuilt { protected override TestLiteImportsNonlite MessageBeingBuilt {
get { return result; } get { return PrepareBuilder(); }
} }
public override Builder Clear() { public override Builder Clear() {
result = new TestLiteImportsNonlite(); result = DefaultInstance ?? new TestLiteImportsNonlite();
builderIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
return new Builder().MergeFrom(result); if (builderIsReadOnly) {
return new Builder(result);
} else {
return new Builder().MergeFrom(result);
}
} }
public override TestLiteImportsNonlite DefaultInstanceForType { public override TestLiteImportsNonlite DefaultInstanceForType {
...@@ -171,12 +198,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -171,12 +198,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override TestLiteImportsNonlite BuildPartial() { public override TestLiteImportsNonlite BuildPartial() {
if (result == null) { if (builderIsReadOnly) {
throw new global::System.InvalidOperationException("build() has already been called on this Builder"); return result;
} }
TestLiteImportsNonlite returnMe = result; builderIsReadOnly = true;
result = null; return result;
return returnMe;
} }
public override Builder MergeFrom(pb::IMessageLite other) { public override Builder MergeFrom(pb::IMessageLite other) {
...@@ -190,6 +216,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -190,6 +216,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public override Builder MergeFrom(TestLiteImportsNonlite other) { public override Builder MergeFrom(TestLiteImportsNonlite other) {
if (other == global::Google.ProtocolBuffers.TestProtos.TestLiteImportsNonlite.DefaultInstance) return this; if (other == global::Google.ProtocolBuffers.TestProtos.TestLiteImportsNonlite.DefaultInstance) return this;
PrepareBuilder();
if (other.HasMessage) { if (other.HasMessage) {
MergeMessage(other.Message); MergeMessage(other.Message);
} }
...@@ -201,6 +228,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -201,6 +228,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
PrepareBuilder();
uint tag; uint tag;
string field_name; string field_name;
while (input.ReadTag(out tag, out field_name)) { while (input.ReadTag(out tag, out field_name)) {
...@@ -249,18 +277,21 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -249,18 +277,21 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public Builder SetMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) { public Builder SetMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
result.hasMessage = true; result.hasMessage = true;
result.message_ = value; result.message_ = value;
return this; return this;
} }
public Builder SetMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) { public Builder SetMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
PrepareBuilder();
result.hasMessage = true; result.hasMessage = true;
result.message_ = builderForValue.Build(); result.message_ = builderForValue.Build();
return this; return this;
} }
public Builder MergeMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) { public Builder MergeMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
pb::ThrowHelper.ThrowIfNull(value, "value"); pb::ThrowHelper.ThrowIfNull(value, "value");
PrepareBuilder();
if (result.hasMessage && if (result.hasMessage &&
result.message_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) { result.message_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
result.message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.message_).MergeFrom(value).BuildPartial(); result.message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.message_).MergeFrom(value).BuildPartial();
...@@ -271,6 +302,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -271,6 +302,7 @@ namespace Google.ProtocolBuffers.TestProtos {
return this; return this;
} }
public Builder ClearMessage() { public Builder ClearMessage() {
PrepareBuilder();
result.hasMessage = false; result.hasMessage = false;
result.message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; result.message_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance;
return this; return this;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment