Browse Source

Merge pull request #654 from jtattermusch/csharp_hide_freeze

Remove the C# Freeze API
Jon Skeet 10 years ago
parent
commit
7a0effb9e9
35 changed files with 8 additions and 1484 deletions
  1. 0 1
      Makefile.am
  2. 0 28
      csharp/src/AddressBook/Addressbook.cs
  3. 0 56
      csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
  4. 0 36
      csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
  5. 0 17
      csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
  6. 0 88
      csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs
  7. 0 8
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs
  8. 0 8
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs
  9. 0 60
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs
  10. 0 371
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs
  11. 0 111
      csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs
  12. 2 32
      csharp/src/Google.Protobuf/Collections/MapField.cs
  13. 3 26
      csharp/src/Google.Protobuf/Collections/RepeatedField.cs
  14. 0 58
      csharp/src/Google.Protobuf/Freezable.cs
  15. 0 1
      csharp/src/Google.Protobuf/Google.Protobuf.csproj
  16. 1 33
      csharp/src/Google.Protobuf/IMessage.cs
  17. 0 265
      csharp/src/Google.Protobuf/Reflection/DescriptorProtoFile.cs
  18. 0 9
      csharp/src/Google.Protobuf/WellKnownTypes/Any.cs
  19. 0 26
      csharp/src/Google.Protobuf/WellKnownTypes/Api.cs
  20. 0 9
      csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs
  21. 0 7
      csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs
  22. 0 8
      csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs
  23. 0 8
      csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs
  24. 0 31
      csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
  25. 0 9
      csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs
  26. 0 60
      csharp/src/Google.Protobuf/WellKnownTypes/Type.cs
  27. 0 72
      csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs
  28. 0 2
      src/google/protobuf/compiler/csharp/csharp_map_field.cc
  29. 0 28
      src/google/protobuf/compiler/csharp/csharp_message.cc
  30. 0 4
      src/google/protobuf/compiler/csharp/csharp_message_field.cc
  31. 2 4
      src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
  32. 0 2
      src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
  33. 0 2
      src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
  34. 0 2
      src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
  35. 0 2
      src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc

+ 0 - 1
Makefile.am

@@ -99,7 +99,6 @@ csharp_EXTRA_DIST=                                                           \
   csharp/src/Google.Protobuf/Collections/RepeatedField.cs                    \
   csharp/src/Google.Protobuf/FieldCodec.cs                                   \
   csharp/src/Google.Protobuf/FrameworkPortability.cs                         \
-  csharp/src/Google.Protobuf/Freezable.cs                                    \
   csharp/src/Google.Protobuf/Google.Protobuf.csproj                          \
   csharp/src/Google.Protobuf/Google.Protobuf.nuspec                          \
   csharp/src/Google.Protobuf/IMessage.cs                                     \

+ 0 - 28
csharp/src/AddressBook/Addressbook.cs

