diff options
Diffstat (limited to 'csharp/ProtocolBuffers')
21 files changed, 464 insertions, 535 deletions
diff --git a/csharp/ProtocolBuffers/AbstractBuilder.cs b/csharp/ProtocolBuffers/AbstractBuilder.cs index 94077d4f..261bbcf3 100644 --- a/csharp/ProtocolBuffers/AbstractBuilder.cs +++ b/csharp/ProtocolBuffers/AbstractBuilder.cs @@ -8,10 +8,16 @@ using System.IO; namespace Google.ProtocolBuffers { /// <summary> /// Implementation of the non-generic IMessage interface as far as possible. - /// TODO(jonskeet): Make this generic, to avoid so much casting in DynamicMessage. /// </summary> - public abstract class AbstractBuilder : IBuilder { + public abstract class AbstractBuilder<TMessage, TBuilder> : IBuilder<TMessage, TBuilder> + where TMessage : AbstractMessage<TMessage, TBuilder> + where TBuilder : AbstractBuilder<TMessage, TBuilder> { + + protected abstract TBuilder ThisBuilder { get; } + #region Unimplemented members of IBuilder + public abstract UnknownFieldSet UnknownFields { get; set; } + public abstract TBuilder MergeFrom(TMessage other); public abstract bool IsInitialized { get; } public abstract IDictionary<FieldDescriptor, object> AllFields { get; } public abstract object this[FieldDescriptor field] { get; set; } @@ -19,55 +25,75 @@ namespace Google.ProtocolBuffers { public abstract int GetRepeatedFieldCount(FieldDescriptor field); public abstract object this[FieldDescriptor field, int index] { get; set; } public abstract bool HasField(FieldDescriptor field); + public abstract TMessage Build(); + public abstract TMessage BuildPartial(); + public abstract TBuilder Clone(); + public abstract TMessage DefaultInstanceForType { get; } + public abstract IBuilder CreateBuilderForField(FieldDescriptor field); + public abstract TBuilder ClearField(FieldDescriptor field); + public abstract TBuilder AddRepeatedField(FieldDescriptor field, object value); #endregion - #region New abstract methods to be overridden by implementations, allow explicit interface implementation - protected abstract IMessage BuildImpl(); - protected abstract IMessage BuildPartialImpl(); - protected abstract IBuilder CloneImpl(); - protected abstract IMessage DefaultInstanceForTypeImpl { get; } - protected abstract IBuilder ClearFieldImpl(FieldDescriptor field); - protected abstract IBuilder AddRepeatedFieldImpl(FieldDescriptor field, object value); - #endregion + #region Implementation of methods which don't require type parameter information + public IMessage WeakBuild() { + return Build(); + } - #region Methods simply proxying to the "Impl" methods, explicitly implementing IBuilder - IMessage IBuilder.Build() { - return BuildImpl(); + public IBuilder WeakAddRepeatedField(FieldDescriptor field, object value) { + return AddRepeatedField(field, value); } - IMessage IBuilder.BuildPartial() { - return BuildPartialImpl(); + public IBuilder WeakClear() { + return Clear(); } - IBuilder IBuilder.Clone() { - return CloneImpl(); + public IBuilder WeakMergeFrom(IMessage message) { + return MergeFrom(message); } - - IMessage IBuilder.DefaultInstanceForType { - get { return DefaultInstanceForTypeImpl; } + + public IBuilder WeakMergeFrom(CodedInputStream input) { + return MergeFrom(input); } - public abstract IBuilder CreateBuilderForField(FieldDescriptor field); + public IBuilder WeakMergeFrom(CodedInputStream input, ExtensionRegistry registry) { + return MergeFrom(input, registry); + } + + public IBuilder WeakMergeFrom(ByteString data) { + return MergeFrom(data); + } + + public IBuilder WeakMergeFrom(ByteString data, ExtensionRegistry registry) { + return MergeFrom(data, registry); + } - IBuilder IBuilder.ClearField(FieldDescriptor field) { - return ClearFieldImpl(field); + public IMessage WeakBuildPartial() { + return BuildPartial(); } - IBuilder IBuilder.AddRepeatedField(FieldDescriptor field, object value) { - return AddRepeatedFieldImpl(field, value); + public IBuilder WeakClone() { + return Clone(); + } + + public IMessage WeakDefaultInstanceForType { + get { return DefaultInstanceForType; } + } + + public IBuilder WeakClearField(FieldDescriptor field) { + return ClearField(field); } #endregion - public virtual IBuilder Clear() { + public virtual TBuilder Clear() { foreach(FieldDescriptor field in AllFields.Keys) { - ClearFieldImpl(field); + ClearField(field); } - return this; + return ThisBuilder; } - public virtual IBuilder MergeFrom(IMessage other) { + public virtual TBuilder MergeFrom(IMessage other) { if (other.DescriptorForType != DescriptorForType) { - throw new ArgumentException("MergeFrom(Message) can only merge messages of the same type."); + throw new ArgumentException("MergeFrom(IMessage) can only merge messages of the same type."); } // Note: We don't attempt to verify that other's fields have valid @@ -83,101 +109,95 @@ namespace Google.ProtocolBuffers { if (field.IsRepeated) { // Concatenate repeated fields foreach (object element in (IEnumerable) entry.Value) { - AddRepeatedFieldImpl(field, element); + AddRepeatedField(field, element); } } else if (field.MappedType == MappedType.Message) { // Merge singular messages IMessage existingValue = (IMessage) this[field]; - if (existingValue == existingValue.DefaultInstanceForType) { + if (existingValue == existingValue.WeakDefaultInstanceForType) { this[field] = entry.Value; } else { - this[field] = existingValue.CreateBuilderForType() - .MergeFrom(existingValue) - .MergeFrom((IMessage) entry.Value) - .Build(); + this[field] = existingValue.WeakCreateBuilderForType() + .WeakMergeFrom(existingValue) + .WeakMergeFrom((IMessage) entry.Value) + .WeakBuild(); } } else { // Overwrite simple values this[field] = entry.Value; } } - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(CodedInputStream input) { - return MergeFromImpl(input, ExtensionRegistry.Empty); + public virtual TBuilder MergeFrom(CodedInputStream input) { + return MergeFrom(input, ExtensionRegistry.Empty); } - protected virtual IBuilder MergeFromImpl(CodedInputStream input, ExtensionRegistry extensionRegistry) { + public virtual TBuilder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) { UnknownFieldSet.Builder unknownFields = UnknownFieldSet.CreateBuilder(UnknownFields); FieldSet.MergeFrom(input, unknownFields, extensionRegistry, this); UnknownFields = unknownFields.Build(); - return this; - } - - IBuilder IBuilder.MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) { - return MergeFromImpl(input, extensionRegistry); + return ThisBuilder; } - IBuilder IBuilder.MergeUnknownFields(UnknownFieldSet unknownFields) { + public virtual TBuilder MergeUnknownFields(UnknownFieldSet unknownFields) { UnknownFields = UnknownFieldSet.CreateBuilder(UnknownFields) .MergeFrom(unknownFields) .Build(); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(ByteString data) { + public virtual TBuilder MergeFrom(ByteString data) { CodedInputStream input = data.CreateCodedInput(); - ((IBuilder)this).MergeFrom(input); + MergeFrom(input); input.CheckLastTagWas(0); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(ByteString data, ExtensionRegistry extensionRegistry) { + public virtual TBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry) { CodedInputStream input = data.CreateCodedInput(); - ((IBuilder)this).MergeFrom(input, extensionRegistry); + MergeFrom(input, extensionRegistry); input.CheckLastTagWas(0); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(byte[] data) { + public virtual TBuilder MergeFrom(byte[] data) { CodedInputStream input = CodedInputStream.CreateInstance(data); - ((IBuilder)this).MergeFrom(input); + MergeFrom(input); input.CheckLastTagWas(0); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(byte[] data, ExtensionRegistry extensionRegistry) { + public virtual TBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry) { CodedInputStream input = CodedInputStream.CreateInstance(data); - ((IBuilder)this).MergeFrom(input, extensionRegistry); + MergeFrom(input, extensionRegistry); input.CheckLastTagWas(0); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(Stream input) { + public virtual TBuilder MergeFrom(Stream input) { CodedInputStream codedInput = CodedInputStream.CreateInstance(input); - ((IBuilder)this).MergeFrom(codedInput); + MergeFrom(codedInput); codedInput.CheckLastTagWas(0); - return this; + return ThisBuilder; } - IBuilder IBuilder.MergeFrom(Stream input, ExtensionRegistry extensionRegistry) { + public virtual TBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry) { CodedInputStream codedInput = CodedInputStream.CreateInstance(input); - ((IBuilder)this).MergeFrom(codedInput, extensionRegistry); + MergeFrom(codedInput, extensionRegistry); codedInput.CheckLastTagWas(0); - return this; + return ThisBuilder; } - public abstract UnknownFieldSet UnknownFields { get; set; } - - public IBuilder SetField(FieldDescriptor field, object value) { + public virtual IBuilder SetField(FieldDescriptor field, object value) { this[field] = value; - return this; + return ThisBuilder; } - public IBuilder SetRepeatedField(FieldDescriptor field, int index, object value) { + public virtual IBuilder SetRepeatedField(FieldDescriptor field, int index, object value) { this[field, index] = value; - return this; + return ThisBuilder; } } } diff --git a/csharp/ProtocolBuffers/AbstractMessage.cs b/csharp/ProtocolBuffers/AbstractMessage.cs index 6dfcc46d..87172932 100644 --- a/csharp/ProtocolBuffers/AbstractMessage.cs +++ b/csharp/ProtocolBuffers/AbstractMessage.cs @@ -23,7 +23,9 @@ namespace Google.ProtocolBuffers { /// <summary> /// Implementation of the non-generic IMessage interface as far as possible. /// </summary> - public abstract class AbstractMessage : IMessage { + public abstract class AbstractMessage<TMessage, TBuilder> : IMessage<TMessage, TBuilder> + where TMessage : AbstractMessage<TMessage, TBuilder> + where TBuilder : AbstractBuilder<TMessage, TBuilder> { // TODO(jonskeet): Cleaner to use a Nullable<int>? /// <summary> /// The serialized size if it's already been computed, or -1 @@ -39,21 +41,17 @@ namespace Google.ProtocolBuffers { public abstract int GetRepeatedFieldCount(FieldDescriptor field); public abstract object this[FieldDescriptor field, int index] { get; } public abstract UnknownFieldSet UnknownFields { get; } + public abstract TMessage DefaultInstanceForType { get; } + public abstract TBuilder CreateBuilderForType(); #endregion - - #region New abstract methods to be overridden by implementations, allow explicit interface implementation - protected abstract IMessage DefaultInstanceForTypeImpl { get; } - protected abstract IBuilder CreateBuilderForTypeImpl(); - #endregion - - #region Methods simply proxying to the "Impl" methods, explicitly implementing IMessage - IMessage IMessage.DefaultInstanceForType { - get { return DefaultInstanceForTypeImpl; } + + public IBuilder WeakCreateBuilderForType() { + return CreateBuilderForType(); } - IBuilder IMessage.CreateBuilderForType() { - return CreateBuilderForTypeImpl(); + + public IMessage WeakDefaultInstanceForType { + get { return DefaultInstanceForType; } } - #endregion public virtual bool IsInitialized { get { @@ -71,7 +69,7 @@ namespace Google.ProtocolBuffers { if (field.IsRepeated) { // We know it's an IList<T>, but not the exact type - so // IEnumerable is the best we can do. (C# generics aren't covariant yet.) - foreach (IMessage element in (IEnumerable)entry.Value) { + foreach (IMessage element in (IEnumerable) entry.Value) { if (!element.IsInitialized) { return false; } @@ -124,7 +122,7 @@ namespace Google.ProtocolBuffers { foreach (KeyValuePair<FieldDescriptor, object> entry in AllFields) { FieldDescriptor field = entry.Key; if (field.IsRepeated) { - foreach (object element in (IEnumerable)entry.Value) { + foreach (object element in (IEnumerable) entry.Value) { size += CodedOutputStream.ComputeFieldSize(field.FieldType, field.FieldNumber, element); } } else { diff --git a/csharp/ProtocolBuffers/CodedInputStream.cs b/csharp/ProtocolBuffers/CodedInputStream.cs index 7fab7d21..d9dbc217 100644 --- a/csharp/ProtocolBuffers/CodedInputStream.cs +++ b/csharp/ProtocolBuffers/CodedInputStream.cs @@ -224,7 +224,7 @@ namespace Google.ProtocolBuffers { throw InvalidProtocolBufferException.RecursionLimitExceeded(); } ++recursionDepth; - builder.MergeFrom(this, extensionRegistry); + builder.WeakMergeFrom(this, extensionRegistry); CheckLastTagWas(WireFormat.MakeTag(fieldNumber, WireFormat.WireType.EndGroup)); --recursionDepth; } @@ -253,7 +253,7 @@ namespace Google.ProtocolBuffers { } int oldLimit = PushLimit(length); ++recursionDepth; - builder.MergeFrom(this, extensionRegistry); + builder.WeakMergeFrom(this, extensionRegistry); CheckLastTagWas(0); --recursionDepth; PopLimit(oldLimit); diff --git a/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs b/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs index a7772cf8..fe8d0656 100644 --- a/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs +++ b/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs @@ -492,12 +492,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::FileDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::FileDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::FileDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::FileDescriptorProto.CreateBuilder() internal Builder() {} @@ -507,12 +511,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::FileDescriptorProto> Clear() { + public override Builder Clear() { result = new self::FileDescriptorProto(); return this; } - public override IBuilder<self::FileDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -543,11 +547,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::FileDescriptorProto) { return MergeFrom((self::FileDescriptorProto) other); } else { @@ -556,7 +556,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::FileDescriptorProto> MergeFrom(self::FileDescriptorProto other) { + public override Builder MergeFrom(self::FileDescriptorProto other) { if (other == self::FileDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -601,11 +601,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::FileDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::FileDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -1084,12 +1084,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::DescriptorProto.Types.ExtensionRange prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::DescriptorProto.Types.ExtensionRange, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::DescriptorProto.Types.ExtensionRange.CreateBuilder() internal Builder() {} @@ -1099,12 +1103,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> Clear() { + public override Builder Clear() { result = new self::DescriptorProto.Types.ExtensionRange(); return this; } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -1122,11 +1126,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::DescriptorProto.Types.ExtensionRange) { return MergeFrom((self::DescriptorProto.Types.ExtensionRange) other); } else { @@ -1135,7 +1135,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> MergeFrom(self::DescriptorProto.Types.ExtensionRange other) { + public override Builder MergeFrom(self::DescriptorProto.Types.ExtensionRange other) { if (other == self::DescriptorProto.Types.ExtensionRange.DefaultInstance) return this; if (other.HasStart) { Start = other.Start; @@ -1147,11 +1147,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::DescriptorProto.Types.ExtensionRange> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -1404,12 +1404,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::DescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::DescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::DescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::DescriptorProto.CreateBuilder() internal Builder() {} @@ -1419,12 +1423,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::DescriptorProto> Clear() { + public override Builder Clear() { result = new self::DescriptorProto(); return this; } - public override IBuilder<self::DescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -1457,11 +1461,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::DescriptorProto) { return MergeFrom((self::DescriptorProto) other); } else { @@ -1470,7 +1470,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::DescriptorProto> MergeFrom(self::DescriptorProto other) { + public override Builder MergeFrom(self::DescriptorProto other) { if (other == self::DescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -1512,11 +1512,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::DescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::DescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -2091,12 +2091,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::FieldDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::FieldDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::FieldDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::FieldDescriptorProto.CreateBuilder() internal Builder() {} @@ -2106,12 +2110,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::FieldDescriptorProto> Clear() { + public override Builder Clear() { result = new self::FieldDescriptorProto(); return this; } - public override IBuilder<self::FieldDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -2129,11 +2133,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::FieldDescriptorProto) { return MergeFrom((self::FieldDescriptorProto) other); } else { @@ -2142,7 +2142,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::FieldDescriptorProto> MergeFrom(self::FieldDescriptorProto other) { + public override Builder MergeFrom(self::FieldDescriptorProto other) { if (other == self::FieldDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -2172,11 +2172,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::FieldDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::FieldDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -2541,12 +2541,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::EnumDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::EnumDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::EnumDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::EnumDescriptorProto.CreateBuilder() internal Builder() {} @@ -2556,12 +2560,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::EnumDescriptorProto> Clear() { + public override Builder Clear() { result = new self::EnumDescriptorProto(); return this; } - public override IBuilder<self::EnumDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -2582,11 +2586,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::EnumDescriptorProto) { return MergeFrom((self::EnumDescriptorProto) other); } else { @@ -2595,7 +2595,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::EnumDescriptorProto> MergeFrom(self::EnumDescriptorProto other) { + public override Builder MergeFrom(self::EnumDescriptorProto other) { if (other == self::EnumDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -2613,11 +2613,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::EnumDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::EnumDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -2882,12 +2882,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::EnumValueDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::EnumValueDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::EnumValueDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::EnumValueDescriptorProto.CreateBuilder() internal Builder() {} @@ -2897,12 +2901,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::EnumValueDescriptorProto> Clear() { + public override Builder Clear() { result = new self::EnumValueDescriptorProto(); return this; } - public override IBuilder<self::EnumValueDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -2920,11 +2924,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::EnumValueDescriptorProto) { return MergeFrom((self::EnumValueDescriptorProto) other); } else { @@ -2933,7 +2933,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::EnumValueDescriptorProto> MergeFrom(self::EnumValueDescriptorProto other) { + public override Builder MergeFrom(self::EnumValueDescriptorProto other) { if (other == self::EnumValueDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -2948,11 +2948,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::EnumValueDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::EnumValueDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -3192,12 +3192,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::ServiceDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::ServiceDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::ServiceDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::ServiceDescriptorProto.CreateBuilder() internal Builder() {} @@ -3207,12 +3211,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::ServiceDescriptorProto> Clear() { + public override Builder Clear() { result = new self::ServiceDescriptorProto(); return this; } - public override IBuilder<self::ServiceDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -3233,11 +3237,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::ServiceDescriptorProto) { return MergeFrom((self::ServiceDescriptorProto) other); } else { @@ -3246,7 +3246,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::ServiceDescriptorProto> MergeFrom(self::ServiceDescriptorProto other) { + public override Builder MergeFrom(self::ServiceDescriptorProto other) { if (other == self::ServiceDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -3264,11 +3264,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::ServiceDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::ServiceDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -3549,12 +3549,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::MethodDescriptorProto> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::MethodDescriptorProto prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::MethodDescriptorProto, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::MethodDescriptorProto.CreateBuilder() internal Builder() {} @@ -3564,12 +3568,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::MethodDescriptorProto> Clear() { + public override Builder Clear() { result = new self::MethodDescriptorProto(); return this; } - public override IBuilder<self::MethodDescriptorProto> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -3587,11 +3591,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::MethodDescriptorProto) { return MergeFrom((self::MethodDescriptorProto) other); } else { @@ -3600,7 +3600,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::MethodDescriptorProto> MergeFrom(self::MethodDescriptorProto other) { + public override Builder MergeFrom(self::MethodDescriptorProto other) { if (other == self::MethodDescriptorProto.DefaultInstance) return this; if (other.HasName) { Name = other.Name; @@ -3618,11 +3618,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::MethodDescriptorProto> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::MethodDescriptorProto> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -3988,12 +3988,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::FileOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::FileOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::FileOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::FileOptions.CreateBuilder() internal Builder() {} @@ -4003,12 +4007,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::FileOptions> Clear() { + public override Builder Clear() { result = new self::FileOptions(); return this; } - public override IBuilder<self::FileOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -4026,11 +4030,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::FileOptions) { return MergeFrom((self::FileOptions) other); } else { @@ -4039,7 +4039,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::FileOptions> MergeFrom(self::FileOptions other) { + public override Builder MergeFrom(self::FileOptions other) { if (other == self::FileOptions.DefaultInstance) return this; if (other.HasJavaPackage) { JavaPackage = other.JavaPackage; @@ -4072,11 +4072,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::FileOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::FileOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -4404,12 +4404,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::MessageOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::MessageOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::MessageOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::MessageOptions.CreateBuilder() internal Builder() {} @@ -4419,12 +4423,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::MessageOptions> Clear() { + public override Builder Clear() { result = new self::MessageOptions(); return this; } - public override IBuilder<self::MessageOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -4442,11 +4446,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::MessageOptions) { return MergeFrom((self::MessageOptions) other); } else { @@ -4455,7 +4455,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::MessageOptions> MergeFrom(self::MessageOptions other) { + public override Builder MergeFrom(self::MessageOptions other) { if (other == self::MessageOptions.DefaultInstance) return this; if (other.HasMessageSetWireFormat) { MessageSetWireFormat = other.MessageSetWireFormat; @@ -4464,11 +4464,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::MessageOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::MessageOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -4632,12 +4632,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::FieldOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::FieldOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::FieldOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::FieldOptions.CreateBuilder() internal Builder() {} @@ -4647,12 +4651,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::FieldOptions> Clear() { + public override Builder Clear() { result = new self::FieldOptions(); return this; } - public override IBuilder<self::FieldOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -4670,11 +4674,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::FieldOptions) { return MergeFrom((self::FieldOptions) other); } else { @@ -4683,7 +4683,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::FieldOptions> MergeFrom(self::FieldOptions other) { + public override Builder MergeFrom(self::FieldOptions other) { if (other == self::FieldOptions.DefaultInstance) return this; if (other.HasCtype) { Ctype = other.Ctype; @@ -4695,11 +4695,11 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return this; } - public override IBuilder<self::FieldOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::FieldOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -4850,12 +4850,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::EnumOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::EnumOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::EnumOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::EnumOptions.CreateBuilder() internal Builder() {} @@ -4865,12 +4869,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::EnumOptions> Clear() { + public override Builder Clear() { result = new self::EnumOptions(); return this; } - public override IBuilder<self::EnumOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -4888,11 +4892,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::EnumOptions) { return MergeFrom((self::EnumOptions) other); } else { @@ -4901,17 +4901,17 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::EnumOptions> MergeFrom(self::EnumOptions other) { + public override Builder MergeFrom(self::EnumOptions other) { if (other == self::EnumOptions.DefaultInstance) return this; this.MergeUnknownFields(other.UnknownFields); return this; } - public override IBuilder<self::EnumOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::EnumOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -5011,12 +5011,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::EnumValueOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::EnumValueOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::EnumValueOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::EnumValueOptions.CreateBuilder() internal Builder() {} @@ -5026,12 +5030,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::EnumValueOptions> Clear() { + public override Builder Clear() { result = new self::EnumValueOptions(); return this; } - public override IBuilder<self::EnumValueOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -5049,11 +5053,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::EnumValueOptions) { return MergeFrom((self::EnumValueOptions) other); } else { @@ -5062,17 +5062,17 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::EnumValueOptions> MergeFrom(self::EnumValueOptions other) { + public override Builder MergeFrom(self::EnumValueOptions other) { if (other == self::EnumValueOptions.DefaultInstance) return this; this.MergeUnknownFields(other.UnknownFields); return this; } - public override IBuilder<self::EnumValueOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::EnumValueOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -5172,12 +5172,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::ServiceOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::ServiceOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::ServiceOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::ServiceOptions.CreateBuilder() internal Builder() {} @@ -5187,12 +5191,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::ServiceOptions> Clear() { + public override Builder Clear() { result = new self::ServiceOptions(); return this; } - public override IBuilder<self::ServiceOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -5210,11 +5214,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::ServiceOptions) { return MergeFrom((self::ServiceOptions) other); } else { @@ -5223,17 +5223,17 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::ServiceOptions> MergeFrom(self::ServiceOptions other) { + public override Builder MergeFrom(self::ServiceOptions other) { if (other == self::ServiceOptions.DefaultInstance) return this; this.MergeUnknownFields(other.UnknownFields); return this; } - public override IBuilder<self::ServiceOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::ServiceOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { @@ -5333,12 +5333,16 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } public static Builder CreateBuilder() { return new Builder(); } - public override IBuilder<self::MethodOptions> CreateBuilderForType() { return new Builder(); } + public override Builder CreateBuilderForType() { return new Builder(); } public static Builder CreateBuilder(self::MethodOptions prototype) { return (Builder) new Builder().MergeFrom(prototype); } public sealed partial class Builder : pb::GeneratedBuilder<self::MethodOptions, Builder> { + protected override Builder ThisBuilder { + get { return this; } + } + // Construct using self::MethodOptions.CreateBuilder() internal Builder() {} @@ -5348,12 +5352,12 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return result; } } - public override IBuilder<self::MethodOptions> Clear() { + public override Builder Clear() { result = new self::MethodOptions(); return this; } - public override IBuilder<self::MethodOptions> Clone() { + public override Builder Clone() { return new Builder().MergeFrom(result); } @@ -5371,11 +5375,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos { return returnMe; } - protected override IBuilder MergeFromImpl(CodedInputStream data, ExtensionRegistry extensionRegistry) { - return MergeFrom(data, extensionRegistry); - } - - public override IBuilder MergeFrom(pb::IMessage other) { + public override Builder MergeFrom(pb::IMessage other) { if (other is self::MethodOptions) { return MergeFrom((self::MethodOptions) other); } else { @@ -5384,17 +5384,17 @@ namespace Google.ProtocolBuffers.DescriptorProtos { } } - public override IBuilder<self::MethodOptions> MergeFrom(self::MethodOptions other) { + public override Builder MergeFrom(self::MethodOptions other) { if (other == self::MethodOptions.DefaultInstance) return this; this.MergeUnknownFields(other.UnknownFields); return this; } - public override IBuilder<self::MethodOptions> MergeFrom(pb::CodedInputStream input) { + public override Builder MergeFrom(pb::CodedInputStream input) { return MergeFrom(input, pb::ExtensionRegistry.Empty); } - public override IBuilder<self::MethodOptions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); while (true) { diff --git a/csharp/ProtocolBuffers/DynamicMessage.cs b/csharp/ProtocolBuffers/DynamicMessage.cs index 675c4c18..9690981e 100644 --- a/csharp/ProtocolBuffers/DynamicMessage.cs +++ b/csharp/ProtocolBuffers/DynamicMessage.cs @@ -10,7 +10,7 @@ namespace Google.ProtocolBuffers { /// An implementation of IMessage that can represent arbitrary types, given a MessageaDescriptor. /// TODO: Implement appropriate generics. /// </summary> - public class DynamicMessage : AbstractMessage { + public class DynamicMessage : AbstractMessage<DynamicMessage, DynamicMessage.Builder> { private readonly MessageDescriptor type; private readonly FieldSet fields; @@ -42,8 +42,8 @@ namespace Google.ProtocolBuffers { /// Parses a message of the given type from the given stream. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, CodedInputStream input) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(input); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(input); return dynamicBuilder.BuildParsed(); } @@ -56,8 +56,8 @@ namespace Google.ProtocolBuffers { /// <param name="extensionRegistry"></param> /// <returns></returns> public static DynamicMessage ParseFrom(MessageDescriptor type, CodedInputStream input, ExtensionRegistry extensionRegistry) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder) builder.MergeFrom(input, extensionRegistry); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(input, extensionRegistry); return dynamicBuilder.BuildParsed(); } @@ -65,8 +65,8 @@ namespace Google.ProtocolBuffers { /// Parses a message of the given type from the given stream. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, Stream input) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(input); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(input); return dynamicBuilder.BuildParsed(); } @@ -78,8 +78,8 @@ namespace Google.ProtocolBuffers { /// <param name="extensionRegistry"></param> /// <returns></returns> public static DynamicMessage ParseFrom(MessageDescriptor type, Stream input, ExtensionRegistry extensionRegistry) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(input, extensionRegistry); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(input, extensionRegistry); return dynamicBuilder.BuildParsed(); } @@ -87,8 +87,8 @@ namespace Google.ProtocolBuffers { /// Parse <paramref name="data"/> as a message of the given type and return it. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, ByteString data) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(data); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(data); return dynamicBuilder.BuildParsed(); } @@ -96,8 +96,8 @@ namespace Google.ProtocolBuffers { /// Parse <paramref name="data"/> as a message of the given type and return it. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, ByteString data, ExtensionRegistry extensionRegistry) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(data, extensionRegistry); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(data, extensionRegistry); return dynamicBuilder.BuildParsed(); } @@ -106,8 +106,8 @@ namespace Google.ProtocolBuffers { /// Parse <paramref name="data"/> as a message of the given type and return it. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, byte[] data) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(data); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(data); return dynamicBuilder.BuildParsed(); } @@ -115,8 +115,8 @@ namespace Google.ProtocolBuffers { /// Parse <paramref name="data"/> as a message of the given type and return it. /// </summary> public static DynamicMessage ParseFrom(MessageDescriptor type, byte[] data, ExtensionRegistry extensionRegistry) { - IBuilder builder = CreateBuilder(type); - Builder dynamicBuilder = (Builder)builder.MergeFrom(data, extensionRegistry); + Builder builder = CreateBuilder(type); + Builder dynamicBuilder = builder.MergeFrom(data, extensionRegistry); return dynamicBuilder.BuildParsed(); } @@ -134,7 +134,7 @@ namespace Google.ProtocolBuffers { /// <param name="prototype"></param> /// <returns></returns> public static Builder CreateBuilder(IMessage prototype) { - return (Builder) new Builder(prototype.DescriptorForType).MergeFrom(prototype); + return new Builder(prototype.DescriptorForType).MergeFrom(prototype); } // ----------------------------------------------------------------- @@ -144,7 +144,7 @@ namespace Google.ProtocolBuffers { get { return type; } } - protected override IMessage DefaultInstanceForTypeImpl { + public override DynamicMessage DefaultInstanceForType { get { return GetDefaultInstance(type); } } @@ -214,7 +214,7 @@ namespace Google.ProtocolBuffers { } } - protected override IBuilder CreateBuilderForTypeImpl() { + public override Builder CreateBuilderForType() { return new Builder(type); } @@ -227,7 +227,7 @@ namespace Google.ProtocolBuffers { } } - public class Builder : AbstractBuilder { + public class Builder : AbstractBuilder<DynamicMessage, DynamicMessage.Builder> { private readonly MessageDescriptor type; private FieldSet fields; private UnknownFieldSet unknownFields; @@ -238,16 +238,16 @@ namespace Google.ProtocolBuffers { this.unknownFields = UnknownFieldSet.DefaultInstance; } - public DynamicMessage Build() { - return (DynamicMessage)((IBuilder)this).Build(); + protected override Builder ThisBuilder { + get { return this; } } - public override IBuilder Clear() { + public override Builder Clear() { fields.Clear(); return this; } - public override IBuilder MergeFrom(IMessage other) { + public override Builder MergeFrom(IMessage other) { if (other.DescriptorForType != type) { throw new ArgumentException("MergeFrom(IMessage) can only merge messages of the same type."); } @@ -255,11 +255,19 @@ namespace Google.ProtocolBuffers { return this; } - protected override IMessage BuildImpl() { + public override Builder MergeFrom(DynamicMessage other) { + if (other.DescriptorForType != type) { + throw new ArgumentException("MergeFrom(IMessage) can only merge messages of the same type."); + } + fields.MergeFrom(other); + return this; + } + + public override DynamicMessage Build() { if (!IsInitialized) { throw new UninitializedMessageException(new DynamicMessage(type, fields, unknownFields)); } - return BuildPartialImpl(); + return BuildPartial(); } /// <summary> @@ -271,10 +279,10 @@ namespace Google.ProtocolBuffers { if (!IsInitialized) { throw new UninitializedMessageException(new DynamicMessage(type, fields, unknownFields)).AsInvalidProtocolBufferException(); } - return (DynamicMessage) BuildPartialImpl(); + return BuildPartial(); } - protected override IMessage BuildPartialImpl() { + public override DynamicMessage BuildPartial() { fields.MakeImmutable(); DynamicMessage result = new DynamicMessage(type, fields, unknownFields); fields = null; @@ -282,7 +290,7 @@ namespace Google.ProtocolBuffers { return result; } - protected override IBuilder CloneImpl() { + public override Builder Clone() { Builder result = new Builder(type); result.fields.MergeFrom(fields); return result; @@ -292,7 +300,7 @@ namespace Google.ProtocolBuffers { get { return fields.IsInitializedWithRespectTo(type); } } - protected override IBuilder MergeFromImpl(CodedInputStream input, ExtensionRegistry extensionRegistry) { + public override Builder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) { UnknownFieldSet.Builder unknownFieldsBuilder = UnknownFieldSet.CreateBuilder(unknownFields); FieldSet.MergeFrom(input, unknownFieldsBuilder, extensionRegistry, this); unknownFields = unknownFieldsBuilder.Build(); @@ -303,7 +311,7 @@ namespace Google.ProtocolBuffers { get { return type; } } - protected override IMessage DefaultInstanceForTypeImpl { + public override DynamicMessage DefaultInstanceForType { get { return GetDefaultInstance(type); } } @@ -316,7 +324,7 @@ namespace Google.ProtocolBuffers { if (field.MappedType != MappedType.Message) { throw new ArgumentException("CreateBuilderForField is only valid for fields with message type."); } - return new Builder(field.MessageType); + return new Builder(field.MessageType); } public override bool HasField(FieldDescriptor field) { @@ -350,7 +358,7 @@ namespace Google.ProtocolBuffers { } } - protected override IBuilder ClearFieldImpl(FieldDescriptor field) { + public override Builder ClearField(FieldDescriptor field) { VerifyContainingType(field); fields.ClearField(field); return this; @@ -361,7 +369,7 @@ namespace Google.ProtocolBuffers { return fields.GetRepeatedFieldCount(field); } - protected override IBuilder AddRepeatedFieldImpl(FieldDescriptor field, object value) { + public override Builder AddRepeatedField(FieldDescriptor field, object value) { VerifyContainingType(field); fields.AddRepeatedField(field, value); return this; diff --git a/csharp/ProtocolBuffers/ExtendableBuilder.cs b/csharp/ProtocolBuffers/ExtendableBuilder.cs index 0c96ace6..b55d4b99 100644 --- a/csharp/ProtocolBuffers/ExtendableBuilder.cs +++ b/csharp/ProtocolBuffers/ExtendableBuilder.cs @@ -13,57 +13,55 @@ namespace Google.ProtocolBuffers { /// <summary> /// Checks if a singular extension is present /// </summary> - public bool HasExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) { + public bool HasExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) { return MessageBeingBuilt.HasExtension(extension); } /// <summary> /// Returns the number of elements in a repeated extension. /// </summary> - public int GetExtensionCount<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension) { + public int GetExtensionCount<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension) { return MessageBeingBuilt.GetExtensionCount(extension); } /// <summary> /// Returns the value of an extension. /// </summary> - public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) { + public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) { return MessageBeingBuilt.GetExtension(extension); } /// <summary> /// Returns one element of a repeated extension. /// </summary> - public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index) { + public TExtension GetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index) { return MessageBeingBuilt.GetExtension(extension, index); } /// <summary> /// Sets the value of an extension. /// </summary> - public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension, TExtension value) { + public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension, TExtension value) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions[extension.Descriptor] = extension.ToReflectionType(value); - return this; + return ThisBuilder; } /// <summary> /// Sets the value of one element of a repeated extension. /// </summary> - public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>( - GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index, TExtension value) { + public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index, TExtension value) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value); - return this; + return ThisBuilder; } /// <summary> /// Appends a value to a repeated extension. /// </summary> - public ExtendableBuilder<TMessage, TBuilder> AddExtension<TExtension>( - GeneratedExtensionBase<TMessage, IList<TExtension>> extension, TExtension value) { + public ExtendableBuilder<TMessage, TBuilder> AddExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, TExtension value) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value)); @@ -73,8 +71,7 @@ namespace Google.ProtocolBuffers { /// <summary> /// Clears an extension. /// </summary> - public ExtendableBuilder<TMessage, TBuilder> ClearExtension<TExtension>( - GeneratedExtensionBase<TMessage, TExtension> extension) { + public ExtendableBuilder<TMessage, TBuilder> ClearExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions.ClearField(extension.Descriptor); @@ -121,23 +118,23 @@ namespace Google.ProtocolBuffers { } } - public override IBuilder<TMessage> ClearField(FieldDescriptor field) { + public override TBuilder ClearField(FieldDescriptor field) { if (field.IsExtension) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyContainingType(field); message.Extensions.ClearField(field); - return this; + return ThisBuilder; } else { return base.ClearField(field); } } - public override IBuilder<TMessage> AddRepeatedField(FieldDescriptor field, object value) { + public override TBuilder AddRepeatedField(FieldDescriptor field, object value) { if (field.IsExtension) { ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt; message.VerifyContainingType(field); message.Extensions.AddRepeatedField(field, value); - return this; + return ThisBuilder; } else { return base.AddRepeatedField(field, value); } diff --git a/csharp/ProtocolBuffers/ExtendableMessage.cs b/csharp/ProtocolBuffers/ExtendableMessage.cs index 0a2d0317..60d0d583 100644 --- a/csharp/ProtocolBuffers/ExtendableMessage.cs +++ b/csharp/ProtocolBuffers/ExtendableMessage.cs @@ -5,9 +5,9 @@ using Google.ProtocolBuffers.Descriptors; using Google.ProtocolBuffers.Collections; namespace Google.ProtocolBuffers { - public abstract class ExtendableMessage<TMessage,TBuilder> : GeneratedMessage<TMessage,TBuilder> + public abstract class ExtendableMessage<TMessage, TBuilder> : GeneratedMessage<TMessage, TBuilder> where TMessage : GeneratedMessage<TMessage, TBuilder> - where TBuilder : IBuilder<TMessage> { + where TBuilder : GeneratedBuilder<TMessage, TBuilder> { protected ExtendableMessage() {} private readonly FieldSet extensions = FieldSet.CreateFieldSet(); @@ -22,21 +22,21 @@ namespace Google.ProtocolBuffers { /// <summary> /// Checks if a singular extension is present. /// </summary> - public bool HasExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) { + public bool HasExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) { return extensions.HasField(extension.Descriptor); } /// <summary> /// Returns the number of elements in a repeated extension. /// </summary> - public int GetExtensionCount<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension) { + public int GetExtensionCount<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension) { return extensions.GetRepeatedFieldCount(extension.Descriptor); } /// <summary> /// Returns the value of an extension. /// </summary> - public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) { + public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) { object value = extensions[extension.Descriptor]; if (value == null) { return (TExtension) extension.MessageDefaultInstance; @@ -48,7 +48,7 @@ namespace Google.ProtocolBuffers { /// <summary> /// Returns one element of a repeated extension. /// </summary> - public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index) { + public TExtension GetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index) { return (TExtension) extension.SingularFromReflectionType(extensions[extension.Descriptor, index]); } @@ -169,7 +169,7 @@ namespace Google.ProtocolBuffers { get { return extensions.SerializedSize; } } - internal void VerifyExtensionContainingType<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) { + internal void VerifyExtensionContainingType<TExtension>(GeneratedExtensionBase<TExtension> extension) { if (extension.Descriptor.ContainingType != DescriptorForType) { // This can only happen if someone uses unchecked operations. throw new ArgumentException("Extension is for type \"" + extension.Descriptor.ContainingType.FullName diff --git a/csharp/ProtocolBuffers/ExtensionRegistry.cs b/csharp/ProtocolBuffers/ExtensionRegistry.cs index c8f31d37..c9e05308 100644 --- a/csharp/ProtocolBuffers/ExtensionRegistry.cs +++ b/csharp/ProtocolBuffers/ExtensionRegistry.cs @@ -88,8 +88,7 @@ namespace Google.ProtocolBuffers { /// <summary> /// Add an extension from a generated file to the registry. /// </summary> - public void Add<TContainer, TExtension> (GeneratedExtensionBase<TContainer, TExtension> extension) - where TContainer : IMessage<TContainer> { + public void Add<TExtension> (GeneratedExtensionBase<TExtension> extension) { if (extension.Descriptor.MappedType == MappedType.Message) { Add(new ExtensionInfo(extension.Descriptor, extension.MessageDefaultInstance)); } else { diff --git a/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs index 18da75c4..92cc2c94 100644 --- a/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs +++ b/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs @@ -40,7 +40,7 @@ namespace Google.ProtocolBuffers.FieldAccess { // No... so let's create a builder of the right type, and merge the value in. IMessage message = (IMessage) value; - return CreateBuilder().MergeFrom(message).Build(); + return CreateBuilder().WeakMergeFrom(message).WeakBuild(); } public override void SetRepeated(IBuilder builder, int index, object value) { diff --git a/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs index 20e1ba13..8bdf95d1 100644 --- a/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs +++ b/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs @@ -38,7 +38,7 @@ namespace Google.ProtocolBuffers.FieldAccess { // No... so let's create a builder of the right type, and merge the value in. IMessage message = (IMessage) value; - return CreateBuilder().MergeFrom(message).Build(); + return CreateBuilder().WeakMergeFrom(message).WeakBuild(); } public override void SetValue(IBuilder builder, object value) { diff --git a/csharp/ProtocolBuffers/FieldSet.cs b/csharp/ProtocolBuffers/FieldSet.cs index 4f660533..79394ca4 100644 --- a/csharp/ProtocolBuffers/FieldSet.cs +++ b/csharp/ProtocolBuffers/FieldSet.cs @@ -154,19 +154,19 @@ namespace Google.ProtocolBuffers { case FieldType.Message: { IBuilder subBuilder; if (defaultFieldInstance != null) { - subBuilder = defaultFieldInstance.CreateBuilderForType(); + subBuilder = defaultFieldInstance.WeakCreateBuilderForType(); } else { subBuilder = builder.CreateBuilderForField(field); } if (!field.IsRepeated) { - subBuilder.MergeFrom((IMessage) builder[field]); + subBuilder.WeakMergeFrom((IMessage) builder[field]); } if (field.FieldType == FieldType.Group) { input.ReadGroup(field.FieldNumber, subBuilder, extensionRegistry); } else { input.ReadMessage(subBuilder, extensionRegistry); } - value = subBuilder.Build(); + value = subBuilder.WeakBuild(); break; } case FieldType.Enum: { @@ -185,7 +185,7 @@ namespace Google.ProtocolBuffers { break; } if (field.IsRepeated) { - builder.AddRepeatedField(field, value); + builder.WeakAddRepeatedField(field, value); } else { builder[field] = value; } @@ -236,16 +236,16 @@ namespace Google.ProtocolBuffers { ExtensionInfo extension = extensionRegistry[type, typeId]; if (extension != null) { field = extension.Descriptor; - subBuilder = extension.DefaultInstance.CreateBuilderForType(); + subBuilder = extension.DefaultInstance.WeakCreateBuilderForType(); IMessage originalMessage = (IMessage) builder[field]; if (originalMessage != null) { - subBuilder.MergeFrom(originalMessage); + subBuilder.WeakMergeFrom(originalMessage); } if (rawBytes != null) { // We already encountered the message. Parse it now. // TODO(jonskeet): Check this is okay. It's subtly different from the Java, as it doesn't create an input stream from rawBytes. // In fact, why don't we just call MergeFrom(rawBytes)? And what about the extension registry? - subBuilder.MergeFrom(rawBytes.CreateCodedInput()); + subBuilder.WeakMergeFrom(rawBytes.CreateCodedInput()); rawBytes = null; } } else { @@ -286,7 +286,7 @@ namespace Google.ProtocolBuffers { input.CheckLastTagWas(WireFormat.MessageSetTag.ItemEnd); if (subBuilder != null) { - builder[field] = subBuilder.Build(); + builder[field] = subBuilder.WeakBuild(); } } @@ -381,7 +381,7 @@ namespace Google.ProtocolBuffers { } /// <summary> - /// See <see cref="IBuilder.AddRepeatedField" /> + /// See <see cref="IBuilder{TMessage, TBuilder}.AddRepeatedField" /> /// </summary> internal void AddRepeatedField(FieldDescriptor field, object value) { if (!field.IsRepeated) { @@ -449,7 +449,7 @@ namespace Google.ProtocolBuffers { } /// <summary> - /// See <see cref="IBuilder.ClearField" /> + /// See <see cref="IBuilder{TMessage, TBuilder}.ClearField" /> /// </summary> public void ClearField(FieldDescriptor field) { fields.Remove(field); @@ -495,10 +495,10 @@ namespace Google.ProtocolBuffers { } } else if (field.MappedType == MappedType.Message && existingValue != null) { IMessage existingMessage = (IMessage)existingValue; - IMessage merged = existingMessage.CreateBuilderForType() - .MergeFrom(existingMessage) - .MergeFrom((IMessage)entry.Value) - .Build(); + IMessage merged = existingMessage.WeakCreateBuilderForType() + .WeakMergeFrom(existingMessage) + .WeakMergeFrom((IMessage) entry.Value) + .WeakBuild(); this[field] = merged; } else { this[field] = entry.Value; diff --git a/csharp/ProtocolBuffers/GeneratedBuilder.cs b/csharp/ProtocolBuffers/GeneratedBuilder.cs index a4114b5d..72ecfd40 100644 --- a/csharp/ProtocolBuffers/GeneratedBuilder.cs +++ b/csharp/ProtocolBuffers/GeneratedBuilder.cs @@ -13,9 +13,9 @@ namespace Google.ProtocolBuffers { /// most of the IBuilder interface using reflection. Users can ignore this class /// as an implementation detail. /// </summary> - public abstract class GeneratedBuilder<TMessage, TBuilder> : AbstractBuilder, IBuilder<TMessage> + public abstract class GeneratedBuilder<TMessage, TBuilder> : AbstractBuilder<TMessage, TBuilder> where TMessage : GeneratedMessage <TMessage, TBuilder> - where TBuilder : GeneratedBuilder<TMessage, TBuilder>, IBuilder<TMessage> { + where TBuilder : GeneratedBuilder<TMessage, TBuilder> { /// <summary> /// Returns the message being built at the moment. @@ -43,7 +43,7 @@ namespace Google.ProtocolBuffers { : MessageBeingBuilt[field]; } set { - InternalFieldAccessors[field].SetValue(this, value); + InternalFieldAccessors[field].SetValue(ThisBuilder, value); } } @@ -87,40 +87,16 @@ namespace Google.ProtocolBuffers { return MessageBeingBuilt.HasField(field); } - protected override IMessage BuildImpl() { - return Build(); - } - - protected override IMessage BuildPartialImpl() { - return BuildPartial(); - } - - protected override IBuilder CloneImpl() { - return Clone(); - } - - protected override IMessage DefaultInstanceForTypeImpl { - get { return DefaultInstanceForType; } - } - public override IBuilder CreateBuilderForField(FieldDescriptor field) { return InternalFieldAccessors[field].CreateBuilder(); } - protected override IBuilder ClearFieldImpl(FieldDescriptor field) { - return ClearField(field); - } - - protected override IBuilder AddRepeatedFieldImpl(FieldDescriptor field, object value) { - return AddRepeatedField(field, value); - } - - public virtual IBuilder<TMessage> ClearField(FieldDescriptor field) { + public override TBuilder ClearField(FieldDescriptor field) { InternalFieldAccessors[field].Clear(this); - return this; + return ThisBuilder; } - public virtual IBuilder<TMessage> MergeFrom(TMessage other) { + public override TBuilder MergeFrom(TMessage other) { if (other.DescriptorForType != InternalFieldAccessors.Descriptor) { throw new ArgumentException("Message type mismatch"); } @@ -135,78 +111,32 @@ namespace Google.ProtocolBuffers { } else if (field.MappedType == MappedType.Message && HasField(field)) { // Merge singular embedded messages IMessage oldValue = (IMessage)this[field]; - this[field] = oldValue.CreateBuilderForType() - .MergeFrom(oldValue) - .MergeFrom((IMessage)entry.Value) - .BuildPartial(); + this[field] = oldValue.WeakCreateBuilderForType() + .WeakMergeFrom(oldValue) + .WeakMergeFrom((IMessage)entry.Value) + .WeakBuildPartial(); } else { // Just overwrite this[field] = entry.Value; } } - return this; + return ThisBuilder; } - public virtual IBuilder<TMessage> MergeUnknownFields(UnknownFieldSet unknownFields) { + public override TBuilder MergeUnknownFields(UnknownFieldSet unknownFields) { TMessage result = MessageBeingBuilt; result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields) .MergeFrom(unknownFields) .Build()); - return this; + return ThisBuilder; } - public virtual IBuilder<TMessage> AddRepeatedField(FieldDescriptor field, object value) { + public override TBuilder AddRepeatedField(FieldDescriptor field, object value) { InternalFieldAccessors[field].AddRepeated(this, value); - return this; - } - - public IBuilder<TMessage> MergeFrom(ByteString data) { - ((IBuilder) this).MergeFrom(data); - return this; - } - - public IBuilder<TMessage> MergeFrom(ByteString data, ExtensionRegistry extensionRegistry) { - ((IBuilder) this).MergeFrom(data, extensionRegistry); - return this; - } - - public IBuilder<TMessage> MergeFrom(byte[] data) { - ((IBuilder) this).MergeFrom(data); - return this; - } - - public IBuilder<TMessage> MergeFrom(byte[] data, ExtensionRegistry extensionRegistry) { - ((IBuilder) this).MergeFrom(data, extensionRegistry); - return this; - } - - public IBuilder<TMessage> MergeFrom(Stream input) { - ((IBuilder) this).MergeFrom(input); - return this; - } - - public IBuilder<TMessage> MergeFrom(Stream input, ExtensionRegistry extensionRegistry) { - ((IBuilder) this).MergeFrom(input, extensionRegistry); - return this; + return ThisBuilder; } /// <summary> - /// Overridden when optimized for speed. - /// </summary> - public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input) { - ((IBuilder)this).MergeFrom(input); - return this; - } - - /// <summary> - /// Overridden when optimized for speed. - /// </summary> - public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) { - ((IBuilder)this).MergeFrom(input, extensionRegistry); - return this; - } - - /// <summary> /// Like Build(), but will wrap UninitializedMessageException in /// InvalidProtocolBufferException. /// TODO(jonskeet): This used to be generated for each class. Find out why. @@ -219,10 +149,10 @@ namespace Google.ProtocolBuffers { } /// <summary> - /// Implementation of <see cref="IBuilder{T}.Build" />. + /// Implementation of <see cref="IBuilder{TMessage, TBuilder}.Build" />. /// TODO(jonskeet): This used to be generated for each class. Find out why. /// </summary> - public TMessage Build() { + public override TMessage Build() { if (!IsInitialized) { throw new UninitializedMessageException(MessageBeingBuilt); } @@ -233,13 +163,5 @@ namespace Google.ProtocolBuffers { get { return MessageBeingBuilt.UnknownFields; } set { MessageBeingBuilt.SetUnknownFields(value); } } - - public abstract TMessage BuildPartial(); - public abstract IBuilder<TMessage> Clone(); - public abstract new IBuilder<TMessage> Clear(); - public abstract TMessage DefaultInstanceForType { get; } - - public abstract class ExtendableBuilder : GeneratedBuilder<TMessage, TBuilder> { - } } } diff --git a/csharp/ProtocolBuffers/GeneratedExtensionBase.cs b/csharp/ProtocolBuffers/GeneratedExtensionBase.cs index 2ab6d7a6..028dc76a 100644 --- a/csharp/ProtocolBuffers/GeneratedExtensionBase.cs +++ b/csharp/ProtocolBuffers/GeneratedExtensionBase.cs @@ -29,7 +29,7 @@ namespace Google.ProtocolBuffers { /// The interface implemented by both GeneratedException and GeneratedRepeatException, /// to make it easier to cope with repeats separately. /// </remarks> - public abstract class GeneratedExtensionBase<TContainer, TExtension> { + public abstract class GeneratedExtensionBase<TExtension> { private readonly FieldDescriptor descriptor; private readonly IMessage messageDefaultInstance; @@ -73,8 +73,8 @@ namespace Google.ProtocolBuffers { // GeneratedExtension manually and gives it a different type. // This should not happen in normal use. But, to be nice, we'll // copy the message to whatever type the caller was expecting. - return MessageDefaultInstance.CreateBuilderForType() - .MergeFrom((IMessage)value).Build(); + return MessageDefaultInstance.WeakCreateBuilderForType() + .WeakMergeFrom((IMessage)value).WeakBuild(); } case MappedType.Enum: // Just return a boxed int - that can be unboxed to the enum diff --git a/csharp/ProtocolBuffers/GeneratedMessage.cs b/csharp/ProtocolBuffers/GeneratedMessage.cs index 37fd2e6b..0bdf0e3f 100644 --- a/csharp/ProtocolBuffers/GeneratedMessage.cs +++ b/csharp/ProtocolBuffers/GeneratedMessage.cs @@ -13,9 +13,9 @@ namespace Google.ProtocolBuffers { /// most of the IMessage interface using reflection. Users /// can ignore this class as an implementation detail. /// </summary> - public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage, IMessage<TMessage> + public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage<TMessage, TBuilder> where TMessage : GeneratedMessage<TMessage, TBuilder> - where TBuilder : IBuilder<TMessage> { + where TBuilder : GeneratedBuilder<TMessage, TBuilder> { private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance; @@ -29,18 +29,6 @@ namespace Google.ProtocolBuffers { get { return InternalFieldAccessors.Descriptor; } } - protected override IMessage DefaultInstanceForTypeImpl { - get { return DefaultInstanceForType; } - } - - protected override IBuilder CreateBuilderForTypeImpl() { - return CreateBuilderForType(); - } - - public abstract TMessage DefaultInstanceForType { get; } - - public abstract IBuilder<TMessage> CreateBuilderForType(); - internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() { // Use a SortedList so we'll end up serializing fields in order diff --git a/csharp/ProtocolBuffers/GeneratedRepeatException.cs b/csharp/ProtocolBuffers/GeneratedRepeatException.cs index a38f5c1b..f7dee511 100644 --- a/csharp/ProtocolBuffers/GeneratedRepeatException.cs +++ b/csharp/ProtocolBuffers/GeneratedRepeatException.cs @@ -7,15 +7,15 @@ namespace Google.ProtocolBuffers { /// <summary> /// Class used to represent repeat extensions in generated classes. /// </summary> - public class GeneratedRepeatExtension<TContainer, TExtensionElement> : GeneratedExtensionBase<TContainer, IList<TExtensionElement>> { + public class GeneratedRepeatExtension<TExtensionElement> : GeneratedExtensionBase<IList<TExtensionElement>> { private GeneratedRepeatExtension(FieldDescriptor field) : base(field, typeof(TExtensionElement)) { } - public static GeneratedExtensionBase<TContainer, IList<TExtensionElement>> CreateInstance(FieldDescriptor descriptor) { + public static GeneratedExtensionBase<IList<TExtensionElement>> CreateInstance(FieldDescriptor descriptor) { if (!descriptor.IsRepeated) { throw new ArgumentException("Must call GeneratedRepeatExtension.CreateInstance() for repeated types."); } - return new GeneratedRepeatExtension<TContainer, TExtensionElement>(descriptor); + return new GeneratedRepeatExtension<TExtensionElement>(descriptor); } /// <summary> diff --git a/csharp/ProtocolBuffers/GeneratedSingleExtension.cs b/csharp/ProtocolBuffers/GeneratedSingleExtension.cs index 0adcd7ef..d9a0adcf 100644 --- a/csharp/ProtocolBuffers/GeneratedSingleExtension.cs +++ b/csharp/ProtocolBuffers/GeneratedSingleExtension.cs @@ -6,17 +6,15 @@ namespace Google.ProtocolBuffers { /// <summary> /// Generated extension for a singular field. /// </remarks> - public class GeneratedSingleExtension<TContainer, TExtension> : GeneratedExtensionBase<TContainer, TExtension> - where TContainer : IMessage<TContainer> { - + public class GeneratedSingleExtension<TExtension> : GeneratedExtensionBase<TExtension> { internal GeneratedSingleExtension(FieldDescriptor descriptor) : base(descriptor, typeof(TExtension)) { } - public static GeneratedSingleExtension<TContainer, TExtension> CreateInstance(FieldDescriptor descriptor) { + public static GeneratedSingleExtension<TExtension> CreateInstance(FieldDescriptor descriptor) { if (descriptor.IsRepeated) { throw new ArgumentException("Must call GeneratedRepeateExtension.CreateInstance() for repeated types."); } - return new GeneratedSingleExtension<TContainer, TExtension>(descriptor); + return new GeneratedSingleExtension<TExtension>(descriptor); } public override object FromReflectionType(object value) { diff --git a/csharp/ProtocolBuffers/IBuilder.cs b/csharp/ProtocolBuffers/IBuilder.cs index dcb3d272..1671c84e 100644 --- a/csharp/ProtocolBuffers/IBuilder.cs +++ b/csharp/ProtocolBuffers/IBuilder.cs @@ -44,13 +44,19 @@ namespace Google.ProtocolBuffers { /// <summary> /// Allows getting and setting of a field. - /// <see cref="IMessage{T}.Item(FieldDescriptor)"/> + /// <see cref="IMessage{TMessage, TBuilder}.Item(FieldDescriptor)"/> /// </summary> /// <param name="field"></param> /// <returns></returns> object this[FieldDescriptor field] { get; set; } /// <summary> + /// Get the message's type's descriptor. + /// <see cref="IMessage{TMessage, TBuilder}.DescriptorForType"/> + /// </summary> + MessageDescriptor DescriptorForType { get; } + + /// <summary> /// Only present in the nongeneric interface - useful for tests, but /// not as much in real life. /// </summary> @@ -63,13 +69,7 @@ namespace Google.ProtocolBuffers { IBuilder SetRepeatedField(FieldDescriptor field, int index, object value); /// <summary> - /// Get the message's type's descriptor. - /// <see cref="IMessage{T}.DescriptorForType"/> - /// </summary> - MessageDescriptor DescriptorForType { get; } - - /// <summary> - /// <see cref="IMessage{T}.GetRepeatedFieldCount"/> + /// <see cref="IMessage{TMessage, TBuilder}.GetRepeatedFieldCount"/> /// </summary> /// <param name="field"></param> /// <returns></returns> @@ -77,39 +77,40 @@ namespace Google.ProtocolBuffers { /// <summary> /// Allows getting and setting of a repeated field value. - /// <see cref="IMessage{T}.Item(FieldDescriptor, int)"/> + /// <see cref="IMessage{TMessage, TBuilder}.Item(FieldDescriptor, int)"/> /// </summary> object this[FieldDescriptor field, int index] { get; set; } /// <summary> - /// <see cref="IMessage{T}.HasField"/> + /// <see cref="IMessage{TMessage, TBuilder}.HasField"/> /// </summary> bool HasField(FieldDescriptor field); /// <summary> - /// <see cref="IMessage{T}.UnknownFields"/> + /// <see cref="IMessage{TMessage, TBuilder}.UnknownFields"/> /// </summary> UnknownFieldSet UnknownFields { get; set; } - #region Non-generic versions of generic methods in IBuilder<T> - IBuilder Clear(); - IBuilder MergeFrom(IMessage other); - IMessage Build(); - IMessage BuildPartial(); - IBuilder Clone(); - IBuilder MergeFrom(CodedInputStream input); - IBuilder MergeFrom(CodedInputStream codedInputStream, ExtensionRegistry extensionRegistry); - IMessage DefaultInstanceForType { get; } + /// <summary> + /// Create a builder for messages of the appropriate type for the given field. + /// Messages built with this can then be passed to the various mutation properties + /// and methods. + /// </summary> IBuilder CreateBuilderForField(FieldDescriptor field); - IBuilder ClearField(FieldDescriptor field); - IBuilder AddRepeatedField(FieldDescriptor field, object value); - IBuilder MergeUnknownFields(UnknownFieldSet unknownFields); - IBuilder MergeFrom(ByteString data); - IBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry); - IBuilder MergeFrom(byte[] data); - IBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry); - IBuilder MergeFrom(Stream input); - IBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry); + + #region Methods which are like those of the generic form, but without any knowledge of the type parameters + IBuilder WeakAddRepeatedField(FieldDescriptor field, object value); + IBuilder WeakClear(); + IBuilder WeakClearField(FieldDescriptor field); + IBuilder WeakMergeFrom(IMessage message); + IBuilder WeakMergeFrom(ByteString data); + IBuilder WeakMergeFrom(ByteString data, ExtensionRegistry registry); + IBuilder WeakMergeFrom(CodedInputStream input); + IBuilder WeakMergeFrom(CodedInputStream input, ExtensionRegistry registry); + IMessage WeakBuild(); + IMessage WeakBuildPartial(); + IBuilder WeakClone(); + IMessage WeakDefaultInstanceForType { get; } #endregion } @@ -117,12 +118,15 @@ namespace Google.ProtocolBuffers { /// Interface implemented by Protocol Message builders. /// TODO(jonskeet): Consider "SetXXX" methods returning the builder, as well as the properties. /// </summary> - /// <typeparam name="T">Type of message</typeparam> - public interface IBuilder<T> : IBuilder where T : IMessage<T> { + /// <typeparam name="TMessage">Type of message</typeparam> + /// <typeparam name="TBuilder">Type of builder</typeparam> + public interface IBuilder<TMessage, TBuilder> : IBuilder + where TMessage : IMessage<TMessage, TBuilder> + where TBuilder : IBuilder<TMessage, TBuilder> { /// <summary> /// Resets all fields to their default values. /// </summary> - new IBuilder<T> Clear(); + TBuilder Clear(); /// <summary> /// Merge the specified other message into the message being @@ -137,7 +141,13 @@ namespace Google.ProtocolBuffers { /// </summary> /// <param name="other"></param> /// <returns></returns> - IBuilder<T> MergeFrom(T other); + TBuilder MergeFrom(TMessage other); + + /// <summary> + /// Merge the specified other message which may be a different implementation of + /// the same message descriptor. + /// </summary> + TBuilder MergeFrom(IMessage other); /// <summary> /// Constructs the final message. Once this is called, this Builder instance @@ -148,19 +158,19 @@ namespace Google.ProtocolBuffers { /// <exception cref="UninitializedMessageException">the message /// is missing one or more required fields; use BuildPartial to bypass /// this check</exception> - new T Build(); + TMessage Build(); /// <summary> /// Like Build(), but does not throw an exception if the message is missing /// required fields. Instead, a partial message is returned. /// </summary> - new T BuildPartial(); + TMessage BuildPartial(); /// <summary> /// Clones this builder. /// TODO(jonskeet): Explain depth of clone. /// </summary> - new IBuilder<T> Clone(); + TBuilder Clone(); /// <summary> /// Parses a message of this type from the input and merges it with this @@ -181,7 +191,7 @@ namespace Google.ProtocolBuffers { /// Use BuildPartial to build, which ignores missing required fields. /// </list> /// </remarks> - new IBuilder<T> MergeFrom(CodedInputStream input); + TBuilder MergeFrom(CodedInputStream input); /// <summary> /// Like MergeFrom(CodedInputStream), but also parses extensions. @@ -189,20 +199,13 @@ namespace Google.ProtocolBuffers { /// in <paramref name="extensionRegistry"/>. Extensions not in the registry /// will be treated as unknown fields. /// </summary> - new IBuilder<T> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry); + TBuilder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry); /// <summary> /// Get's the message's type's default instance. - /// <see cref="IMessage{T}.DefaultInstanceForType" /> - /// </summary> - new T DefaultInstanceForType { get; } - - /// <summary> - /// Create a builder for messages of the appropriate type for the given field. - /// Messages built with this can then be passed to the various mutation properties - /// and methods. + /// <see cref="IMessage{TMessage}.DefaultInstanceForType" /> /// </summary> - //new IBuilder<TField> NewBuilderForField<TField>(FieldDescriptor field) where TField : IMessage<TField>; + TMessage DefaultInstanceForType { get; } /// <summary> /// Clears the field. This is exactly equivalent to calling the generated @@ -210,7 +213,7 @@ namespace Google.ProtocolBuffers { /// </summary> /// <param name="field"></param> /// <returns></returns> - new IBuilder<T> ClearField(FieldDescriptor field); + TBuilder ClearField(FieldDescriptor field); /// <summary> /// Appends the given value as a new element for the specified repeated field. @@ -219,12 +222,12 @@ namespace Google.ProtocolBuffers { /// the field does not belong to this builder's type, or the value is /// of the incorrect type /// </exception> - new IBuilder<T> AddRepeatedField(FieldDescriptor field, object value); + TBuilder AddRepeatedField(FieldDescriptor field, object value); /// <summary> /// Merge some unknown fields into the set for this message. /// </summary> - new IBuilder<T> MergeUnknownFields(UnknownFieldSet unknownFields); + TBuilder MergeUnknownFields(UnknownFieldSet unknownFields); #region Convenience methods // TODO(jonskeet): Implement these as extension methods? @@ -233,28 +236,28 @@ namespace Google.ProtocolBuffers { /// it with the message being built. This is just a small wrapper around /// MergeFrom(CodedInputStream). /// </summary> - new IBuilder<T> MergeFrom(ByteString data); + TBuilder MergeFrom(ByteString data); /// <summary> /// Parse <paramref name="data"/> as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(CodedInputStream, ExtensionRegistry). /// </summary> - new IBuilder<T> MergeFrom(ByteString data, ExtensionRegistry extensionRegistry); + TBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry); /// <summary> /// Parse <paramref name="data"/> as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(CodedInputStream). /// </summary> - new IBuilder<T> MergeFrom(byte[] data); + TBuilder MergeFrom(byte[] data); /// <summary> /// Parse <paramref name="data"/> as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(CodedInputStream, ExtensionRegistry). /// </summary> - new IBuilder<T> MergeFrom(byte[] data, ExtensionRegistry extensionRegistry); + TBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry); /// <summary> /// Parse <paramref name="input"/> as a message of this type and merge @@ -265,14 +268,14 @@ namespace Google.ProtocolBuffers { /// stream which limits reading. Despite usually reading the entire /// stream, this method never closes the stream. /// </summary> - new IBuilder<T> MergeFrom(Stream input); + TBuilder MergeFrom(Stream input); /// <summary> /// Parse <paramref name="input"/> as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(CodedInputStream, ExtensionRegistry). /// </summary> - new IBuilder<T> MergeFrom(Stream input, ExtensionRegistry extensionRegistry); + TBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry); #endregion } } diff --git a/csharp/ProtocolBuffers/IMessage.cs b/csharp/ProtocolBuffers/IMessage.cs index abb29f72..1ce18a5c 100644 --- a/csharp/ProtocolBuffers/IMessage.cs +++ b/csharp/ProtocolBuffers/IMessage.cs @@ -21,11 +21,8 @@ using Google.ProtocolBuffers.Descriptors; namespace Google.ProtocolBuffers { /// <summary> - /// Non-generic interface implemented by all Protocol Buffers messages. - /// Some members are repeated in the generic interface but with a - /// type-specific signature. Type-safe implementations - /// are encouraged to implement these non-generic members explicitly, - /// and the generic members implicitly. + /// Non-generic interface used for all parts of the API which don't require + /// any type knowledge. /// </summary> public interface IMessage { /// <summary> @@ -152,27 +149,17 @@ namespace Google.ProtocolBuffers { void WriteTo(Stream output); #endregion - #region Weakly typed members /// <summary> - /// Returns an instance of this message type with all fields set to - /// their default values. This may or may not be a singleton. This differs - /// from the DefaultInstance property of each generated message class in that this - /// method is an abstract method of IMessage whereas DefaultInstance is - /// a static property of a specific class. They return the same thing. + /// Creates a builder for the type, but in a weakly typed manner. This + /// is typically implemented by strongly typed builders by just returning + /// the result of CreateBuilderForType. /// </summary> - IMessage DefaultInstanceForType { get; } + IBuilder WeakCreateBuilderForType(); - /// <summary> - /// Constructs a new builder for a message of the same type as this message. - /// </summary> - IBuilder CreateBuilderForType(); - #endregion + IMessage WeakDefaultInstanceForType { get; } } - /// <summary> - /// Type-safe interface for all generated messages to implement. - /// </summary> - public interface IMessage<T> : IMessage where T : IMessage<T> { + public interface IMessage<TMessage> : IMessage { /// <summary> /// Returns an instance of this message type with all fields set to /// their default values. This may or may not be a singleton. This differs @@ -180,13 +167,20 @@ namespace Google.ProtocolBuffers { /// method is an abstract method of IMessage whereas DefaultInstance is /// a static property of a specific class. They return the same thing. /// </summary> - new T DefaultInstanceForType { get; } + TMessage DefaultInstanceForType { get; } + } + /// <summary> + /// Type-safe interface for all generated messages to implement. + /// </summary> + public interface IMessage<TMessage, TBuilder> : IMessage<TMessage> + where TMessage : IMessage<TMessage, TBuilder> + where TBuilder : IBuilder<TMessage, TBuilder> { #region Builders /// <summary> /// Constructs a new builder for a message of the same type as this message. /// </summary> - new IBuilder<T> CreateBuilderForType(); + TBuilder CreateBuilderForType(); #endregion } } diff --git a/csharp/ProtocolBuffers/InvalidProtocolBufferException.cs b/csharp/ProtocolBuffers/InvalidProtocolBufferException.cs index ba6950cf..48e86cc3 100644 --- a/csharp/ProtocolBuffers/InvalidProtocolBufferException.cs +++ b/csharp/ProtocolBuffers/InvalidProtocolBufferException.cs @@ -67,13 +67,13 @@ namespace Google.ProtocolBuffers { internal static InvalidProtocolBufferException RecursionLimitExceeded() { return new InvalidProtocolBufferException( "Protocol message had too many levels of nesting. May be malicious. " + - "Use CodedInputStream.setRecursionLimit() to increase the depth limit."); + "Use CodedInputStream.SetRecursionLimit() to increase the depth limit."); } internal static InvalidProtocolBufferException SizeLimitExceeded() { return new InvalidProtocolBufferException( "Protocol message was too large. May be malicious. " + - "Use CodedInputStream.setSizeLimit() to increase the size limit."); + "Use CodedInputStream.SetSizeLimit() to increase the size limit."); } } } diff --git a/csharp/ProtocolBuffers/RpcUtil.cs b/csharp/ProtocolBuffers/RpcUtil.cs index 75e6f34b..ebd3f47f 100644 --- a/csharp/ProtocolBuffers/RpcUtil.cs +++ b/csharp/ProtocolBuffers/RpcUtil.cs @@ -21,12 +21,13 @@ namespace Google.ProtocolBuffers { /// callback is given a message with a different descriptor, an /// exception will be thrown. /// </summary> - public static Action<IMessage> GeneralizeCallback<T>(Action<T> action, T defaultInstance) - where T : class, IMessage<T> { + public static Action<IMessage> GeneralizeCallback<TMessage, TBuilder>(Action<TMessage> action, TMessage defaultInstance) + where TMessage : class, IMessage<TMessage, TBuilder> + where TBuilder : IBuilder<TMessage, TBuilder> { return message => { - T castMessage = message as T; + TMessage castMessage = message as TMessage; if (castMessage == null) { - castMessage = (T) defaultInstance.CreateBuilderForType().MergeFrom(message).Build(); + castMessage = defaultInstance.CreateBuilderForType().MergeFrom(message).Build(); } action(castMessage); }; diff --git a/csharp/ProtocolBuffers/TextFormat.cs b/csharp/ProtocolBuffers/TextFormat.cs index a9a4e1b8..46d19801 100644 --- a/csharp/ProtocolBuffers/TextFormat.cs +++ b/csharp/ProtocolBuffers/TextFormat.cs @@ -44,6 +44,7 @@ namespace Google.ProtocolBuffers { } private static void Print(IMessage message, TextGenerator generator) { + // TODO(jonskeet): Check why descriptor is never used. MessageDescriptor descriptor = message.DescriptorForType; foreach (KeyValuePair<FieldDescriptor, object> entry in message.AllFields) { PrintField(entry.Key, entry.Value, generator); |