Commit b6a14572 authored by csharptest's avatar csharptest Committed by rogerk

merged issue-28

parents 8c2b8d11 a314d4c9
...@@ -86,6 +86,15 @@ message NumberField { ...@@ -86,6 +86,15 @@ message NumberField {
optional int32 _01 = 1; optional int32 _01 = 1;
} }
// Issue 28: Circular message dependencies result in null defaults for DefaultInstance
message MyMessageAReferenceB {
required MyMessageBReferenceA value = 1;
}
message MyMessageBReferenceA {
required MyMessageAReferenceB value = 1;
}
// issue 19 - negative enum values // issue 19 - negative enum values
......
This diff is collapsed.
...@@ -48,14 +48,14 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -48,14 +48,14 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateMembers(TextGenerator writer) public void GenerateMembers(TextGenerator writer)
{ {
writer.WriteLine("private bool has{0};", PropertyName); writer.WriteLine("private bool has{0};", PropertyName);
writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue); writer.WriteLine("private {0} {1}_;", TypeName, Name);
AddDeprecatedFlag(writer); AddDeprecatedFlag(writer);
writer.WriteLine("public bool Has{0} {{", PropertyName); writer.WriteLine("public bool Has{0} {{", PropertyName);
writer.WriteLine(" get {{ return has{0}; }}", PropertyName); writer.WriteLine(" get {{ return has{0}; }}", PropertyName);
writer.WriteLine("}"); writer.WriteLine("}");
AddDeprecatedFlag(writer); AddDeprecatedFlag(writer);
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
writer.WriteLine(" get {{ return {0}_; }}", Name); writer.WriteLine(" get {{ return {0}_ ?? {1}; }}", Name, DefaultValue);
writer.WriteLine("}"); writer.WriteLine("}");
} }
...@@ -104,7 +104,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -104,7 +104,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
writer.WriteLine(" PrepareBuilder();"); 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}_ = null;", Name);
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
} }
......
...@@ -183,7 +183,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -183,7 +183,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.Indent(); writer.Indent();
writer.WriteLine("private {0}() {{ }}", ClassName); writer.WriteLine("private {0}() {{ }}", ClassName);
// Must call BuildPartial() to make sure all lists are made read-only // Must call BuildPartial() to make sure all lists are made read-only
writer.WriteLine("private static readonly {0} defaultInstance = new Builder().BuildPartial();", ClassName); writer.WriteLine("private static readonly {0} defaultInstance = new {0}().MakeReadOnly();", ClassName);
if (OptimizeSpeed) if (OptimizeSpeed)
{ {
...@@ -204,7 +204,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -204,7 +204,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName); writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName);
writer.WriteLine(" get { return defaultInstance; }"); writer.WriteLine(" get { return DefaultInstance; }");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("protected override {0} ThisMessage {{", ClassName); writer.WriteLine("protected override {0} ThisMessage {{", ClassName);
...@@ -552,6 +552,17 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -552,6 +552,17 @@ namespace Google.ProtocolBuffers.ProtoGen
private void GenerateBuilder(TextGenerator writer) private void GenerateBuilder(TextGenerator writer)
{ {
writer.WriteLine("private {0} MakeReadOnly() {{", ClassName);
writer.Indent();
foreach (FieldDescriptor field in Descriptor.Fields)
{
CreateFieldGenerator(field).GenerateBuildingCode(writer);
}
writer.WriteLine("return this;");
writer.Outdent();
writer.WriteLine("}");
writer.WriteLine();
writer.WriteLine("public static Builder CreateBuilder() { return new Builder(); }"); writer.WriteLine("public static Builder CreateBuilder() { return new Builder(); }");
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(); }");
...@@ -594,23 +605,23 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -594,23 +605,23 @@ namespace Google.ProtocolBuffers.ProtoGen
//default constructor //default constructor
writer.WriteLine("public Builder() {"); writer.WriteLine("public Builder() {");
//Durring static initialization of message, DefaultInstance is expected to return null. //Durring static initialization of message, DefaultInstance is expected to return null.
writer.WriteLine(" result = DefaultInstance ?? new {0}();", ClassName); writer.WriteLine(" result = DefaultInstance;");
writer.WriteLine(" builderIsReadOnly = result == DefaultInstance;"); writer.WriteLine(" resultIsReadOnly = true;");
writer.WriteLine("}"); writer.WriteLine("}");
//clone constructor //clone constructor
writer.WriteLine("internal Builder({0} cloneFrom) {{", ClassName); writer.WriteLine("internal Builder({0} cloneFrom) {{", ClassName);
writer.WriteLine(" result = cloneFrom;"); writer.WriteLine(" result = cloneFrom;");
writer.WriteLine(" builderIsReadOnly = true;"); writer.WriteLine(" resultIsReadOnly = true;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("bool builderIsReadOnly;"); writer.WriteLine("private bool resultIsReadOnly;");
writer.WriteLine("{0} result;", ClassName); writer.WriteLine("private {0} result;", ClassName);
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("private {0} PrepareBuilder() {{", ClassName); writer.WriteLine("private {0} PrepareBuilder() {{", ClassName);
writer.WriteLine(" if (builderIsReadOnly) {"); writer.WriteLine(" if (resultIsReadOnly) {");
writer.WriteLine(" {0} original = result;", ClassName); writer.WriteLine(" {0} original = result;", ClassName);
writer.WriteLine(" result = new {0}();", ClassName); writer.WriteLine(" result = new {0}();", ClassName);
writer.WriteLine(" builderIsReadOnly = false;"); writer.WriteLine(" resultIsReadOnly = false;");
writer.WriteLine(" MergeFrom(original);"); writer.WriteLine(" MergeFrom(original);");
writer.WriteLine(" }"); writer.WriteLine(" }");
writer.WriteLine(" return result;"); writer.WriteLine(" return result;");
...@@ -626,13 +637,13 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -626,13 +637,13 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(); writer.WriteLine();
//Not actually expecting that DefaultInstance would ever be null here; however, we will ensure it does not break //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 = DefaultInstance ?? new {0}();", ClassName); writer.WriteLine(" result = DefaultInstance;", ClassName);
writer.WriteLine(" builderIsReadOnly = true;"); writer.WriteLine(" resultIsReadOnly = 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(" if (builderIsReadOnly) {"); writer.WriteLine(" if (resultIsReadOnly) {");
writer.WriteLine(" return new Builder(result);"); writer.WriteLine(" return new Builder(result);");
writer.WriteLine(" } else {"); writer.WriteLine(" } else {");
writer.WriteLine(" return new Builder().MergeFrom(result);"); writer.WriteLine(" return new Builder().MergeFrom(result);");
...@@ -653,15 +664,11 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -653,15 +664,11 @@ 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 (builderIsReadOnly) {"); writer.WriteLine("if (resultIsReadOnly) {");
writer.WriteLine(" return result;"); writer.WriteLine(" return result;");
writer.WriteLine("}"); writer.WriteLine("}");
foreach (FieldDescriptor field in Descriptor.Fields) writer.WriteLine("resultIsReadOnly = true;");
{ writer.WriteLine("return result.MakeReadOnly();");
CreateFieldGenerator(field).GenerateBuildingCode(writer);
}
writer.WriteLine("builderIsReadOnly = true;");
writer.WriteLine("return result;");
writer.Outdent(); writer.Outdent();
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine(); writer.WriteLine();
......
...@@ -120,7 +120,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -120,7 +120,7 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateBuildingCode(TextGenerator writer) public void GenerateBuildingCode(TextGenerator writer)
{ {
writer.WriteLine("result.{0}_.MakeReadOnly();", Name); writer.WriteLine("{0}_.MakeReadOnly();", Name);
} }
public void GenerateParsingCode(TextGenerator writer) public void GenerateParsingCode(TextGenerator writer)
......
...@@ -134,7 +134,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -134,7 +134,7 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateBuildingCode(TextGenerator writer) public void GenerateBuildingCode(TextGenerator writer)
{ {
writer.WriteLine("result.{0}_.MakeReadOnly();", Name); writer.WriteLine("{0}_.MakeReadOnly();", Name);
} }
public void GenerateParsingCode(TextGenerator writer) public void GenerateParsingCode(TextGenerator writer)
......
...@@ -122,7 +122,7 @@ namespace Google.ProtocolBuffers.ProtoGen ...@@ -122,7 +122,7 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateBuildingCode(TextGenerator writer) public void GenerateBuildingCode(TextGenerator writer)
{ {
writer.WriteLine("result.{0}_.MakeReadOnly();", Name); writer.WriteLine("{0}_.MakeReadOnly();", Name);
} }
public void GenerateParsingCode(TextGenerator writer) public void GenerateParsingCode(TextGenerator writer)
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Text; using System.Text;
using Google.ProtocolBuffers.Collections; using Google.ProtocolBuffers.Collections;
using NUnit.Framework; using NUnit.Framework;
using Google.ProtocolBuffers.TestProtos; using Google.ProtocolBuffers.TestProtos;
using Google.ProtocolBuffers.Serialization; using Google.ProtocolBuffers.Serialization;
using UnitTest.Issues.TestProtos;
namespace Google.ProtocolBuffers namespace Google.ProtocolBuffers
{ {
[TestFixture] [TestFixture]
public class ReusableBuilderTest public class ReusableBuilderTest
{ {
[Test, Description("Issue 28: Circular message dependencies result in null defaults for DefaultInstance")]
public void EnsureStaticCicularReference()
{
MyMessageAReferenceB ab = MyMessageAReferenceB.DefaultInstance;
Assert.IsNotNull(ab);
Assert.IsNotNull(ab.Value);
MyMessageBReferenceA ba = MyMessageBReferenceA.DefaultInstance;
Assert.IsNotNull(ba);
Assert.IsNotNull(ba.Value);
}
[Test] [Test]
public void TestModifyDefaultInstance() public void TestModifyDefaultInstance()
{ {
......
...@@ -61,7 +61,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -61,7 +61,7 @@ namespace Google.ProtocolBuffers.TestProtos {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
public sealed partial class OptionsMessage : pb::GeneratedMessage<OptionsMessage, OptionsMessage.Builder> { public sealed partial class OptionsMessage : pb::GeneratedMessage<OptionsMessage, OptionsMessage.Builder> {
private OptionsMessage() { } private OptionsMessage() { }
private static readonly OptionsMessage defaultInstance = new Builder().BuildPartial(); private static readonly OptionsMessage defaultInstance = new OptionsMessage().MakeReadOnly();
private static readonly string[] _optionsMessageFieldNames = new string[] { "customized", "normal", "options_message" }; private static readonly string[] _optionsMessageFieldNames = new string[] { "customized", "normal", "options_message" };
private static readonly uint[] _optionsMessageFieldTags = new uint[] { 26, 10, 18 }; private static readonly uint[] _optionsMessageFieldTags = new uint[] { 26, 10, 18 };
public static OptionsMessage DefaultInstance { public static OptionsMessage DefaultInstance {
...@@ -69,7 +69,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -69,7 +69,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override OptionsMessage DefaultInstanceForType { public override OptionsMessage DefaultInstanceForType {
get { return defaultInstance; } get { return DefaultInstance; }
} }
protected override OptionsMessage ThisMessage { protected override OptionsMessage ThisMessage {
...@@ -187,6 +187,10 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -187,6 +187,10 @@ namespace Google.ProtocolBuffers.TestProtos {
public static OptionsMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public static OptionsMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
} }
private OptionsMessage MakeReadOnly() {
return this;
}
public static Builder CreateBuilder() { return new Builder(); } public static Builder CreateBuilder() { return new Builder(); }
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(); }
...@@ -202,22 +206,22 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -202,22 +206,22 @@ namespace Google.ProtocolBuffers.TestProtos {
get { return this; } get { return this; }
} }
public Builder() { public Builder() {
result = DefaultInstance ?? new OptionsMessage(); result = DefaultInstance;
builderIsReadOnly = result == DefaultInstance; resultIsReadOnly = true;
} }
internal Builder(OptionsMessage cloneFrom) { internal Builder(OptionsMessage cloneFrom) {
result = cloneFrom; result = cloneFrom;
builderIsReadOnly = true; resultIsReadOnly = true;
} }
bool builderIsReadOnly; private bool resultIsReadOnly;
OptionsMessage result; private OptionsMessage result;
private OptionsMessage PrepareBuilder() { private OptionsMessage PrepareBuilder() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
OptionsMessage original = result; OptionsMessage original = result;
result = new OptionsMessage(); result = new OptionsMessage();
builderIsReadOnly = false; resultIsReadOnly = false;
MergeFrom(original); MergeFrom(original);
} }
return result; return result;
...@@ -232,13 +236,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -232,13 +236,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder Clear() { public override Builder Clear() {
result = DefaultInstance ?? new OptionsMessage(); result = DefaultInstance;
builderIsReadOnly = true; resultIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return new Builder(result); return new Builder(result);
} else { } else {
return new Builder().MergeFrom(result); return new Builder().MergeFrom(result);
...@@ -254,11 +258,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -254,11 +258,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override OptionsMessage BuildPartial() { public override OptionsMessage BuildPartial() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return result; return result;
} }
builderIsReadOnly = true; resultIsReadOnly = true;
return result; return result.MakeReadOnly();
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
......
...@@ -65,7 +65,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -65,7 +65,7 @@ namespace Google.ProtocolBuffers.TestProtos {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
public sealed partial class TestEmbedOptimizedForSize : pb::GeneratedMessage<TestEmbedOptimizedForSize, TestEmbedOptimizedForSize.Builder> { public sealed partial class TestEmbedOptimizedForSize : pb::GeneratedMessage<TestEmbedOptimizedForSize, TestEmbedOptimizedForSize.Builder> {
private TestEmbedOptimizedForSize() { } private TestEmbedOptimizedForSize() { }
private static readonly TestEmbedOptimizedForSize defaultInstance = new Builder().BuildPartial(); private static readonly TestEmbedOptimizedForSize defaultInstance = new TestEmbedOptimizedForSize().MakeReadOnly();
private static readonly string[] _testEmbedOptimizedForSizeFieldNames = new string[] { "optional_message", "repeated_message" }; private static readonly string[] _testEmbedOptimizedForSizeFieldNames = new string[] { "optional_message", "repeated_message" };
private static readonly uint[] _testEmbedOptimizedForSizeFieldTags = new uint[] { 10, 18 }; private static readonly uint[] _testEmbedOptimizedForSizeFieldTags = new uint[] { 10, 18 };
public static TestEmbedOptimizedForSize DefaultInstance { public static TestEmbedOptimizedForSize DefaultInstance {
...@@ -73,7 +73,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -73,7 +73,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override TestEmbedOptimizedForSize DefaultInstanceForType { public override TestEmbedOptimizedForSize DefaultInstanceForType {
get { return defaultInstance; } get { return DefaultInstance; }
} }
protected override TestEmbedOptimizedForSize ThisMessage { protected override TestEmbedOptimizedForSize ThisMessage {
...@@ -90,12 +90,12 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -90,12 +90,12 @@ namespace Google.ProtocolBuffers.TestProtos {
public const int OptionalMessageFieldNumber = 1; public const int OptionalMessageFieldNumber = 1;
private bool hasOptionalMessage; private bool hasOptionalMessage;
private global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance; private global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize optionalMessage_;
public bool HasOptionalMessage { public bool HasOptionalMessage {
get { return hasOptionalMessage; } get { return hasOptionalMessage; }
} }
public global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize OptionalMessage { public global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize OptionalMessage {
get { return optionalMessage_; } get { return optionalMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance; }
} }
public const int RepeatedMessageFieldNumber = 2; public const int RepeatedMessageFieldNumber = 2;
...@@ -183,6 +183,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -183,6 +183,11 @@ namespace Google.ProtocolBuffers.TestProtos {
public static TestEmbedOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public static TestEmbedOptimizedForSize ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
} }
private TestEmbedOptimizedForSize MakeReadOnly() {
repeatedMessage_.MakeReadOnly();
return this;
}
public static Builder CreateBuilder() { return new Builder(); } public static Builder CreateBuilder() { return new Builder(); }
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(); }
...@@ -198,22 +203,22 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -198,22 +203,22 @@ namespace Google.ProtocolBuffers.TestProtos {
get { return this; } get { return this; }
} }
public Builder() { public Builder() {
result = DefaultInstance ?? new TestEmbedOptimizedForSize(); result = DefaultInstance;
builderIsReadOnly = result == DefaultInstance; resultIsReadOnly = true;
} }
internal Builder(TestEmbedOptimizedForSize cloneFrom) { internal Builder(TestEmbedOptimizedForSize cloneFrom) {
result = cloneFrom; result = cloneFrom;
builderIsReadOnly = true; resultIsReadOnly = true;
} }
bool builderIsReadOnly; private bool resultIsReadOnly;
TestEmbedOptimizedForSize result; private TestEmbedOptimizedForSize result;
private TestEmbedOptimizedForSize PrepareBuilder() { private TestEmbedOptimizedForSize PrepareBuilder() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
TestEmbedOptimizedForSize original = result; TestEmbedOptimizedForSize original = result;
result = new TestEmbedOptimizedForSize(); result = new TestEmbedOptimizedForSize();
builderIsReadOnly = false; resultIsReadOnly = false;
MergeFrom(original); MergeFrom(original);
} }
return result; return result;
...@@ -228,13 +233,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -228,13 +233,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder Clear() { public override Builder Clear() {
result = DefaultInstance ?? new TestEmbedOptimizedForSize(); result = DefaultInstance;
builderIsReadOnly = true; resultIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return new Builder(result); return new Builder(result);
} else { } else {
return new Builder().MergeFrom(result); return new Builder().MergeFrom(result);
...@@ -250,12 +255,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -250,12 +255,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override TestEmbedOptimizedForSize BuildPartial() { public override TestEmbedOptimizedForSize BuildPartial() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return result; return result;
} }
result.repeatedMessage_.MakeReadOnly(); resultIsReadOnly = true;
builderIsReadOnly = true; return result.MakeReadOnly();
return result;
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
...@@ -378,7 +382,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -378,7 +382,7 @@ namespace Google.ProtocolBuffers.TestProtos {
public Builder ClearOptionalMessage() { public Builder ClearOptionalMessage() {
PrepareBuilder(); PrepareBuilder();
result.hasOptionalMessage = false; result.hasOptionalMessage = false;
result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.DefaultInstance; result.optionalMessage_ = null;
return this; return this;
} }
......
...@@ -44,7 +44,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -44,7 +44,7 @@ namespace Google.ProtocolBuffers.TestProtos {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
public sealed partial class ImportMessageLite : pb::GeneratedMessageLite<ImportMessageLite, ImportMessageLite.Builder> { public sealed partial class ImportMessageLite : pb::GeneratedMessageLite<ImportMessageLite, ImportMessageLite.Builder> {
private ImportMessageLite() { } private ImportMessageLite() { }
private static readonly ImportMessageLite defaultInstance = new Builder().BuildPartial(); private static readonly ImportMessageLite defaultInstance = new ImportMessageLite().MakeReadOnly();
private static readonly string[] _importMessageLiteFieldNames = new string[] { "d" }; private static readonly string[] _importMessageLiteFieldNames = new string[] { "d" };
private static readonly uint[] _importMessageLiteFieldTags = new uint[] { 8 }; private static readonly uint[] _importMessageLiteFieldTags = new uint[] { 8 };
public static ImportMessageLite DefaultInstance { public static ImportMessageLite DefaultInstance {
...@@ -52,7 +52,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -52,7 +52,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessageLite DefaultInstanceForType { public override ImportMessageLite DefaultInstanceForType {
get { return defaultInstance; } get { return DefaultInstance; }
} }
protected override ImportMessageLite ThisMessage { protected override ImportMessageLite ThisMessage {
...@@ -147,6 +147,10 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -147,6 +147,10 @@ namespace Google.ProtocolBuffers.TestProtos {
public static ImportMessageLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public static ImportMessageLite ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
} }
private ImportMessageLite MakeReadOnly() {
return this;
}
public static Builder CreateBuilder() { return new Builder(); } public static Builder CreateBuilder() { return new Builder(); }
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(); }
...@@ -162,22 +166,22 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -162,22 +166,22 @@ namespace Google.ProtocolBuffers.TestProtos {
get { return this; } get { return this; }
} }
public Builder() { public Builder() {
result = DefaultInstance ?? new ImportMessageLite(); result = DefaultInstance;
builderIsReadOnly = result == DefaultInstance; resultIsReadOnly = true;
} }
internal Builder(ImportMessageLite cloneFrom) { internal Builder(ImportMessageLite cloneFrom) {
result = cloneFrom; result = cloneFrom;
builderIsReadOnly = true; resultIsReadOnly = true;
} }
bool builderIsReadOnly; private bool resultIsReadOnly;
ImportMessageLite result; private ImportMessageLite result;
private ImportMessageLite PrepareBuilder() { private ImportMessageLite PrepareBuilder() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
ImportMessageLite original = result; ImportMessageLite original = result;
result = new ImportMessageLite(); result = new ImportMessageLite();
builderIsReadOnly = false; resultIsReadOnly = false;
MergeFrom(original); MergeFrom(original);
} }
return result; return result;
...@@ -192,13 +196,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -192,13 +196,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder Clear() { public override Builder Clear() {
result = DefaultInstance ?? new ImportMessageLite(); result = DefaultInstance;
builderIsReadOnly = true; resultIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return new Builder(result); return new Builder(result);
} else { } else {
return new Builder().MergeFrom(result); return new Builder().MergeFrom(result);
...@@ -210,11 +214,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -210,11 +214,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessageLite BuildPartial() { public override ImportMessageLite BuildPartial() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return result; return result;
} }
builderIsReadOnly = true; resultIsReadOnly = true;
return result; return result.MakeReadOnly();
} }
public override Builder MergeFrom(pb::IMessageLite other) { public override Builder MergeFrom(pb::IMessageLite other) {
......
...@@ -72,7 +72,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -72,7 +72,7 @@ namespace Google.ProtocolBuffers.TestProtos {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> { public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {
private ImportMessage() { } private ImportMessage() { }
private static readonly ImportMessage defaultInstance = new Builder().BuildPartial(); private static readonly ImportMessage defaultInstance = new ImportMessage().MakeReadOnly();
private static readonly string[] _importMessageFieldNames = new string[] { "d" }; private static readonly string[] _importMessageFieldNames = new string[] { "d" };
private static readonly uint[] _importMessageFieldTags = new uint[] { 8 }; private static readonly uint[] _importMessageFieldTags = new uint[] { 8 };
public static ImportMessage DefaultInstance { public static ImportMessage DefaultInstance {
...@@ -80,7 +80,7 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -80,7 +80,7 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessage DefaultInstanceForType { public override ImportMessage DefaultInstanceForType {
get { return defaultInstance; } get { return DefaultInstance; }
} }
protected override ImportMessage ThisMessage { protected override ImportMessage ThisMessage {
...@@ -166,6 +166,10 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -166,6 +166,10 @@ namespace Google.ProtocolBuffers.TestProtos {
public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
} }
private ImportMessage MakeReadOnly() {
return this;
}
public static Builder CreateBuilder() { return new Builder(); } public static Builder CreateBuilder() { return new Builder(); }
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(); }
...@@ -181,22 +185,22 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -181,22 +185,22 @@ namespace Google.ProtocolBuffers.TestProtos {
get { return this; } get { return this; }
} }
public Builder() { public Builder() {
result = DefaultInstance ?? new ImportMessage(); result = DefaultInstance;
builderIsReadOnly = result == DefaultInstance; resultIsReadOnly = true;
} }
internal Builder(ImportMessage cloneFrom) { internal Builder(ImportMessage cloneFrom) {
result = cloneFrom; result = cloneFrom;
builderIsReadOnly = true; resultIsReadOnly = true;
} }
bool builderIsReadOnly; private bool resultIsReadOnly;
ImportMessage result; private ImportMessage result;
private ImportMessage PrepareBuilder() { private ImportMessage PrepareBuilder() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
ImportMessage original = result; ImportMessage original = result;
result = new ImportMessage(); result = new ImportMessage();
builderIsReadOnly = false; resultIsReadOnly = false;
MergeFrom(original); MergeFrom(original);
} }
return result; return result;
...@@ -211,13 +215,13 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -211,13 +215,13 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder Clear() { public override Builder Clear() {
result = DefaultInstance ?? new ImportMessage(); result = DefaultInstance;
builderIsReadOnly = true; resultIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return new Builder(result); return new Builder(result);
} else { } else {
return new Builder().MergeFrom(result); return new Builder().MergeFrom(result);
...@@ -233,11 +237,11 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -233,11 +237,11 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override ImportMessage BuildPartial() { public override ImportMessage BuildPartial() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return result; return result;
} }
builderIsReadOnly = true; resultIsReadOnly = true;
return result; return result.MakeReadOnly();
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
......
...@@ -82,7 +82,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -82,7 +82,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
public sealed partial class TestMessage : pb::ExtendableMessage<TestMessage, TestMessage.Builder> { public sealed partial class TestMessage : pb::ExtendableMessage<TestMessage, TestMessage.Builder> {
private TestMessage() { } private TestMessage() { }
private static readonly TestMessage defaultInstance = new Builder().BuildPartial(); private static readonly TestMessage defaultInstance = new TestMessage().MakeReadOnly();
private static readonly string[] _testMessageFieldNames = new string[] { "a" }; private static readonly string[] _testMessageFieldNames = new string[] { "a" };
private static readonly uint[] _testMessageFieldTags = new uint[] { 8 }; private static readonly uint[] _testMessageFieldTags = new uint[] { 8 };
public static TestMessage DefaultInstance { public static TestMessage DefaultInstance {
...@@ -90,7 +90,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -90,7 +90,7 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
} }
public override TestMessage DefaultInstanceForType { public override TestMessage DefaultInstanceForType {
get { return defaultInstance; } get { return DefaultInstance; }
} }
protected override TestMessage ThisMessage { protected override TestMessage ThisMessage {
...@@ -180,6 +180,10 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -180,6 +180,10 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
public static TestMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public static TestMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
} }
private TestMessage MakeReadOnly() {
return this;
}
public static Builder CreateBuilder() { return new Builder(); } public static Builder CreateBuilder() { return new Builder(); }
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(); }
...@@ -195,22 +199,22 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -195,22 +199,22 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
get { return this; } get { return this; }
} }
public Builder() { public Builder() {
result = DefaultInstance ?? new TestMessage(); result = DefaultInstance;
builderIsReadOnly = result == DefaultInstance; resultIsReadOnly = true;
} }
internal Builder(TestMessage cloneFrom) { internal Builder(TestMessage cloneFrom) {
result = cloneFrom; result = cloneFrom;
builderIsReadOnly = true; resultIsReadOnly = true;
} }
bool builderIsReadOnly; private bool resultIsReadOnly;
TestMessage result; private TestMessage result;
private TestMessage PrepareBuilder() { private TestMessage PrepareBuilder() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
TestMessage original = result; TestMessage original = result;
result = new TestMessage(); result = new TestMessage();
builderIsReadOnly = false; resultIsReadOnly = false;
MergeFrom(original); MergeFrom(original);
} }
return result; return result;
...@@ -225,13 +229,13 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -225,13 +229,13 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
} }
public override Builder Clear() { public override Builder Clear() {
result = DefaultInstance ?? new TestMessage(); result = DefaultInstance;
builderIsReadOnly = true; resultIsReadOnly = true;
return this; return this;
} }
public override Builder Clone() { public override Builder Clone() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return new Builder(result); return new Builder(result);
} else { } else {
return new Builder().MergeFrom(result); return new Builder().MergeFrom(result);
...@@ -247,11 +251,11 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService { ...@@ -247,11 +251,11 @@ namespace Google.ProtocolBuffers.TestProtos.NoGenericService {
} }
public override TestMessage BuildPartial() { public override TestMessage BuildPartial() {
if (builderIsReadOnly) { if (resultIsReadOnly) {
return result; return result;
} }
builderIsReadOnly = true; resultIsReadOnly = true;
return result; return result.MakeReadOnly();
} }
public override Builder MergeFrom(pb::IMessage other) { public override Builder MergeFrom(pb::IMessage other) {
......
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