@@ -74,20 +74,11 @@ namespace Google.Protobuf.Examples.AddressBook {
       return new Person(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      phones_.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -97,7 +88,6 @@ namespace Google.Protobuf.Examples.AddressBook {
     public int Id {
       get { return id_; }
       set {
-        pb::Freezable.CheckMutable(this);
         id_ = value;
       }
     }
@@ -107,7 +97,6 @@ namespace Google.Protobuf.Examples.AddressBook {
     public string Email {
       get { return email_; }
       set {
-        pb::Freezable.CheckMutable(this);
         email_ = value ?? "";
       }
     }
@@ -269,19 +258,11 @@ namespace Google.Protobuf.Examples.AddressBook {
           return new PhoneNumber(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-        }
-
         public const int NumberFieldNumber = 1;
         private string number_ = "";
         public string Number {
           get { return number_; }
           set {
-            pb::Freezable.CheckMutable(this);
             number_ = value ?? "";
           }
         }
@@ -291,7 +272,6 @@ namespace Google.Protobuf.Examples.AddressBook {
         public global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType Type {
           get { return type_; }
           set {
-            pb::Freezable.CheckMutable(this);
             type_ = value;
           }
         }
@@ -417,14 +397,6 @@ namespace Google.Protobuf.Examples.AddressBook {
       return new AddressBook(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      people_.Freeze();
-    }
-
     public const int PeopleFieldNumber = 1;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Examples.AddressBook.Person> _repeated_people_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Examples.AddressBook.Person.Parser);

+ 0 - 56
csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs

@@ -45,53 +45,6 @@ namespace Google.Protobuf.Collections
     /// </summary>
     public class MapFieldTest
     {
-        // Protobuf-specific tests
-        [Test]
-        public void Freeze_FreezesMessages()
-        {
-            var message = new ForeignMessage { C = 20 };
-            var map = new MapField<string, ForeignMessage> { { "x", message } };
-            map.Freeze();
-            Assert.IsTrue(message.IsFrozen);
-        }
-
-        [Test]
-        public void Freeze_Idempotent()
-        {
-            var message = new ForeignMessage { C = 20 };
-            var map = new MapField<string, ForeignMessage> { { "x", message } };
-            Assert.IsFalse(map.IsFrozen);
-            map.Freeze();
-            Assert.IsTrue(message.IsFrozen);
-            map.Freeze();
-            Assert.IsTrue(message.IsFrozen);
-        }
-
-        [Test]
-        public void Freeze_PreventsMutation()
-        {
-            var map = new MapField<string, string>();
-            map.Freeze();
-            Assert.IsTrue(map.IsFrozen);
-            Assert.IsTrue(map.IsReadOnly);
-            ICollection<KeyValuePair<string, string>> collection = map;
-            Assert.Throws<InvalidOperationException>(() => map["x"] = "y");
-            Assert.Throws<InvalidOperationException>(() => map.Add("x", "y"));
-            Assert.Throws<InvalidOperationException>(() => map.Remove("x"));
-            Assert.Throws<InvalidOperationException>(() => map.Clear());
-            Assert.Throws<InvalidOperationException>(() => collection.Add(NewKeyValuePair("x", "y")));
-            Assert.Throws<InvalidOperationException>(() => collection.Remove(NewKeyValuePair("x", "y")));
-        }
-
-        [Test]
-        public void Clone_ReturnsNonFrozen()
-        {
-            var map = new MapField<string, string>();
-            map.Freeze();
-            var clone = map.Clone();
-            clone.Add("x", "y");
-        }
-
         [Test]
         public void Clone_ClonesMessages()
         {
@@ -422,10 +375,6 @@ namespace Google.Protobuf.Collections
             dictionary.Remove("x");
             Assert.AreEqual(0, dictionary.Count);
             Assert.Throws<ArgumentNullException>(() => dictionary.Remove(null));
-
-            map.Freeze();
-            // Call should fail even though it clearly doesn't contain 5 as a key.
-            Assert.Throws<InvalidOperationException>(() => dictionary.Remove(5));
         }
 
         [Test]
@@ -449,8 +398,6 @@ namespace Google.Protobuf.Collections
             var map = new MapField<string, string> { { "x", "y" } };
             IDictionary dictionary = map;
             Assert.IsFalse(dictionary.IsFixedSize);
-            map.Freeze();
-            Assert.IsTrue(dictionary.IsFixedSize);
         }
 
         [Test]
@@ -504,9 +451,6 @@ namespace Google.Protobuf.Collections
             Assert.Throws<InvalidCastException>(() => dictionary["x"] = 5);
             Assert.Throws<ArgumentNullException>(() => dictionary[null] = "z");
             Assert.Throws<ArgumentNullException>(() => dictionary["x"] = null);
-            map.Freeze();
-            // Note: Not InvalidOperationException.
-            Assert.Throws<NotSupportedException>(() => dictionary["a"] = "c");
         }
 
         [Test]

+ 0 - 36
csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs

@@ -193,44 +193,10 @@ namespace Google.Protobuf.Collections
             Assert.Throws<ArgumentOutOfRangeException>(() => list[2] = "bad");
         }
 
-        [Test]
-        public void Freeze_FreezesElements()
-        {
-            var list = new RepeatedField<TestAllTypes> { new TestAllTypes() };
-            Assert.IsFalse(list[0].IsFrozen);
-            list.Freeze();
-            Assert.IsTrue(list[0].IsFrozen);
-        }
-
-        [Test]
-        public void Freeze_PreventsMutations()
-        {
-            var list = new RepeatedField<int> { 0 };
-            list.Freeze();
-            Assert.Throws<InvalidOperationException>(() => list.Add(1));
-            Assert.Throws<InvalidOperationException>(() => list[0] = 1);
-            Assert.Throws<InvalidOperationException>(() => list.Clear());
-            Assert.Throws<InvalidOperationException>(() => list.RemoveAt(0));
-            Assert.Throws<InvalidOperationException>(() => list.Remove(0));
-            Assert.Throws<InvalidOperationException>(() => list.Insert(0, 0));
-        }
-
-        [Test]
-        public void Freeze_ReportsFrozen()
-        {
-            var list = new RepeatedField<int> { 0 };
-            Assert.IsFalse(list.IsFrozen);
-            Assert.IsFalse(list.IsReadOnly);
-            list.Freeze();
-            Assert.IsTrue(list.IsFrozen);
-            Assert.IsTrue(list.IsReadOnly);
-        }
-
         [Test]
         public void Clone_ReturnsMutable()
         {
             var list = new RepeatedField<int> { 0 };
-            list.Freeze();
             var clone = list.Clone();
             clone[0] = 1;
         }
@@ -585,8 +551,6 @@ namespace Google.Protobuf.Collections
             var field = new RepeatedField<string> { "first", "second" };
             IList list = field;
             Assert.IsFalse(list.IsFixedSize);
-            field.Freeze();
-            Assert.IsTrue(list.IsFixedSize);
         }
 
         [Test]

+ 0 - 17
csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs

@@ -503,23 +503,6 @@ namespace Google.Protobuf
             Assert.AreNotEqual(original, clone);
         }
 
-        [Test]
-        public void Freeze()
-        {
-            var frozen = new TestAllTypes();
-            frozen.Freeze();
-            Assert.IsTrue(frozen.IsFrozen);
-
-            Assert.Throws<InvalidOperationException>(() => frozen.ClearOneofField());
-            Assert.Throws<InvalidOperationException>(() => frozen.SingleInt32 = 0);
-            Assert.Throws<InvalidOperationException>(() => frozen.SingleNestedMessage = null);
-            Assert.Throws<InvalidOperationException>(() => frozen.SingleNestedEnum = 0);
-            Assert.Throws<InvalidOperationException>(() => frozen.OneofString = null);
-            Assert.Throws<InvalidOperationException>(() => frozen.OneofUint32 = 0U);
-            Assert.Throws<InvalidOperationException>(() => frozen.RepeatedDouble.Add(0.0));
-            Assert.Throws<InvalidOperationException>(() => frozen.RepeatedNestedMessage.Add(new TestAllTypes.Types.NestedMessage()));
-        }
-
         [Test]
         public void OneofProperties()
         {

+ 0 - 88
csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs

@@ -216,30 +216,6 @@ namespace Google.Protobuf.TestProtos {
       return new TestMap(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      mapInt32Int32_.Freeze();
-      mapInt64Int64_.Freeze();
-      mapUint32Uint32_.Freeze();
-      mapUint64Uint64_.Freeze();
-      mapSint32Sint32_.Freeze();
-      mapSint64Sint64_.Freeze();
-      mapFixed32Fixed32_.Freeze();
-      mapFixed64Fixed64_.Freeze();
-      mapSfixed32Sfixed32_.Freeze();
-      mapSfixed64Sfixed64_.Freeze();
-      mapInt32Float_.Freeze();
-      mapInt32Double_.Freeze();
-      mapBoolBool_.Freeze();
-      mapStringString_.Freeze();
-      mapInt32Bytes_.Freeze();
-      mapInt32Enum_.Freeze();
-      mapInt32ForeignMessage_.Freeze();
-    }
-
     public const int MapInt32Int32FieldNumber = 1;
     private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
@@ -613,20 +589,11 @@ namespace Google.Protobuf.TestProtos {
       return new TestMapSubmessage(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (testMap_ != null) TestMap.Freeze();
-    }
-
     public const int TestMapFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestMap testMap_;
     public global::Google.Protobuf.TestProtos.TestMap TestMap {
       get { return testMap_; }
       set {
-        pb::Freezable.CheckMutable(this);
         testMap_ = value;
       }
     }
@@ -737,14 +704,6 @@ namespace Google.Protobuf.TestProtos {
       return new TestMessageMap(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      mapInt32Message_.Freeze();
-    }
-
     public const int MapInt32MessageFieldNumber = 1;
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec _map_mapInt32Message_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.TestAllTypes.Parser), 10);
@@ -847,15 +806,6 @@ namespace Google.Protobuf.TestProtos {
       return new TestSameTypeMap(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      map1_.Freeze();
-      map2_.Freeze();
-    }
-
     public const int Map1FieldNumber = 1;
     private static readonly pbc::MapField<int, int>.Codec _map_map1_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
@@ -988,28 +938,6 @@ namespace Google.Protobuf.TestProtos {
       return new TestArenaMap(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      mapInt32Int32_.Freeze();
-      mapInt64Int64_.Freeze();
-      mapUint32Uint32_.Freeze();
-      mapUint64Uint64_.Freeze();
-      mapSint32Sint32_.Freeze();
-      mapSint64Sint64_.Freeze();
-      mapFixed32Fixed32_.Freeze();
-      mapFixed64Fixed64_.Freeze();
-      mapSfixed32Sfixed32_.Freeze();
-      mapSfixed64Sfixed64_.Freeze();
-      mapInt32Float_.Freeze();
-      mapInt32Double_.Freeze();
-      mapBoolBool_.Freeze();
-      mapInt32Enum_.Freeze();
-      mapInt32ForeignMessage_.Freeze();
-    }
-
     public const int MapInt32Int32FieldNumber = 1;
     private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
@@ -1349,14 +1277,6 @@ namespace Google.Protobuf.TestProtos {
       return new MessageContainingEnumCalledType(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      type_.Freeze();
-    }
-
     public const int TypeFieldNumber = 1;
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec _map_type_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Parser), 10);
@@ -1468,14 +1388,6 @@ namespace Google.Protobuf.TestProtos {
       return new MessageContainingMapCalledEntry(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      entry_.Freeze();
-    }
-
     public const int EntryFieldNumber = 1;
     private static readonly pbc::MapField<int, int>.Codec _map_entry_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);

+ 0 - 8
csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs

@@ -79,19 +79,11 @@ namespace Google.Protobuf.TestProtos {
       return new ImportMessage(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int DFieldNumber = 1;
     private int d_;
     public int D {
       get { return d_; }
       set {
-        pb::Freezable.CheckMutable(this);
         d_ = value;
       }
     }

+ 0 - 8
csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs

@@ -65,19 +65,11 @@ namespace Google.Protobuf.TestProtos {
       return new PublicImportMessage(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int EFieldNumber = 1;
     private int e_;
     public int E {
       get { return e_; }
       set {
-        pb::Freezable.CheckMutable(this);
         e_ = value;
       }
     }

+ 0 - 60
csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs

@@ -96,13 +96,6 @@ namespace UnitTest.Issues.TestProtos {
       return new Issue307(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public override bool Equals(object other) {
       return Equals(other as Issue307);
     }
@@ -187,13 +180,6 @@ namespace UnitTest.Issues.TestProtos {
           return new NestedOnce(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-        }
-
         public override bool Equals(object other) {
           return Equals(other as NestedOnce);
         }
@@ -278,13 +264,6 @@ namespace UnitTest.Issues.TestProtos {
               return new NestedTwice(this);
             }
 
-            public void Freeze() {
-              if (IsFrozen) {
-                return;
-              }
-              _frozen = true;
-            }
-
             public override bool Equals(object other) {
               return Equals(other as NestedTwice);
             }
@@ -381,21 +360,11 @@ namespace UnitTest.Issues.TestProtos {
       return new NegativeEnumMessage(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      values_.Freeze();
-      packedValues_.Freeze();
-    }
-
     public const int ValueFieldNumber = 1;
     private global::UnitTest.Issues.TestProtos.NegativeEnum value_ = global::UnitTest.Issues.TestProtos.NegativeEnum.NEGATIVE_ENUM_ZERO;
     public global::UnitTest.Issues.TestProtos.NegativeEnum Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -535,13 +504,6 @@ namespace UnitTest.Issues.TestProtos {
       return new DeprecatedChild(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public override bool Equals(object other) {
       return Equals(other as DeprecatedChild);
     }
@@ -631,24 +593,12 @@ namespace UnitTest.Issues.TestProtos {
       return new DeprecatedFieldsMessage(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      primitiveArray_.Freeze();
-      if (messageValue_ != null) MessageValue.Freeze();
-      messageArray_.Freeze();
-      enumArray_.Freeze();
-    }
-
     public const int PrimitiveValueFieldNumber = 1;
     private int primitiveValue_;
     [global::System.ObsoleteAttribute()]
     public int PrimitiveValue {
       get { return primitiveValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         primitiveValue_ = value;
       }
     }
@@ -668,7 +618,6 @@ namespace UnitTest.Issues.TestProtos {
     public global::UnitTest.Issues.TestProtos.DeprecatedChild MessageValue {
       get { return messageValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         messageValue_ = value;
       }
     }
@@ -688,7 +637,6 @@ namespace UnitTest.Issues.TestProtos {
     public global::UnitTest.Issues.TestProtos.DeprecatedEnum EnumValue {
       get { return enumValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         enumValue_ = value;
       }
     }
@@ -869,19 +817,11 @@ namespace UnitTest.Issues.TestProtos {
       return new ItemField(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ItemFieldNumber = 1;
     private int item_;
     public int Item {
       get { return item_; }
       set {
-        pb::Freezable.CheckMutable(this);
         item_ = value;
       }
     }

File diff suppressed because it is too large
+ 0 - 371
csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs


+ 0 - 111
csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs

@@ -217,28 +217,11 @@ namespace Google.Protobuf.TestProtos {
       return new TestWellKnownTypes(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (anyField_ != null) AnyField.Freeze();
-      if (apiField_ != null) ApiField.Freeze();
-      if (durationField_ != null) DurationField.Freeze();
-      if (emptyField_ != null) EmptyField.Freeze();
-      if (fieldMaskField_ != null) FieldMaskField.Freeze();
-      if (sourceContextField_ != null) SourceContextField.Freeze();
-      if (structField_ != null) StructField.Freeze();
-      if (timestampField_ != null) TimestampField.Freeze();
-      if (typeField_ != null) TypeField.Freeze();
-    }
-
     public const int AnyFieldFieldNumber = 1;
     private global::Google.Protobuf.WellKnownTypes.Any anyField_;
     public global::Google.Protobuf.WellKnownTypes.Any AnyField {
       get { return anyField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         anyField_ = value;
       }
     }
@@ -248,7 +231,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Api ApiField {
       get { return apiField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         apiField_ = value;
       }
     }
@@ -258,7 +240,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
       get { return durationField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         durationField_ = value;
       }
     }
@@ -268,7 +249,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
       get { return emptyField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         emptyField_ = value;
       }
     }
@@ -278,7 +258,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
       get { return fieldMaskField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         fieldMaskField_ = value;
       }
     }
@@ -288,7 +267,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
       get { return sourceContextField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         sourceContextField_ = value;
       }
     }
@@ -298,7 +276,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Struct StructField {
       get { return structField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         structField_ = value;
       }
     }
@@ -308,7 +285,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
       get { return timestampField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         timestampField_ = value;
       }
     }
@@ -318,7 +294,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Type TypeField {
       get { return typeField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         typeField_ = value;
       }
     }
@@ -329,7 +304,6 @@ namespace Google.Protobuf.TestProtos {
     public double? DoubleField {
       get { return doubleField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         doubleField_ = value;
       }
     }
@@ -340,7 +314,6 @@ namespace Google.Protobuf.TestProtos {
     public float? FloatField {
       get { return floatField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         floatField_ = value;
       }
     }
@@ -351,7 +324,6 @@ namespace Google.Protobuf.TestProtos {
     public long? Int64Field {
       get { return int64Field_; }
       set {
-        pb::Freezable.CheckMutable(this);
         int64Field_ = value;
       }
     }
@@ -362,7 +334,6 @@ namespace Google.Protobuf.TestProtos {
     public ulong? Uint64Field {
       get { return uint64Field_; }
       set {
-        pb::Freezable.CheckMutable(this);
         uint64Field_ = value;
       }
     }
@@ -373,7 +344,6 @@ namespace Google.Protobuf.TestProtos {
     public int? Int32Field {
       get { return int32Field_; }
       set {
-        pb::Freezable.CheckMutable(this);
         int32Field_ = value;
       }
     }
@@ -384,7 +354,6 @@ namespace Google.Protobuf.TestProtos {
     public uint? Uint32Field {
       get { return uint32Field_; }
       set {
-        pb::Freezable.CheckMutable(this);
         uint32Field_ = value;
       }
     }
@@ -395,7 +364,6 @@ namespace Google.Protobuf.TestProtos {
     public bool? BoolField {
       get { return boolField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         boolField_ = value;
       }
     }
@@ -406,7 +374,6 @@ namespace Google.Protobuf.TestProtos {
     public string StringField {
       get { return stringField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         stringField_ = value;
       }
     }
@@ -417,7 +384,6 @@ namespace Google.Protobuf.TestProtos {
     public pb::ByteString BytesField {
       get { return bytesField_; }
       set {
-        pb::Freezable.CheckMutable(this);
         bytesField_ = value;
       }
     }
@@ -901,31 +867,6 @@ namespace Google.Protobuf.TestProtos {
       return new RepeatedWellKnownTypes(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      anyField_.Freeze();
-      apiField_.Freeze();
-      durationField_.Freeze();
-      emptyField_.Freeze();
-      fieldMaskField_.Freeze();
-      sourceContextField_.Freeze();
-      structField_.Freeze();
-      timestampField_.Freeze();
-      typeField_.Freeze();
-      doubleField_.Freeze();
-      floatField_.Freeze();
-      int64Field_.Freeze();
-      uint64Field_.Freeze();
-      int32Field_.Freeze();
-      uint32Field_.Freeze();
-      boolField_.Freeze();
-      stringField_.Freeze();
-      bytesField_.Freeze();
-    }
-
     public const int AnyFieldFieldNumber = 1;
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_anyField_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Any.Parser);
@@ -1372,19 +1313,10 @@ namespace Google.Protobuf.TestProtos {
       return new OneofWellKnownTypes(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (oneofField_ is IFreezable) ((IFreezable) oneofField_).Freeze();
-    }
-
     public const int AnyFieldFieldNumber = 1;
     public global::Google.Protobuf.WellKnownTypes.Any AnyField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.AnyField ? (global::Google.Protobuf.WellKnownTypes.Any) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.AnyField;
       }
@@ -1394,7 +1326,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Api ApiField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.ApiField ? (global::Google.Protobuf.WellKnownTypes.Api) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.ApiField;
       }
@@ -1404,7 +1335,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.DurationField ? (global::Google.Protobuf.WellKnownTypes.Duration) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DurationField;
       }
@@ -1414,7 +1344,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.EmptyField ? (global::Google.Protobuf.WellKnownTypes.Empty) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.EmptyField;
       }
@@ -1424,7 +1353,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField ? (global::Google.Protobuf.WellKnownTypes.FieldMask) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FieldMaskField;
       }
@@ -1434,7 +1362,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.SourceContextField ? (global::Google.Protobuf.WellKnownTypes.SourceContext) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.SourceContextField;
       }
@@ -1444,7 +1371,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Struct StructField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.StructField ? (global::Google.Protobuf.WellKnownTypes.Struct) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StructField;
       }
@@ -1454,7 +1380,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.TimestampField ? (global::Google.Protobuf.WellKnownTypes.Timestamp) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TimestampField;
       }
@@ -1464,7 +1389,6 @@ namespace Google.Protobuf.TestProtos {
     public global::Google.Protobuf.WellKnownTypes.Type TypeField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.TypeField ? (global::Google.Protobuf.WellKnownTypes.Type) oneofField_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TypeField;
       }
@@ -1475,7 +1399,6 @@ namespace Google.Protobuf.TestProtos {
     public double? DoubleField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.DoubleField ? (double?) oneofField_ : (double?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DoubleField;
       }
@@ -1486,7 +1409,6 @@ namespace Google.Protobuf.TestProtos {
     public float? FloatField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.FloatField ? (float?) oneofField_ : (float?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FloatField;
       }
@@ -1497,7 +1419,6 @@ namespace Google.Protobuf.TestProtos {
     public long? Int64Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Int64Field ? (long?) oneofField_ : (long?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int64Field;
       }
@@ -1508,7 +1429,6 @@ namespace Google.Protobuf.TestProtos {
     public ulong? Uint64Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Uint64Field ? (ulong?) oneofField_ : (ulong?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint64Field;
       }
@@ -1519,7 +1439,6 @@ namespace Google.Protobuf.TestProtos {
     public int? Int32Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Int32Field ? (int?) oneofField_ : (int?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int32Field;
       }
@@ -1530,7 +1449,6 @@ namespace Google.Protobuf.TestProtos {
     public uint? Uint32Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Uint32Field ? (uint?) oneofField_ : (uint?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint32Field;
       }
@@ -1541,7 +1459,6 @@ namespace Google.Protobuf.TestProtos {
     public bool? BoolField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.BoolField ? (bool?) oneofField_ : (bool?) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BoolField;
       }
@@ -1552,7 +1469,6 @@ namespace Google.Protobuf.TestProtos {
     public string StringField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.StringField ? (string) oneofField_ : (string) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StringField;
       }
@@ -1563,7 +1479,6 @@ namespace Google.Protobuf.TestProtos {
     public pb::ByteString BytesField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.BytesField ? (pb::ByteString) oneofField_ : (pb::ByteString) null; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofField_ = value;
         oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BytesField;
       }
@@ -1597,7 +1512,6 @@ namespace Google.Protobuf.TestProtos {
     }
 
     public void ClearOneofField() {
-      pb::Freezable.CheckMutable(this);
       oneofFieldCase_ = OneofFieldOneofCase.None;
       oneofField_ = null;
     }
@@ -2030,31 +1944,6 @@ namespace Google.Protobuf.TestProtos {
       return new MapWellKnownTypes(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      anyField_.Freeze();
-      apiField_.Freeze();
-      durationField_.Freeze();
-      emptyField_.Freeze();
-      fieldMaskField_.Freeze();
-      sourceContextField_.Freeze();
-      structField_.Freeze();
-      timestampField_.Freeze();
-      typeField_.Freeze();
-      doubleField_.Freeze();
-      floatField_.Freeze();
-      int64Field_.Freeze();
-      uint64Field_.Freeze();
-      int32Field_.Freeze();
-      uint32Field_.Freeze();
-      boolField_.Freeze();
-      stringField_.Freeze();
-      bytesField_.Freeze();
-    }
-
     public const int AnyFieldFieldNumber = 1;
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec _map_anyField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Any.Parser), 10);

+ 2 - 32
csharp/src/Google.Protobuf/Collections/MapField.cs

@@ -50,7 +50,7 @@ namespace Google.Protobuf.Collections
     /// </remarks>
     /// <typeparam name="TKey">Key type in the map. Must be a type supported by Protocol Buffer map keys.</typeparam>
     /// <typeparam name="TValue">Value type in the map. Must be a type supported by Protocol Buffers.</typeparam>
-    public sealed class MapField<TKey, TValue> : IDeepCloneable<MapField<TKey, TValue>>, IFreezable, IDictionary<TKey, TValue>, IEquatable<MapField<TKey, TValue>>, IDictionary
+    public sealed class MapField<TKey, TValue> : IDeepCloneable<MapField<TKey, TValue>>, IDictionary<TKey, TValue>, IEquatable<MapField<TKey, TValue>>, IDictionary
     {
         // TODO: Don't create the map/list until we have an entry. (Assume many maps will be empty.)
         private readonly bool allowNullValues;
@@ -119,7 +119,6 @@ namespace Google.Protobuf.Collections
 
         public bool Remove(TKey key)
         {
-            this.CheckMutable();
             ThrowHelper.ThrowIfNull(key, "key");
             LinkedListNode<KeyValuePair<TKey, TValue>> node;
             if (map.TryGetValue(key, out node))
@@ -169,7 +168,6 @@ namespace Google.Protobuf.Collections
                 {
                     ThrowHelper.ThrowIfNull(value, "value");
                 }
-                this.CheckMutable();
                 LinkedListNode<KeyValuePair<TKey, TValue>> node;
                 var pair = new KeyValuePair<TKey, TValue>(key, value);
                 if (map.TryGetValue(key, out node))
@@ -214,7 +212,6 @@ namespace Google.Protobuf.Collections
 
         public void Clear()
         {
-            this.CheckMutable();
             list.Clear();
             map.Clear();
         }
@@ -233,7 +230,6 @@ namespace Google.Protobuf.Collections
 
         bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
         {
-            this.CheckMutable();
             if (item.Key == null)
             {
                 throw new ArgumentException("Key is null", "item");
@@ -260,31 +256,6 @@ namespace Google.Protobuf.Collections
         public int Count { get { return list.Count; } }
         public bool IsReadOnly { get { return frozen; } }
 
-        public void Freeze()
-        {
-            if (IsFrozen)
-            {
-                return;
-            }
-            frozen = true;
-            // Only values can be frozen, as all the key types are simple.
-            // Everything can be done in-place, as we're just freezing objects.
-            if (typeof(IFreezable).IsAssignableFrom(typeof(TValue)))
-            {
-                for (var node = list.First; node != null; node = node.Next)
-                {
-                    var pair = node.Value;
-                    IFreezable freezableValue = pair.Value as IFreezable;
-                    if (freezableValue != null)
-                    {
-                        freezableValue.Freeze();
-                    }
-                }
-            }
-        }
-
-        public bool IsFrozen { get { return frozen; } }
-
         public override bool Equals(object other)
         {
             return Equals(other as MapField<TKey, TValue>);
@@ -405,7 +376,6 @@ namespace Google.Protobuf.Collections
         void IDictionary.Remove(object key)
         {
             ThrowHelper.ThrowIfNull(key, "key");
-            this.CheckMutable();
             if (!(key is TKey))
             {
                 return;
@@ -420,7 +390,7 @@ namespace Google.Protobuf.Collections
             temp.CopyTo(array, index);
         }
 
-        bool IDictionary.IsFixedSize { get { return IsFrozen; } }
+        bool IDictionary.IsFixedSize { get { return false; } }
 
         ICollection IDictionary.Keys { get { return (ICollection)Keys; } }
 

+ 3 - 26
csharp/src/Google.Protobuf/Collections/RepeatedField.cs

@@ -43,7 +43,7 @@ namespace Google.Protobuf.Collections
     /// restrictions (no null values) and capabilities (deep cloning and freezing).
     /// </summary>
     /// <typeparam name="T">The element type of the repeated field.</typeparam>
-    public sealed class RepeatedField<T> : IList<T>, IList, IDeepCloneable<RepeatedField<T>>, IEquatable<RepeatedField<T>>, IFreezable
+    public sealed class RepeatedField<T> : IList<T>, IList, IDeepCloneable<RepeatedField<T>>, IEquatable<RepeatedField<T>>
     {
         private static readonly T[] EmptyArray = new T[0];
         private const int MinArraySize = 8;
@@ -190,21 +190,6 @@ namespace Google.Protobuf.Collections
             }
         }
 
-        public bool IsFrozen { get { return frozen; } }
-
-        public void Freeze()
-        {
-            frozen = true;
-            IFreezable[] freezableArray = array as IFreezable[];
-            if (freezableArray != null)
-            {
-                for (int i = 0; i < count; i++)
-                {
-                    freezableArray[i].Freeze();
-                }
-            }
-        }
-
         private void EnsureSize(int size)
         {
             if (array.Length < size)
@@ -223,14 +208,12 @@ namespace Google.Protobuf.Collections
             {
                 throw new ArgumentNullException("item");
             }
-            this.CheckMutable();
             EnsureSize(count + 1);
             array[count++] = item;
         }
 
         public void Clear()
         {
-            this.CheckMutable();
             array = EmptyArray;
             count = 0;
         }
@@ -247,7 +230,6 @@ namespace Google.Protobuf.Collections
 
         public bool Remove(T item)
         {
-            this.CheckMutable();
             int index = IndexOf(item);
             if (index == -1)
             {
@@ -261,7 +243,7 @@ namespace Google.Protobuf.Collections
 
         public int Count { get { return count; } }
 
-        public bool IsReadOnly { get { return IsFrozen; } }
+        public bool IsReadOnly { get { return false; } }
 
         public void Add(RepeatedField<T> values)
         {
@@ -269,7 +251,6 @@ namespace Google.Protobuf.Collections
             {
                 throw new ArgumentNullException("values");
             }
-            this.CheckMutable();
             EnsureSize(count + values.count);
             // We know that all the values will be valid, because it's a RepeatedField.
             Array.Copy(values.array, 0, array, count, values.count);
@@ -282,7 +263,6 @@ namespace Google.Protobuf.Collections
             {
                 throw new ArgumentNullException("values");
             }
-            this.CheckMutable();
             // TODO: Check for ICollection and get the Count?
             foreach (T item in values)
             {
@@ -372,7 +352,6 @@ namespace Google.Protobuf.Collections
             {
                 throw new ArgumentOutOfRangeException("index");
             }
-            this.CheckMutable();
             EnsureSize(count + 1);
             Array.Copy(array, index, array, index + 1, count - index);
             array[index] = item;
@@ -385,7 +364,6 @@ namespace Google.Protobuf.Collections
             {
                 throw new ArgumentOutOfRangeException("index");
             }
-            this.CheckMutable();
             Array.Copy(array, index + 1, array, index, count - index - 1);
             count--;
             array[count] = default(T);
@@ -407,7 +385,6 @@ namespace Google.Protobuf.Collections
                 {
                     throw new ArgumentOutOfRangeException("index");
                 }
-                this.CheckMutable();
                 if (value == null)
                 {
                     throw new ArgumentNullException("value");
@@ -417,7 +394,7 @@ namespace Google.Protobuf.Collections
         }
 
         #region Explicit interface implementation for IList and ICollection.
-        bool IList.IsFixedSize { get { return IsFrozen; } }
+        bool IList.IsFixedSize { get { return false; } }
 
         void ICollection.CopyTo(Array array, int index)
         {

+ 0 - 58
csharp/src/Google.Protobuf/Freezable.cs

@@ -1,58 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Extension methods for <see cref="IFreezable"/> types.
-    /// </summary>
-    public static class Freezable
-    {
-        /// <summary>
-        /// Throws an <see cref="InvalidOperationException"/> if <paramref name="target"/>
-        /// is frozen.
-        /// </summary>
-        /// <remarks>
-        /// This is a convenience methods that freezable types can call before all
-        /// mutations, to protect frozen objects.
-        /// </remarks>
-        public static void CheckMutable(this IFreezable target)
-        {
-            if (target.IsFrozen)
-            {
-                throw new InvalidOperationException("Attempt to mutate frozen object");
-            }
-        }
-    }
-}

+ 0 - 1
csharp/src/Google.Protobuf/Google.Protobuf.csproj

@@ -64,7 +64,6 @@
     <Compile Include="Compatibility\TypeExtensions.cs" />
     <Compile Include="FieldCodec.cs" />
     <Compile Include="FrameworkPortability.cs" />
-    <Compile Include="Freezable.cs" />
     <Compile Include="JsonFormatter.cs" />
     <Compile Include="MessageExtensions.cs" />
     <Compile Include="IMessage.cs" />

+ 1 - 33
csharp/src/Google.Protobuf/IMessage.cs

@@ -79,7 +79,7 @@ namespace Google.Protobuf
     /// the implementation class.
     /// </summary>
     /// <typeparam name="T">The message type.</typeparam>
-    public interface IMessage<T> : IMessage, IEquatable<T>, IDeepCloneable<T>, IFreezable where T : IMessage<T>
+    public interface IMessage<T> : IMessage, IEquatable<T>, IDeepCloneable<T> where T : IMessage<T>
     {
         /// <summary>
         /// Merges the given message into this one.
@@ -97,10 +97,6 @@ namespace Google.Protobuf
     /// Additionally, due to the type constraint on <c>T</c> in <see cref="IMessage{T}"/>,
     /// it is simpler to keep this as a separate interface.
     /// </para>
-    /// <para>
-    /// Freezable types which implement this interface should always return a mutable clone,
-    /// even if the original object is frozen.
-    /// </para>
     /// </remarks>
     /// <typeparam name="T">The type itself, returned by the <see cref="Clone"/> method.</typeparam>
     public interface IDeepCloneable<T>
@@ -111,32 +107,4 @@ namespace Google.Protobuf
         /// <returns>A deep clone of this object.</returns>
         T Clone();
     }
-
-    /// <summary>
-    /// Provides a mechanism for freezing a message (or repeated field collection)
-    /// to make it immutable.
-    /// </summary>
-    /// <remarks>
-    /// Implementations are under no obligation to make this thread-safe: if a freezable
-    /// type instance is shared between threads before being frozen, and one thread then
-    /// freezes it, it is possible for other threads to make changes during the freezing
-    /// operation and also to observe stale values for mutated fields. Objects should be
-    /// frozen before being made available to other threads.
-    /// </remarks>
-    public interface IFreezable
-    {
-        /// <summary>
-        /// Freezes this object.
-        /// </summary>
-        /// <remarks>
-        /// If the object is already frozen, this method has no effect.
-        /// </remarks>
-        void Freeze();
-
-        /// <summary>
-        /// Returns whether or not this object is frozen (and therefore immutable).
-        /// </summary>
-        /// <value><c>true</c> if this object is frozen; <c>false</c> otherwise.</value>
-        bool IsFrozen { get; }
-    }
 }

+ 0 - 265
csharp/src/Google.Protobuf/Reflection/DescriptorProtoFile.cs

@@ -190,14 +190,6 @@ namespace Google.Protobuf.Reflection {
       return new FileDescriptorSet(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      file_.Freeze();
-    }
-
     public const int FileFieldNumber = 1;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FileDescriptorProto> _repeated_file_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Reflection.FileDescriptorProto.Parser);
@@ -310,28 +302,11 @@ namespace Google.Protobuf.Reflection {
       return new FileDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      dependency_.Freeze();
-      publicDependency_.Freeze();
-      weakDependency_.Freeze();
-      messageType_.Freeze();
-      enumType_.Freeze();
-      service_.Freeze();
-      extension_.Freeze();
-      if (options_ != null) Options.Freeze();
-      if (sourceCodeInfo_ != null) SourceCodeInfo.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -341,7 +316,6 @@ namespace Google.Protobuf.Reflection {
     internal string Package {
       get { return package_; }
       set {
-        pb::Freezable.CheckMutable(this);
         package_ = value ?? "";
       }
     }
@@ -407,7 +381,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FileOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -417,7 +390,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.SourceCodeInfo SourceCodeInfo {
       get { return sourceCodeInfo_; }
       set {
-        pb::Freezable.CheckMutable(this);
         sourceCodeInfo_ = value;
       }
     }
@@ -427,7 +399,6 @@ namespace Google.Protobuf.Reflection {
     internal string Syntax {
       get { return syntax_; }
       set {
-        pb::Freezable.CheckMutable(this);
         syntax_ = value ?? "";
       }
     }
@@ -682,28 +653,11 @@ namespace Google.Protobuf.Reflection {
       return new DescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      field_.Freeze();
-      extension_.Freeze();
-      nestedType_.Freeze();
-      enumType_.Freeze();
-      extensionRange_.Freeze();
-      oneofDecl_.Freeze();
-      if (options_ != null) Options.Freeze();
-      reservedRange_.Freeze();
-      reservedName_.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -761,7 +715,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.MessageOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -978,19 +931,11 @@ namespace Google.Protobuf.Reflection {
           return new ExtensionRange(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-        }
-
         public const int StartFieldNumber = 1;
         private int start_;
         internal int Start {
           get { return start_; }
           set {
-            pb::Freezable.CheckMutable(this);
             start_ = value;
           }
         }
@@ -1000,7 +945,6 @@ namespace Google.Protobuf.Reflection {
         internal int End {
           get { return end_; }
           set {
-            pb::Freezable.CheckMutable(this);
             end_ = value;
           }
         }
@@ -1122,19 +1066,11 @@ namespace Google.Protobuf.Reflection {
           return new ReservedRange(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-        }
-
         public const int StartFieldNumber = 1;
         private int start_;
         internal int Start {
           get { return start_; }
           set {
-            pb::Freezable.CheckMutable(this);
             start_ = value;
           }
         }
@@ -1144,7 +1080,6 @@ namespace Google.Protobuf.Reflection {
         internal int End {
           get { return end_; }
           set {
-            pb::Freezable.CheckMutable(this);
             end_ = value;
           }
         }
@@ -1278,20 +1213,11 @@ namespace Google.Protobuf.Reflection {
       return new FieldDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (options_ != null) Options.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -1301,7 +1227,6 @@ namespace Google.Protobuf.Reflection {
     internal int Number {
       get { return number_; }
       set {
-        pb::Freezable.CheckMutable(this);
         number_ = value;
       }
     }
@@ -1311,7 +1236,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Label Label {
       get { return label_; }
       set {
-        pb::Freezable.CheckMutable(this);
         label_ = value;
       }
     }
@@ -1321,7 +1245,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Type Type {
       get { return type_; }
       set {
-        pb::Freezable.CheckMutable(this);
         type_ = value;
       }
     }
@@ -1331,7 +1254,6 @@ namespace Google.Protobuf.Reflection {
     internal string TypeName {
       get { return typeName_; }
       set {
-        pb::Freezable.CheckMutable(this);
         typeName_ = value ?? "";
       }
     }
@@ -1341,7 +1263,6 @@ namespace Google.Protobuf.Reflection {
     internal string Extendee {
       get { return extendee_; }
       set {
-        pb::Freezable.CheckMutable(this);
         extendee_ = value ?? "";
       }
     }
@@ -1351,7 +1272,6 @@ namespace Google.Protobuf.Reflection {
     internal string DefaultValue {
       get { return defaultValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         defaultValue_ = value ?? "";
       }
     }
@@ -1361,7 +1281,6 @@ namespace Google.Protobuf.Reflection {
     internal int OneofIndex {
       get { return oneofIndex_; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofIndex_ = value;
       }
     }
@@ -1371,7 +1290,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FieldOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -1643,19 +1561,11 @@ namespace Google.Protobuf.Reflection {
       return new OneofDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -1762,21 +1672,11 @@ namespace Google.Protobuf.Reflection {
       return new EnumDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      value_.Freeze();
-      if (options_ != null) Options.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -1794,7 +1694,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.EnumOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -1932,20 +1831,11 @@ namespace Google.Protobuf.Reflection {
       return new EnumValueDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (options_ != null) Options.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -1955,7 +1845,6 @@ namespace Google.Protobuf.Reflection {
     internal int Number {
       get { return number_; }
       set {
-        pb::Freezable.CheckMutable(this);
         number_ = value;
       }
     }
@@ -1965,7 +1854,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.EnumValueOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -2110,21 +1998,11 @@ namespace Google.Protobuf.Reflection {
       return new ServiceDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      method_.Freeze();
-      if (options_ != null) Options.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -2142,7 +2020,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.ServiceOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -2283,20 +2160,11 @@ namespace Google.Protobuf.Reflection {
       return new MethodDescriptorProto(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (options_ != null) Options.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     internal string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -2306,7 +2174,6 @@ namespace Google.Protobuf.Reflection {
     internal string InputType {
       get { return inputType_; }
       set {
-        pb::Freezable.CheckMutable(this);
         inputType_ = value ?? "";
       }
     }
@@ -2316,7 +2183,6 @@ namespace Google.Protobuf.Reflection {
     internal string OutputType {
       get { return outputType_; }
       set {
-        pb::Freezable.CheckMutable(this);
         outputType_ = value ?? "";
       }
     }
@@ -2326,7 +2192,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.MethodOptions Options {
       get { return options_; }
       set {
-        pb::Freezable.CheckMutable(this);
         options_ = value;
       }
     }
@@ -2336,7 +2201,6 @@ namespace Google.Protobuf.Reflection {
     internal bool ClientStreaming {
       get { return clientStreaming_; }
       set {
-        pb::Freezable.CheckMutable(this);
         clientStreaming_ = value;
       }
     }
@@ -2346,7 +2210,6 @@ namespace Google.Protobuf.Reflection {
     internal bool ServerStreaming {
       get { return serverStreaming_; }
       set {
-        pb::Freezable.CheckMutable(this);
         serverStreaming_ = value;
       }
     }
@@ -2551,20 +2414,11 @@ namespace Google.Protobuf.Reflection {
       return new FileOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int JavaPackageFieldNumber = 1;
     private string javaPackage_ = "";
     internal string JavaPackage {
       get { return javaPackage_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaPackage_ = value ?? "";
       }
     }
@@ -2574,7 +2428,6 @@ namespace Google.Protobuf.Reflection {
     internal string JavaOuterClassname {
       get { return javaOuterClassname_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaOuterClassname_ = value ?? "";
       }
     }
@@ -2584,7 +2437,6 @@ namespace Google.Protobuf.Reflection {
     internal bool JavaMultipleFiles {
       get { return javaMultipleFiles_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaMultipleFiles_ = value;
       }
     }
@@ -2594,7 +2446,6 @@ namespace Google.Protobuf.Reflection {
     internal bool JavaGenerateEqualsAndHash {
       get { return javaGenerateEqualsAndHash_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaGenerateEqualsAndHash_ = value;
       }
     }
@@ -2604,7 +2455,6 @@ namespace Google.Protobuf.Reflection {
     internal bool JavaStringCheckUtf8 {
       get { return javaStringCheckUtf8_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaStringCheckUtf8_ = value;
       }
     }
@@ -2614,7 +2464,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FileOptions.Types.OptimizeMode OptimizeFor {
       get { return optimizeFor_; }
       set {
-        pb::Freezable.CheckMutable(this);
         optimizeFor_ = value;
       }
     }
@@ -2624,7 +2473,6 @@ namespace Google.Protobuf.Reflection {
     internal string GoPackage {
       get { return goPackage_; }
       set {
-        pb::Freezable.CheckMutable(this);
         goPackage_ = value ?? "";
       }
     }
@@ -2634,7 +2482,6 @@ namespace Google.Protobuf.Reflection {
     internal bool CcGenericServices {
       get { return ccGenericServices_; }
       set {
-        pb::Freezable.CheckMutable(this);
         ccGenericServices_ = value;
       }
     }
@@ -2644,7 +2491,6 @@ namespace Google.Protobuf.Reflection {
     internal bool JavaGenericServices {
       get { return javaGenericServices_; }
       set {
-        pb::Freezable.CheckMutable(this);
         javaGenericServices_ = value;
       }
     }
@@ -2654,7 +2500,6 @@ namespace Google.Protobuf.Reflection {
     internal bool PyGenericServices {
       get { return pyGenericServices_; }
       set {
-        pb::Freezable.CheckMutable(this);
         pyGenericServices_ = value;
       }
     }
@@ -2664,7 +2509,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -2674,7 +2518,6 @@ namespace Google.Protobuf.Reflection {
     internal bool CcEnableArenas {
       get { return ccEnableArenas_; }
       set {
-        pb::Freezable.CheckMutable(this);
         ccEnableArenas_ = value;
       }
     }
@@ -2684,7 +2527,6 @@ namespace Google.Protobuf.Reflection {
     internal string ObjcClassPrefix {
       get { return objcClassPrefix_; }
       set {
-        pb::Freezable.CheckMutable(this);
         objcClassPrefix_ = value ?? "";
       }
     }
@@ -2694,7 +2536,6 @@ namespace Google.Protobuf.Reflection {
     internal string CsharpNamespace {
       get { return csharpNamespace_; }
       set {
-        pb::Freezable.CheckMutable(this);
         csharpNamespace_ = value ?? "";
       }
     }
@@ -3040,20 +2881,11 @@ namespace Google.Protobuf.Reflection {
       return new MessageOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int MessageSetWireFormatFieldNumber = 1;
     private bool messageSetWireFormat_;
     internal bool MessageSetWireFormat {
       get { return messageSetWireFormat_; }
       set {
-        pb::Freezable.CheckMutable(this);
         messageSetWireFormat_ = value;
       }
     }
@@ -3063,7 +2895,6 @@ namespace Google.Protobuf.Reflection {
     internal bool NoStandardDescriptorAccessor {
       get { return noStandardDescriptorAccessor_; }
       set {
-        pb::Freezable.CheckMutable(this);
         noStandardDescriptorAccessor_ = value;
       }
     }
@@ -3073,7 +2904,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -3083,7 +2913,6 @@ namespace Google.Protobuf.Reflection {
     internal bool MapEntry {
       get { return mapEntry_; }
       set {
-        pb::Freezable.CheckMutable(this);
         mapEntry_ = value;
       }
     }
@@ -3259,20 +3088,11 @@ namespace Google.Protobuf.Reflection {
       return new FieldOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int CtypeFieldNumber = 1;
     private global::Google.Protobuf.Reflection.FieldOptions.Types.CType ctype_ = global::Google.Protobuf.Reflection.FieldOptions.Types.CType.STRING;
     internal global::Google.Protobuf.Reflection.FieldOptions.Types.CType Ctype {
       get { return ctype_; }
       set {
-        pb::Freezable.CheckMutable(this);
         ctype_ = value;
       }
     }
@@ -3282,7 +3102,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Packed {
       get { return packed_; }
       set {
-        pb::Freezable.CheckMutable(this);
         packed_ = value;
       }
     }
@@ -3292,7 +3111,6 @@ namespace Google.Protobuf.Reflection {
     internal global::Google.Protobuf.Reflection.FieldOptions.Types.JSType Jstype {
       get { return jstype_; }
       set {
-        pb::Freezable.CheckMutable(this);
         jstype_ = value;
       }
     }
@@ -3302,7 +3120,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Lazy {
       get { return lazy_; }
       set {
-        pb::Freezable.CheckMutable(this);
         lazy_ = value;
       }
     }
@@ -3312,7 +3129,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -3322,7 +3138,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Weak {
       get { return weak_; }
       set {
-        pb::Freezable.CheckMutable(this);
         weak_ = value;
       }
     }
@@ -3544,20 +3359,11 @@ namespace Google.Protobuf.Reflection {
       return new EnumOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int AllowAliasFieldNumber = 2;
     private bool allowAlias_;
     internal bool AllowAlias {
       get { return allowAlias_; }
       set {
-        pb::Freezable.CheckMutable(this);
         allowAlias_ = value;
       }
     }
@@ -3567,7 +3373,6 @@ namespace Google.Protobuf.Reflection {
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -3706,20 +3511,11 @@ namespace Google.Protobuf.Reflection {
       return new EnumValueOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int DeprecatedFieldNumber = 1;
     private bool deprecated_;
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -3842,20 +3638,11 @@ namespace Google.Protobuf.Reflection {
       return new ServiceOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int DeprecatedFieldNumber = 33;
     private bool deprecated_;
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -3978,20 +3765,11 @@ namespace Google.Protobuf.Reflection {
       return new MethodOptions(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      uninterpretedOption_.Freeze();
-    }
-
     public const int DeprecatedFieldNumber = 33;
     private bool deprecated_;
     internal bool Deprecated {
       get { return deprecated_; }
       set {
-        pb::Freezable.CheckMutable(this);
         deprecated_ = value;
       }
     }
@@ -4119,14 +3897,6 @@ namespace Google.Protobuf.Reflection {
       return new UninterpretedOption(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      name_.Freeze();
-    }
-
     public const int NameFieldNumber = 2;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart> _repeated_name_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart.Parser);
@@ -4140,7 +3910,6 @@ namespace Google.Protobuf.Reflection {
     internal string IdentifierValue {
       get { return identifierValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         identifierValue_ = value ?? "";
       }
     }
@@ -4150,7 +3919,6 @@ namespace Google.Protobuf.Reflection {
     internal ulong PositiveIntValue {
       get { return positiveIntValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         positiveIntValue_ = value;
       }
     }
@@ -4160,7 +3928,6 @@ namespace Google.Protobuf.Reflection {
     internal long NegativeIntValue {
       get { return negativeIntValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         negativeIntValue_ = value;
       }
     }
@@ -4170,7 +3937,6 @@ namespace Google.Protobuf.Reflection {
     internal double DoubleValue {
       get { return doubleValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         doubleValue_ = value;
       }
     }
@@ -4180,7 +3946,6 @@ namespace Google.Protobuf.Reflection {
     internal pb::ByteString StringValue {
       get { return stringValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         stringValue_ = value ?? pb::ByteString.Empty;
       }
     }
@@ -4190,7 +3955,6 @@ namespace Google.Protobuf.Reflection {
     internal string AggregateValue {
       get { return aggregateValue_; }
       set {
-        pb::Freezable.CheckMutable(this);
         aggregateValue_ = value ?? "";
       }
     }
@@ -4386,19 +4150,11 @@ namespace Google.Protobuf.Reflection {
           return new NamePart(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-        }
-
         public const int NamePart_FieldNumber = 1;
         private string namePart_ = "";
         internal string NamePart_ {
           get { return namePart_; }
           set {
-            pb::Freezable.CheckMutable(this);
             namePart_ = value ?? "";
           }
         }
@@ -4408,7 +4164,6 @@ namespace Google.Protobuf.Reflection {
         internal bool IsExtension {
           get { return isExtension_; }
           set {
-            pb::Freezable.CheckMutable(this);
             isExtension_ = value;
           }
         }
@@ -4534,14 +4289,6 @@ namespace Google.Protobuf.Reflection {
       return new SourceCodeInfo(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      location_.Freeze();
-    }
-
     public const int LocationFieldNumber = 1;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location> _repeated_location_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location.Parser);
@@ -4648,16 +4395,6 @@ namespace Google.Protobuf.Reflection {
           return new Location(this);
         }
 
-        public void Freeze() {
-          if (IsFrozen) {
-            return;
-          }
-          _frozen = true;
-          path_.Freeze();
-          span_.Freeze();
-          leadingDetachedComments_.Freeze();
-        }
-
         public const int PathFieldNumber = 1;
         private static readonly pb::FieldCodec<int> _repeated_path_codec
             = pb::FieldCodec.ForInt32(10);
@@ -4679,7 +4416,6 @@ namespace Google.Protobuf.Reflection {
         internal string LeadingComments {
           get { return leadingComments_; }
           set {
-            pb::Freezable.CheckMutable(this);
             leadingComments_ = value ?? "";
           }
         }
@@ -4689,7 +4425,6 @@ namespace Google.Protobuf.Reflection {
         internal string TrailingComments {
           get { return trailingComments_; }
           set {
-            pb::Freezable.CheckMutable(this);
             trailingComments_ = value ?? "";
           }
         }

+ 0 - 9
csharp/src/Google.Protobuf/WellKnownTypes/Any.cs

@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Any(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int TypeUrlFieldNumber = 1;
     private string typeUrl_ = "";
     public string TypeUrl {
       get { return typeUrl_; }
       set {
-        pb::Freezable.CheckMutable(this);
         typeUrl_ = value ?? "";
       }
     }
@@ -91,7 +83,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public pb::ByteString Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value ?? pb::ByteString.Empty;
       }
     }

+ 0 - 26
csharp/src/Google.Protobuf/WellKnownTypes/Api.cs

@@ -82,22 +82,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Api(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      methods_.Freeze();
-      options_.Freeze();
-      if (sourceContext_ != null) SourceContext.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -123,7 +112,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string Version {
       get { return version_; }
       set {
-        pb::Freezable.CheckMutable(this);
         version_ = value ?? "";
       }
     }
@@ -133,7 +121,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
-        pb::Freezable.CheckMutable(this);
         sourceContext_ = value;
       }
     }
@@ -299,20 +286,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Method(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      options_.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -322,7 +300,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string RequestTypeUrl {
       get { return requestTypeUrl_; }
       set {
-        pb::Freezable.CheckMutable(this);
         requestTypeUrl_ = value ?? "";
       }
     }
@@ -332,7 +309,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public bool RequestStreaming {
       get { return requestStreaming_; }
       set {
-        pb::Freezable.CheckMutable(this);
         requestStreaming_ = value;
       }
     }
@@ -342,7 +318,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string ResponseTypeUrl {
       get { return responseTypeUrl_; }
       set {
-        pb::Freezable.CheckMutable(this);
         responseTypeUrl_ = value ?? "";
       }
     }
@@ -352,7 +327,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public bool ResponseStreaming {
       get { return responseStreaming_; }
       set {
-        pb::Freezable.CheckMutable(this);
         responseStreaming_ = value;
       }
     }

+ 0 - 9
csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs

@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Duration(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int SecondsFieldNumber = 1;
     private long seconds_;
     public long Seconds {
       get { return seconds_; }
       set {
-        pb::Freezable.CheckMutable(this);
         seconds_ = value;
       }
     }
@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public int Nanos {
       get { return nanos_; }
       set {
-        pb::Freezable.CheckMutable(this);
         nanos_ = value;
       }
     }

+ 0 - 7
csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs

@@ -67,13 +67,6 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Empty(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public override bool Equals(object other) {
       return Equals(other as Empty);
     }

+ 0 - 8
csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs

@@ -68,14 +68,6 @@ namespace Google.Protobuf.WellKnownTypes {
       return new FieldMask(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      paths_.Freeze();
-    }
-
     public const int PathsFieldNumber = 1;
     private static readonly pb::FieldCodec<string> _repeated_paths_codec
         = pb::FieldCodec.ForString(10);

+ 0 - 8
csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs

@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new SourceContext(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int FileNameFieldNumber = 1;
     private string fileName_ = "";
     public string FileName {
       get { return fileName_; }
       set {
-        pb::Freezable.CheckMutable(this);
         fileName_ = value ?? "";
       }
     }

+ 0 - 31
csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs

@@ -87,14 +87,6 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Struct(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      fields_.Freeze();
-    }
-
     public const int FieldsFieldNumber = 1;
     private static readonly pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value>.Codec _map_fields_codec
         = new pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Value.Parser), 10);
@@ -216,19 +208,10 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Value(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (kind_ is IFreezable) ((IFreezable) kind_).Freeze();
-    }
-
     public const int NullValueFieldNumber = 1;
     public global::Google.Protobuf.WellKnownTypes.NullValue NullValue {
       get { return kindCase_ == KindOneofCase.NullValue ? (global::Google.Protobuf.WellKnownTypes.NullValue) kind_ : global::Google.Protobuf.WellKnownTypes.NullValue.NULL_VALUE; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
         kindCase_ = KindOneofCase.NullValue;
       }
@@ -238,7 +221,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public double NumberValue {
       get { return kindCase_ == KindOneofCase.NumberValue ? (double) kind_ : 0D; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
         kindCase_ = KindOneofCase.NumberValue;
       }
@@ -248,7 +230,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string StringValue {
       get { return kindCase_ == KindOneofCase.StringValue ? (string) kind_ : ""; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value ?? "";
         kindCase_ = KindOneofCase.StringValue;
       }
@@ -258,7 +239,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public bool BoolValue {
       get { return kindCase_ == KindOneofCase.BoolValue ? (bool) kind_ : false; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
         kindCase_ = KindOneofCase.BoolValue;
       }
@@ -268,7 +248,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.Struct StructValue {
       get { return kindCase_ == KindOneofCase.StructValue ? (global::Google.Protobuf.WellKnownTypes.Struct) kind_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
         kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.StructValue;
       }
@@ -278,7 +257,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.ListValue ListValue {
       get { return kindCase_ == KindOneofCase.ListValue ? (global::Google.Protobuf.WellKnownTypes.ListValue) kind_ : null; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
         kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.ListValue;
       }
@@ -300,7 +278,6 @@ namespace Google.Protobuf.WellKnownTypes {
     }
 
     public void ClearKind() {
-      pb::Freezable.CheckMutable(this);
       kindCase_ = KindOneofCase.None;
       kind_ = null;
     }
@@ -499,14 +476,6 @@ namespace Google.Protobuf.WellKnownTypes {
       return new ListValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      values_.Freeze();
-    }
-
     public const int ValuesFieldNumber = 1;
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Value> _repeated_values_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Value.Parser);

+ 0 - 9
csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs

@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Timestamp(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int SecondsFieldNumber = 1;
     private long seconds_;
     public long Seconds {
       get { return seconds_; }
       set {
-        pb::Freezable.CheckMutable(this);
         seconds_ = value;
       }
     }
@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public int Nanos {
       get { return nanos_; }
       set {
-        pb::Freezable.CheckMutable(this);
         nanos_ = value;
       }
     }

+ 0 - 60
csharp/src/Google.Protobuf/WellKnownTypes/Type.cs

@@ -103,23 +103,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Type(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      fields_.Freeze();
-      oneofs_.Freeze();
-      options_.Freeze();
-      if (sourceContext_ != null) SourceContext.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -153,7 +141,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
-        pb::Freezable.CheckMutable(this);
         sourceContext_ = value;
       }
     }
@@ -314,20 +301,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Field(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      options_.Freeze();
-    }
-
     public const int KindFieldNumber = 1;
     private global::Google.Protobuf.WellKnownTypes.Field.Types.Kind kind_ = global::Google.Protobuf.WellKnownTypes.Field.Types.Kind.TYPE_UNKNOWN;
     public global::Google.Protobuf.WellKnownTypes.Field.Types.Kind Kind {
       get { return kind_; }
       set {
-        pb::Freezable.CheckMutable(this);
         kind_ = value;
       }
     }
@@ -337,7 +315,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.Field.Types.Cardinality Cardinality {
       get { return cardinality_; }
       set {
-        pb::Freezable.CheckMutable(this);
         cardinality_ = value;
       }
     }
@@ -347,7 +324,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public int Number {
       get { return number_; }
       set {
-        pb::Freezable.CheckMutable(this);
         number_ = value;
       }
     }
@@ -357,7 +333,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -367,7 +342,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public string TypeUrl {
       get { return typeUrl_; }
       set {
-        pb::Freezable.CheckMutable(this);
         typeUrl_ = value ?? "";
       }
     }
@@ -377,7 +351,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public int OneofIndex {
       get { return oneofIndex_; }
       set {
-        pb::Freezable.CheckMutable(this);
         oneofIndex_ = value;
       }
     }
@@ -387,7 +360,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public bool Packed {
       get { return packed_; }
       set {
-        pb::Freezable.CheckMutable(this);
         packed_ = value;
       }
     }
@@ -642,22 +614,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Enum(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      enumvalue_.Freeze();
-      options_.Freeze();
-      if (sourceContext_ != null) SourceContext.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -683,7 +644,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
-        pb::Freezable.CheckMutable(this);
         sourceContext_ = value;
       }
     }
@@ -830,20 +790,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new EnumValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      options_.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -853,7 +804,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public int Number {
       get { return number_; }
       set {
-        pb::Freezable.CheckMutable(this);
         number_ = value;
       }
     }
@@ -992,20 +942,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Option(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-      if (value_ != null) Value.Freeze();
-    }
-
     public const int NameFieldNumber = 1;
     private string name_ = "";
     public string Name {
       get { return name_; }
       set {
-        pb::Freezable.CheckMutable(this);
         name_ = value ?? "";
       }
     }
@@ -1015,7 +956,6 @@ namespace Google.Protobuf.WellKnownTypes {
     public global::Google.Protobuf.WellKnownTypes.Any Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }

+ 0 - 72
csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs

@@ -78,19 +78,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new DoubleValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private double value_;
     public double Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -195,19 +187,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new FloatValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private float value_;
     public float Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -312,19 +296,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Int64Value(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private long value_;
     public long Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -429,19 +405,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new UInt64Value(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private ulong value_;
     public ulong Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -546,19 +514,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new Int32Value(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private int value_;
     public int Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -663,19 +623,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new UInt32Value(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private uint value_;
     public uint Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -780,19 +732,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new BoolValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private bool value_;
     public bool Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value;
       }
     }
@@ -897,19 +841,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new StringValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private string value_ = "";
     public string Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value ?? "";
       }
     }
@@ -1014,19 +950,11 @@ namespace Google.Protobuf.WellKnownTypes {
       return new BytesValue(this);
     }
 
-    public void Freeze() {
-      if (IsFrozen) {
-        return;
-      }
-      _frozen = true;
-    }
-
     public const int ValueFieldNumber = 1;
     private pb::ByteString value_ = pb::ByteString.Empty;
     public pb::ByteString Value {
       get { return value_; }
       set {
-        pb::Freezable.CheckMutable(this);
         value_ = value ?? pb::ByteString.Empty;
       }
     }

+ 0 - 2
src/google/protobuf/compiler/csharp/csharp_map_field.cc

@@ -129,8 +129,6 @@ void MapFieldGenerator::GenerateCloningCode(io::Printer* printer) {
 }
 
 void MapFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
-  printer->Print(variables_,
-    "$name$_.Freeze();\n");
 }
 
 }  // namespace csharp

+ 0 - 28
src/google/protobuf/compiler/csharp/csharp_message.cc

@@ -190,7 +190,6 @@ void MessageGenerator::Generate(io::Printer* printer) {
       "  get { return $name$Case_; }\n"
       "}\n\n"
       "public void Clear$property_name$() {\n"
-      "  pb::Freezable.CheckMutable(this);\n"
       "  $name$Case_ = $property_name$OneofCase.None;\n"
       "  $name$_ = null;\n"
       "}\n\n");
@@ -293,33 +292,6 @@ void MessageGenerator::GenerateCloningCode(io::Printer* printer) {
 }
 
 void MessageGenerator::GenerateFreezingCode(io::Printer* printer) {
-    map<string, string> vars;
-    vars["class_name"] = class_name();
-    printer->Print(
-      "public void Freeze() {\n"
-      "  if (IsFrozen) {\n"
-      "    return;\n"
-      "  }\n"
-      "  _frozen = true;\n");
-    printer->Indent();
-    // Freeze non-oneof fields first (only messages and repeated fields will actually generate any code)
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-        if (!descriptor_->field(i)->containing_oneof()) {
-            scoped_ptr<FieldGeneratorBase> generator(
-                CreateFieldGeneratorInternal(descriptor_->field(i)));
-            generator->GenerateFreezingCode(printer);
-        }
-    }
-
-    // For each oneof, if the value is freezable, freeze it. We don't actually need to know which type it was.
-    for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
-        vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false);
-        printer->Print(vars,
-            "if ($name$_ is IFreezable) ((IFreezable) $name$_).Freeze();\n");
-    }
-
-    printer->Outdent();
-    printer->Print("}\n\n");
 }
 
 void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) {

+ 0 - 4
src/google/protobuf/compiler/csharp/csharp_message_field.cc

@@ -67,7 +67,6 @@ void MessageFieldGenerator::GenerateMembers(io::Printer* printer) {
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $name$_; }\n"
     "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n"
     "    $name$_ = value;\n"
     "  }\n"
     "}\n");
@@ -134,8 +133,6 @@ void MessageFieldGenerator::GenerateCloningCode(io::Printer* printer) {
 }
 
 void MessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
-  printer->Print(variables_,
-    "if ($has_property_check$) $property_name$.Freeze();\n");
 }
 
 void MessageFieldGenerator::GenerateCodecCode(io::Printer* printer) {
@@ -161,7 +158,6 @@ void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : null; }\n"
     "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n"
     "    $oneof_name$_ = value;\n"
     "    $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n"
     "  }\n"

+ 2 - 4
src/google/protobuf/compiler/csharp/csharp_primitive_field.cc

@@ -73,8 +73,7 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) {
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $name$_; }\n"
-    "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n");
+    "  set {\n");
   if (is_value_type) {
     printer->Print(
       variables_,
@@ -176,8 +175,7 @@ void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n"
-    "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n");
+    "  set {\n");
     if (is_value_type) {
       printer->Print(
         variables_,

+ 0 - 2
src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc

@@ -117,8 +117,6 @@ void RepeatedEnumFieldGenerator::GenerateCloningCode(io::Printer* printer) {
 }
 
 void RepeatedEnumFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
-  printer->Print(variables_,
-    "$name$_.Freeze();\n");
 }
 
 }  // namespace csharp

+ 0 - 2
src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc

@@ -132,8 +132,6 @@ void RepeatedMessageFieldGenerator::GenerateCloningCode(io::Printer* printer) {
 }
 
 void RepeatedMessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
-  printer->Print(variables_,
-    "$name$_.Freeze();\n");
 }
 
 }  // namespace csharp

+ 0 - 2
src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc

@@ -115,8 +115,6 @@ void RepeatedPrimitiveFieldGenerator::GenerateCloningCode(io::Printer* printer)
 }
 
 void RepeatedPrimitiveFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
-  printer->Print(variables_,
-    "$name$_.Freeze();\n");
 }
 
 }  // namespace csharp

+ 0 - 2
src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc

@@ -76,7 +76,6 @@ void WrapperFieldGenerator::GenerateMembers(io::Printer* printer) {
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $name$_; }\n"
     "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n"
     "    $name$_ = value;\n"
     "  }\n"
     "}\n");
@@ -172,7 +171,6 @@ void WrapperOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
     "$access_level$ $type_name$ $property_name$ {\n"
     "  get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : ($type_name$) null; }\n"
     "  set {\n"
-    "    pb::Freezable.CheckMutable(this);\n"
     "    $oneof_name$_ = value;\n"
     "    $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n"
     "  }\n"

Some files were not shown because too many files changed in this diff