Commit 7a0effb9 authored by Jon Skeet's avatar Jon Skeet

Merge pull request #654 from jtattermusch/csharp_hide_freeze

Remove the C# Freeze API
parents 9cfea1d6 7ec023ac
...@@ -99,7 +99,6 @@ csharp_EXTRA_DIST= \ ...@@ -99,7 +99,6 @@ csharp_EXTRA_DIST= \
csharp/src/Google.Protobuf/Collections/RepeatedField.cs \ csharp/src/Google.Protobuf/Collections/RepeatedField.cs \
csharp/src/Google.Protobuf/FieldCodec.cs \ csharp/src/Google.Protobuf/FieldCodec.cs \
csharp/src/Google.Protobuf/FrameworkPortability.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.csproj \
csharp/src/Google.Protobuf/Google.Protobuf.nuspec \ csharp/src/Google.Protobuf/Google.Protobuf.nuspec \
csharp/src/Google.Protobuf/IMessage.cs \ csharp/src/Google.Protobuf/IMessage.cs \
......
...@@ -74,20 +74,11 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -74,20 +74,11 @@ namespace Google.Protobuf.Examples.AddressBook {
return new Person(this); return new Person(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
phones_.Freeze();
}
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -97,7 +88,6 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -97,7 +88,6 @@ namespace Google.Protobuf.Examples.AddressBook {
public int Id { public int Id {
get { return id_; } get { return id_; }
set { set {
pb::Freezable.CheckMutable(this);
id_ = value; id_ = value;
} }
} }
...@@ -107,7 +97,6 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -107,7 +97,6 @@ namespace Google.Protobuf.Examples.AddressBook {
public string Email { public string Email {
get { return email_; } get { return email_; }
set { set {
pb::Freezable.CheckMutable(this);
email_ = value ?? ""; email_ = value ?? "";
} }
} }
...@@ -269,19 +258,11 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -269,19 +258,11 @@ namespace Google.Protobuf.Examples.AddressBook {
return new PhoneNumber(this); return new PhoneNumber(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int NumberFieldNumber = 1; public const int NumberFieldNumber = 1;
private string number_ = ""; private string number_ = "";
public string Number { public string Number {
get { return number_; } get { return number_; }
set { set {
pb::Freezable.CheckMutable(this);
number_ = value ?? ""; number_ = value ?? "";
} }
} }
...@@ -291,7 +272,6 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -291,7 +272,6 @@ namespace Google.Protobuf.Examples.AddressBook {
public global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType Type { public global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType Type {
get { return type_; } get { return type_; }
set { set {
pb::Freezable.CheckMutable(this);
type_ = value; type_ = value;
} }
} }
...@@ -417,14 +397,6 @@ namespace Google.Protobuf.Examples.AddressBook { ...@@ -417,14 +397,6 @@ namespace Google.Protobuf.Examples.AddressBook {
return new AddressBook(this); return new AddressBook(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
people_.Freeze();
}
public const int PeopleFieldNumber = 1; public const int PeopleFieldNumber = 1;
private static readonly pb::FieldCodec<global::Google.Protobuf.Examples.AddressBook.Person> _repeated_people_codec 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); = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Examples.AddressBook.Person.Parser);
......
...@@ -45,53 +45,6 @@ namespace Google.Protobuf.Collections ...@@ -45,53 +45,6 @@ namespace Google.Protobuf.Collections
/// </summary> /// </summary>
public class MapFieldTest 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] [Test]
public void Clone_ClonesMessages() public void Clone_ClonesMessages()
{ {
...@@ -422,10 +375,6 @@ namespace Google.Protobuf.Collections ...@@ -422,10 +375,6 @@ namespace Google.Protobuf.Collections
dictionary.Remove("x"); dictionary.Remove("x");
Assert.AreEqual(0, dictionary.Count); Assert.AreEqual(0, dictionary.Count);
Assert.Throws<ArgumentNullException>(() => dictionary.Remove(null)); 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] [Test]
...@@ -449,8 +398,6 @@ namespace Google.Protobuf.Collections ...@@ -449,8 +398,6 @@ namespace Google.Protobuf.Collections
var map = new MapField<string, string> { { "x", "y" } }; var map = new MapField<string, string> { { "x", "y" } };
IDictionary dictionary = map; IDictionary dictionary = map;
Assert.IsFalse(dictionary.IsFixedSize); Assert.IsFalse(dictionary.IsFixedSize);
map.Freeze();
Assert.IsTrue(dictionary.IsFixedSize);
} }
[Test] [Test]
...@@ -504,9 +451,6 @@ namespace Google.Protobuf.Collections ...@@ -504,9 +451,6 @@ namespace Google.Protobuf.Collections
Assert.Throws<InvalidCastException>(() => dictionary["x"] = 5); Assert.Throws<InvalidCastException>(() => dictionary["x"] = 5);
Assert.Throws<ArgumentNullException>(() => dictionary[null] = "z"); Assert.Throws<ArgumentNullException>(() => dictionary[null] = "z");
Assert.Throws<ArgumentNullException>(() => dictionary["x"] = null); Assert.Throws<ArgumentNullException>(() => dictionary["x"] = null);
map.Freeze();
// Note: Not InvalidOperationException.
Assert.Throws<NotSupportedException>(() => dictionary["a"] = "c");
} }
[Test] [Test]
......
...@@ -193,44 +193,10 @@ namespace Google.Protobuf.Collections ...@@ -193,44 +193,10 @@ namespace Google.Protobuf.Collections
Assert.Throws<ArgumentOutOfRangeException>(() => list[2] = "bad"); 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] [Test]
public void Clone_ReturnsMutable() public void Clone_ReturnsMutable()
{ {
var list = new RepeatedField<int> { 0 }; var list = new RepeatedField<int> { 0 };
list.Freeze();
var clone = list.Clone(); var clone = list.Clone();
clone[0] = 1; clone[0] = 1;
} }
...@@ -585,8 +551,6 @@ namespace Google.Protobuf.Collections ...@@ -585,8 +551,6 @@ namespace Google.Protobuf.Collections
var field = new RepeatedField<string> { "first", "second" }; var field = new RepeatedField<string> { "first", "second" };
IList list = field; IList list = field;
Assert.IsFalse(list.IsFixedSize); Assert.IsFalse(list.IsFixedSize);
field.Freeze();
Assert.IsTrue(list.IsFixedSize);
} }
[Test] [Test]
......
...@@ -503,23 +503,6 @@ namespace Google.Protobuf ...@@ -503,23 +503,6 @@ namespace Google.Protobuf
Assert.AreNotEqual(original, clone); 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] [Test]
public void OneofProperties() public void OneofProperties()
{ {
......
...@@ -216,30 +216,6 @@ namespace Google.Protobuf.TestProtos { ...@@ -216,30 +216,6 @@ namespace Google.Protobuf.TestProtos {
return new TestMap(this); 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; public const int MapInt32Int32FieldNumber = 1;
private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec 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); = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
...@@ -613,20 +589,11 @@ namespace Google.Protobuf.TestProtos { ...@@ -613,20 +589,11 @@ namespace Google.Protobuf.TestProtos {
return new TestMapSubmessage(this); return new TestMapSubmessage(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
if (testMap_ != null) TestMap.Freeze();
}
public const int TestMapFieldNumber = 1; public const int TestMapFieldNumber = 1;
private global::Google.Protobuf.TestProtos.TestMap testMap_; private global::Google.Protobuf.TestProtos.TestMap testMap_;
public global::Google.Protobuf.TestProtos.TestMap TestMap { public global::Google.Protobuf.TestProtos.TestMap TestMap {
get { return testMap_; } get { return testMap_; }
set { set {
pb::Freezable.CheckMutable(this);
testMap_ = value; testMap_ = value;
} }
} }
...@@ -737,14 +704,6 @@ namespace Google.Protobuf.TestProtos { ...@@ -737,14 +704,6 @@ namespace Google.Protobuf.TestProtos {
return new TestMessageMap(this); return new TestMessageMap(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
mapInt32Message_.Freeze();
}
public const int MapInt32MessageFieldNumber = 1; public const int MapInt32MessageFieldNumber = 1;
private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec _map_mapInt32Message_codec 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); = 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 { ...@@ -847,15 +806,6 @@ namespace Google.Protobuf.TestProtos {
return new TestSameTypeMap(this); return new TestSameTypeMap(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
map1_.Freeze();
map2_.Freeze();
}
public const int Map1FieldNumber = 1; public const int Map1FieldNumber = 1;
private static readonly pbc::MapField<int, int>.Codec _map_map1_codec 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); = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
...@@ -988,28 +938,6 @@ namespace Google.Protobuf.TestProtos { ...@@ -988,28 +938,6 @@ namespace Google.Protobuf.TestProtos {
return new TestArenaMap(this); 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; public const int MapInt32Int32FieldNumber = 1;
private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec 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); = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
...@@ -1349,14 +1277,6 @@ namespace Google.Protobuf.TestProtos { ...@@ -1349,14 +1277,6 @@ namespace Google.Protobuf.TestProtos {
return new MessageContainingEnumCalledType(this); return new MessageContainingEnumCalledType(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
type_.Freeze();
}
public const int TypeFieldNumber = 1; public const int TypeFieldNumber = 1;
private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec _map_type_codec 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); = 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 { ...@@ -1468,14 +1388,6 @@ namespace Google.Protobuf.TestProtos {
return new MessageContainingMapCalledEntry(this); return new MessageContainingMapCalledEntry(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
entry_.Freeze();
}
public const int EntryFieldNumber = 1; public const int EntryFieldNumber = 1;
private static readonly pbc::MapField<int, int>.Codec _map_entry_codec 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); = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
......
...@@ -79,19 +79,11 @@ namespace Google.Protobuf.TestProtos { ...@@ -79,19 +79,11 @@ namespace Google.Protobuf.TestProtos {
return new ImportMessage(this); return new ImportMessage(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int DFieldNumber = 1; public const int DFieldNumber = 1;
private int d_; private int d_;
public int D { public int D {
get { return d_; } get { return d_; }
set { set {
pb::Freezable.CheckMutable(this);
d_ = value; d_ = value;
} }
} }
......
...@@ -65,19 +65,11 @@ namespace Google.Protobuf.TestProtos { ...@@ -65,19 +65,11 @@ namespace Google.Protobuf.TestProtos {
return new PublicImportMessage(this); return new PublicImportMessage(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int EFieldNumber = 1; public const int EFieldNumber = 1;
private int e_; private int e_;
public int E { public int E {
get { return e_; } get { return e_; }
set { set {
pb::Freezable.CheckMutable(this);
e_ = value; e_ = value;
} }
} }
......
...@@ -96,13 +96,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -96,13 +96,6 @@ namespace UnitTest.Issues.TestProtos {
return new Issue307(this); return new Issue307(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as Issue307); return Equals(other as Issue307);
} }
...@@ -187,13 +180,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -187,13 +180,6 @@ namespace UnitTest.Issues.TestProtos {
return new NestedOnce(this); return new NestedOnce(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as NestedOnce); return Equals(other as NestedOnce);
} }
...@@ -278,13 +264,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -278,13 +264,6 @@ namespace UnitTest.Issues.TestProtos {
return new NestedTwice(this); return new NestedTwice(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as NestedTwice); return Equals(other as NestedTwice);
} }
...@@ -381,21 +360,11 @@ namespace UnitTest.Issues.TestProtos { ...@@ -381,21 +360,11 @@ namespace UnitTest.Issues.TestProtos {
return new NegativeEnumMessage(this); return new NegativeEnumMessage(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
values_.Freeze();
packedValues_.Freeze();
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private global::UnitTest.Issues.TestProtos.NegativeEnum value_ = global::UnitTest.Issues.TestProtos.NegativeEnum.NEGATIVE_ENUM_ZERO; private global::UnitTest.Issues.TestProtos.NegativeEnum value_ = global::UnitTest.Issues.TestProtos.NegativeEnum.NEGATIVE_ENUM_ZERO;
public global::UnitTest.Issues.TestProtos.NegativeEnum Value { public global::UnitTest.Issues.TestProtos.NegativeEnum Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -535,13 +504,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -535,13 +504,6 @@ namespace UnitTest.Issues.TestProtos {
return new DeprecatedChild(this); return new DeprecatedChild(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as DeprecatedChild); return Equals(other as DeprecatedChild);
} }
...@@ -631,24 +593,12 @@ namespace UnitTest.Issues.TestProtos { ...@@ -631,24 +593,12 @@ namespace UnitTest.Issues.TestProtos {
return new DeprecatedFieldsMessage(this); 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; public const int PrimitiveValueFieldNumber = 1;
private int primitiveValue_; private int primitiveValue_;
[global::System.ObsoleteAttribute()] [global::System.ObsoleteAttribute()]
public int PrimitiveValue { public int PrimitiveValue {
get { return primitiveValue_; } get { return primitiveValue_; }
set { set {
pb::Freezable.CheckMutable(this);
primitiveValue_ = value; primitiveValue_ = value;
} }
} }
...@@ -668,7 +618,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -668,7 +618,6 @@ namespace UnitTest.Issues.TestProtos {
public global::UnitTest.Issues.TestProtos.DeprecatedChild MessageValue { public global::UnitTest.Issues.TestProtos.DeprecatedChild MessageValue {
get { return messageValue_; } get { return messageValue_; }
set { set {
pb::Freezable.CheckMutable(this);
messageValue_ = value; messageValue_ = value;
} }
} }
...@@ -688,7 +637,6 @@ namespace UnitTest.Issues.TestProtos { ...@@ -688,7 +637,6 @@ namespace UnitTest.Issues.TestProtos {
public global::UnitTest.Issues.TestProtos.DeprecatedEnum EnumValue { public global::UnitTest.Issues.TestProtos.DeprecatedEnum EnumValue {
get { return enumValue_; } get { return enumValue_; }
set { set {
pb::Freezable.CheckMutable(this);
enumValue_ = value; enumValue_ = value;
} }
} }
...@@ -869,19 +817,11 @@ namespace UnitTest.Issues.TestProtos { ...@@ -869,19 +817,11 @@ namespace UnitTest.Issues.TestProtos {
return new ItemField(this); return new ItemField(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ItemFieldNumber = 1; public const int ItemFieldNumber = 1;
private int item_; private int item_;
public int Item { public int Item {
get { return item_; } get { return item_; }
set { set {
pb::Freezable.CheckMutable(this);
item_ = value; item_ = value;
} }
} }
......
...@@ -50,7 +50,7 @@ namespace Google.Protobuf.Collections ...@@ -50,7 +50,7 @@ namespace Google.Protobuf.Collections
/// </remarks> /// </remarks>
/// <typeparam name="TKey">Key type in the map. Must be a type supported by Protocol Buffer map keys.</typeparam> /// <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> /// <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.) // TODO: Don't create the map/list until we have an entry. (Assume many maps will be empty.)
private readonly bool allowNullValues; private readonly bool allowNullValues;
...@@ -119,7 +119,6 @@ namespace Google.Protobuf.Collections ...@@ -119,7 +119,6 @@ namespace Google.Protobuf.Collections
public bool Remove(TKey key) public bool Remove(TKey key)
{ {
this.CheckMutable();
ThrowHelper.ThrowIfNull(key, "key"); ThrowHelper.ThrowIfNull(key, "key");
LinkedListNode<KeyValuePair<TKey, TValue>> node; LinkedListNode<KeyValuePair<TKey, TValue>> node;
if (map.TryGetValue(key, out node)) if (map.TryGetValue(key, out node))
...@@ -169,7 +168,6 @@ namespace Google.Protobuf.Collections ...@@ -169,7 +168,6 @@ namespace Google.Protobuf.Collections
{ {
ThrowHelper.ThrowIfNull(value, "value"); ThrowHelper.ThrowIfNull(value, "value");
} }
this.CheckMutable();
LinkedListNode<KeyValuePair<TKey, TValue>> node; LinkedListNode<KeyValuePair<TKey, TValue>> node;
var pair = new KeyValuePair<TKey, TValue>(key, value); var pair = new KeyValuePair<TKey, TValue>(key, value);
if (map.TryGetValue(key, out node)) if (map.TryGetValue(key, out node))
...@@ -214,7 +212,6 @@ namespace Google.Protobuf.Collections ...@@ -214,7 +212,6 @@ namespace Google.Protobuf.Collections
public void Clear() public void Clear()
{ {
this.CheckMutable();
list.Clear(); list.Clear();
map.Clear(); map.Clear();
} }
...@@ -233,7 +230,6 @@ namespace Google.Protobuf.Collections ...@@ -233,7 +230,6 @@ namespace Google.Protobuf.Collections
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item) bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
{ {
this.CheckMutable();
if (item.Key == null) if (item.Key == null)
{ {
throw new ArgumentException("Key is null", "item"); throw new ArgumentException("Key is null", "item");
...@@ -260,31 +256,6 @@ namespace Google.Protobuf.Collections ...@@ -260,31 +256,6 @@ namespace Google.Protobuf.Collections
public int Count { get { return list.Count; } } public int Count { get { return list.Count; } }
public bool IsReadOnly { get { return frozen; } } 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) public override bool Equals(object other)
{ {
return Equals(other as MapField<TKey, TValue>); return Equals(other as MapField<TKey, TValue>);
...@@ -405,7 +376,6 @@ namespace Google.Protobuf.Collections ...@@ -405,7 +376,6 @@ namespace Google.Protobuf.Collections
void IDictionary.Remove(object key) void IDictionary.Remove(object key)
{ {
ThrowHelper.ThrowIfNull(key, "key"); ThrowHelper.ThrowIfNull(key, "key");
this.CheckMutable();
if (!(key is TKey)) if (!(key is TKey))
{ {
return; return;
...@@ -420,7 +390,7 @@ namespace Google.Protobuf.Collections ...@@ -420,7 +390,7 @@ namespace Google.Protobuf.Collections
temp.CopyTo(array, index); temp.CopyTo(array, index);
} }
bool IDictionary.IsFixedSize { get { return IsFrozen; } } bool IDictionary.IsFixedSize { get { return false; } }
ICollection IDictionary.Keys { get { return (ICollection)Keys; } } ICollection IDictionary.Keys { get { return (ICollection)Keys; } }
......
...@@ -43,7 +43,7 @@ namespace Google.Protobuf.Collections ...@@ -43,7 +43,7 @@ namespace Google.Protobuf.Collections
/// restrictions (no null values) and capabilities (deep cloning and freezing). /// restrictions (no null values) and capabilities (deep cloning and freezing).
/// </summary> /// </summary>
/// <typeparam name="T">The element type of the repeated field.</typeparam> /// <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 static readonly T[] EmptyArray = new T[0];
private const int MinArraySize = 8; private const int MinArraySize = 8;
...@@ -190,21 +190,6 @@ namespace Google.Protobuf.Collections ...@@ -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) private void EnsureSize(int size)
{ {
if (array.Length < size) if (array.Length < size)
...@@ -223,14 +208,12 @@ namespace Google.Protobuf.Collections ...@@ -223,14 +208,12 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentNullException("item"); throw new ArgumentNullException("item");
} }
this.CheckMutable();
EnsureSize(count + 1); EnsureSize(count + 1);
array[count++] = item; array[count++] = item;
} }
public void Clear() public void Clear()
{ {
this.CheckMutable();
array = EmptyArray; array = EmptyArray;
count = 0; count = 0;
} }
...@@ -247,7 +230,6 @@ namespace Google.Protobuf.Collections ...@@ -247,7 +230,6 @@ namespace Google.Protobuf.Collections
public bool Remove(T item) public bool Remove(T item)
{ {
this.CheckMutable();
int index = IndexOf(item); int index = IndexOf(item);
if (index == -1) if (index == -1)
{ {
...@@ -261,7 +243,7 @@ namespace Google.Protobuf.Collections ...@@ -261,7 +243,7 @@ namespace Google.Protobuf.Collections
public int Count { get { return count; } } public int Count { get { return count; } }
public bool IsReadOnly { get { return IsFrozen; } } public bool IsReadOnly { get { return false; } }
public void Add(RepeatedField<T> values) public void Add(RepeatedField<T> values)
{ {
...@@ -269,7 +251,6 @@ namespace Google.Protobuf.Collections ...@@ -269,7 +251,6 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentNullException("values"); throw new ArgumentNullException("values");
} }
this.CheckMutable();
EnsureSize(count + values.count); EnsureSize(count + values.count);
// We know that all the values will be valid, because it's a RepeatedField. // We know that all the values will be valid, because it's a RepeatedField.
Array.Copy(values.array, 0, array, count, values.count); Array.Copy(values.array, 0, array, count, values.count);
...@@ -282,7 +263,6 @@ namespace Google.Protobuf.Collections ...@@ -282,7 +263,6 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentNullException("values"); throw new ArgumentNullException("values");
} }
this.CheckMutable();
// TODO: Check for ICollection and get the Count? // TODO: Check for ICollection and get the Count?
foreach (T item in values) foreach (T item in values)
{ {
...@@ -372,7 +352,6 @@ namespace Google.Protobuf.Collections ...@@ -372,7 +352,6 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentOutOfRangeException("index"); throw new ArgumentOutOfRangeException("index");
} }
this.CheckMutable();
EnsureSize(count + 1); EnsureSize(count + 1);
Array.Copy(array, index, array, index + 1, count - index); Array.Copy(array, index, array, index + 1, count - index);
array[index] = item; array[index] = item;
...@@ -385,7 +364,6 @@ namespace Google.Protobuf.Collections ...@@ -385,7 +364,6 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentOutOfRangeException("index"); throw new ArgumentOutOfRangeException("index");
} }
this.CheckMutable();
Array.Copy(array, index + 1, array, index, count - index - 1); Array.Copy(array, index + 1, array, index, count - index - 1);
count--; count--;
array[count] = default(T); array[count] = default(T);
...@@ -407,7 +385,6 @@ namespace Google.Protobuf.Collections ...@@ -407,7 +385,6 @@ namespace Google.Protobuf.Collections
{ {
throw new ArgumentOutOfRangeException("index"); throw new ArgumentOutOfRangeException("index");
} }
this.CheckMutable();
if (value == null) if (value == null)
{ {
throw new ArgumentNullException("value"); throw new ArgumentNullException("value");
...@@ -417,7 +394,7 @@ namespace Google.Protobuf.Collections ...@@ -417,7 +394,7 @@ namespace Google.Protobuf.Collections
} }
#region Explicit interface implementation for IList and ICollection. #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) void ICollection.CopyTo(Array array, int index)
{ {
......
#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");
}
}
}
}
...@@ -64,7 +64,6 @@ ...@@ -64,7 +64,6 @@
<Compile Include="Compatibility\TypeExtensions.cs" /> <Compile Include="Compatibility\TypeExtensions.cs" />
<Compile Include="FieldCodec.cs" /> <Compile Include="FieldCodec.cs" />
<Compile Include="FrameworkPortability.cs" /> <Compile Include="FrameworkPortability.cs" />
<Compile Include="Freezable.cs" />
<Compile Include="JsonFormatter.cs" /> <Compile Include="JsonFormatter.cs" />
<Compile Include="MessageExtensions.cs" /> <Compile Include="MessageExtensions.cs" />
<Compile Include="IMessage.cs" /> <Compile Include="IMessage.cs" />
......
...@@ -79,7 +79,7 @@ namespace Google.Protobuf ...@@ -79,7 +79,7 @@ namespace Google.Protobuf
/// the implementation class. /// the implementation class.
/// </summary> /// </summary>
/// <typeparam name="T">The message type.</typeparam> /// <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> /// <summary>
/// Merges the given message into this one. /// Merges the given message into this one.
...@@ -97,10 +97,6 @@ namespace Google.Protobuf ...@@ -97,10 +97,6 @@ namespace Google.Protobuf
/// Additionally, due to the type constraint on <c>T</c> in <see cref="IMessage{T}"/>, /// 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. /// it is simpler to keep this as a separate interface.
/// </para> /// </para>
/// <para>
/// Freezable types which implement this interface should always return a mutable clone,
/// even if the original object is frozen.
/// </para>
/// </remarks> /// </remarks>
/// <typeparam name="T">The type itself, returned by the <see cref="Clone"/> method.</typeparam> /// <typeparam name="T">The type itself, returned by the <see cref="Clone"/> method.</typeparam>
public interface IDeepCloneable<T> public interface IDeepCloneable<T>
...@@ -111,32 +107,4 @@ namespace Google.Protobuf ...@@ -111,32 +107,4 @@ namespace Google.Protobuf
/// <returns>A deep clone of this object.</returns> /// <returns>A deep clone of this object.</returns>
T Clone(); 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; }
}
} }
...@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Any(this); return new Any(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int TypeUrlFieldNumber = 1; public const int TypeUrlFieldNumber = 1;
private string typeUrl_ = ""; private string typeUrl_ = "";
public string TypeUrl { public string TypeUrl {
get { return typeUrl_; } get { return typeUrl_; }
set { set {
pb::Freezable.CheckMutable(this);
typeUrl_ = value ?? ""; typeUrl_ = value ?? "";
} }
} }
...@@ -91,7 +83,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -91,7 +83,6 @@ namespace Google.Protobuf.WellKnownTypes {
public pb::ByteString Value { public pb::ByteString Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value ?? pb::ByteString.Empty; value_ = value ?? pb::ByteString.Empty;
} }
} }
......
...@@ -82,22 +82,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -82,22 +82,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Api(this); 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; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -123,7 +112,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -123,7 +112,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string Version { public string Version {
get { return version_; } get { return version_; }
set { set {
pb::Freezable.CheckMutable(this);
version_ = value ?? ""; version_ = value ?? "";
} }
} }
...@@ -133,7 +121,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -133,7 +121,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext { public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
get { return sourceContext_; } get { return sourceContext_; }
set { set {
pb::Freezable.CheckMutable(this);
sourceContext_ = value; sourceContext_ = value;
} }
} }
...@@ -299,20 +286,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -299,20 +286,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Method(this); return new Method(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
options_.Freeze();
}
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -322,7 +300,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -322,7 +300,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string RequestTypeUrl { public string RequestTypeUrl {
get { return requestTypeUrl_; } get { return requestTypeUrl_; }
set { set {
pb::Freezable.CheckMutable(this);
requestTypeUrl_ = value ?? ""; requestTypeUrl_ = value ?? "";
} }
} }
...@@ -332,7 +309,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -332,7 +309,6 @@ namespace Google.Protobuf.WellKnownTypes {
public bool RequestStreaming { public bool RequestStreaming {
get { return requestStreaming_; } get { return requestStreaming_; }
set { set {
pb::Freezable.CheckMutable(this);
requestStreaming_ = value; requestStreaming_ = value;
} }
} }
...@@ -342,7 +318,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -342,7 +318,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string ResponseTypeUrl { public string ResponseTypeUrl {
get { return responseTypeUrl_; } get { return responseTypeUrl_; }
set { set {
pb::Freezable.CheckMutable(this);
responseTypeUrl_ = value ?? ""; responseTypeUrl_ = value ?? "";
} }
} }
...@@ -352,7 +327,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -352,7 +327,6 @@ namespace Google.Protobuf.WellKnownTypes {
public bool ResponseStreaming { public bool ResponseStreaming {
get { return responseStreaming_; } get { return responseStreaming_; }
set { set {
pb::Freezable.CheckMutable(this);
responseStreaming_ = value; responseStreaming_ = value;
} }
} }
......
...@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Duration(this); return new Duration(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int SecondsFieldNumber = 1; public const int SecondsFieldNumber = 1;
private long seconds_; private long seconds_;
public long Seconds { public long Seconds {
get { return seconds_; } get { return seconds_; }
set { set {
pb::Freezable.CheckMutable(this);
seconds_ = value; seconds_ = value;
} }
} }
...@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes {
public int Nanos { public int Nanos {
get { return nanos_; } get { return nanos_; }
set { set {
pb::Freezable.CheckMutable(this);
nanos_ = value; nanos_ = value;
} }
} }
......
...@@ -67,13 +67,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -67,13 +67,6 @@ namespace Google.Protobuf.WellKnownTypes {
return new Empty(this); return new Empty(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as Empty); return Equals(other as Empty);
} }
......
...@@ -68,14 +68,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -68,14 +68,6 @@ namespace Google.Protobuf.WellKnownTypes {
return new FieldMask(this); return new FieldMask(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
paths_.Freeze();
}
public const int PathsFieldNumber = 1; public const int PathsFieldNumber = 1;
private static readonly pb::FieldCodec<string> _repeated_paths_codec private static readonly pb::FieldCodec<string> _repeated_paths_codec
= pb::FieldCodec.ForString(10); = pb::FieldCodec.ForString(10);
......
...@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -69,19 +69,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new SourceContext(this); return new SourceContext(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int FileNameFieldNumber = 1; public const int FileNameFieldNumber = 1;
private string fileName_ = ""; private string fileName_ = "";
public string FileName { public string FileName {
get { return fileName_; } get { return fileName_; }
set { set {
pb::Freezable.CheckMutable(this);
fileName_ = value ?? ""; fileName_ = value ?? "";
} }
} }
......
...@@ -87,14 +87,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -87,14 +87,6 @@ namespace Google.Protobuf.WellKnownTypes {
return new Struct(this); return new Struct(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
fields_.Freeze();
}
public const int FieldsFieldNumber = 1; public const int FieldsFieldNumber = 1;
private static readonly pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value>.Codec _map_fields_codec 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); = 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 { ...@@ -216,19 +208,10 @@ namespace Google.Protobuf.WellKnownTypes {
return new Value(this); 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 const int NullValueFieldNumber = 1;
public global::Google.Protobuf.WellKnownTypes.NullValue NullValue { 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; } get { return kindCase_ == KindOneofCase.NullValue ? (global::Google.Protobuf.WellKnownTypes.NullValue) kind_ : global::Google.Protobuf.WellKnownTypes.NullValue.NULL_VALUE; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
kindCase_ = KindOneofCase.NullValue; kindCase_ = KindOneofCase.NullValue;
} }
...@@ -238,7 +221,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -238,7 +221,6 @@ namespace Google.Protobuf.WellKnownTypes {
public double NumberValue { public double NumberValue {
get { return kindCase_ == KindOneofCase.NumberValue ? (double) kind_ : 0D; } get { return kindCase_ == KindOneofCase.NumberValue ? (double) kind_ : 0D; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
kindCase_ = KindOneofCase.NumberValue; kindCase_ = KindOneofCase.NumberValue;
} }
...@@ -248,7 +230,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -248,7 +230,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string StringValue { public string StringValue {
get { return kindCase_ == KindOneofCase.StringValue ? (string) kind_ : ""; } get { return kindCase_ == KindOneofCase.StringValue ? (string) kind_ : ""; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value ?? ""; kind_ = value ?? "";
kindCase_ = KindOneofCase.StringValue; kindCase_ = KindOneofCase.StringValue;
} }
...@@ -258,7 +239,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -258,7 +239,6 @@ namespace Google.Protobuf.WellKnownTypes {
public bool BoolValue { public bool BoolValue {
get { return kindCase_ == KindOneofCase.BoolValue ? (bool) kind_ : false; } get { return kindCase_ == KindOneofCase.BoolValue ? (bool) kind_ : false; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
kindCase_ = KindOneofCase.BoolValue; kindCase_ = KindOneofCase.BoolValue;
} }
...@@ -268,7 +248,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -268,7 +248,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.Struct StructValue { public global::Google.Protobuf.WellKnownTypes.Struct StructValue {
get { return kindCase_ == KindOneofCase.StructValue ? (global::Google.Protobuf.WellKnownTypes.Struct) kind_ : null; } get { return kindCase_ == KindOneofCase.StructValue ? (global::Google.Protobuf.WellKnownTypes.Struct) kind_ : null; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.StructValue; kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.StructValue;
} }
...@@ -278,7 +257,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -278,7 +257,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.ListValue ListValue { public global::Google.Protobuf.WellKnownTypes.ListValue ListValue {
get { return kindCase_ == KindOneofCase.ListValue ? (global::Google.Protobuf.WellKnownTypes.ListValue) kind_ : null; } get { return kindCase_ == KindOneofCase.ListValue ? (global::Google.Protobuf.WellKnownTypes.ListValue) kind_ : null; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.ListValue; kindCase_ = value == null ? KindOneofCase.None : KindOneofCase.ListValue;
} }
...@@ -300,7 +278,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -300,7 +278,6 @@ namespace Google.Protobuf.WellKnownTypes {
} }
public void ClearKind() { public void ClearKind() {
pb::Freezable.CheckMutable(this);
kindCase_ = KindOneofCase.None; kindCase_ = KindOneofCase.None;
kind_ = null; kind_ = null;
} }
...@@ -499,14 +476,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -499,14 +476,6 @@ namespace Google.Protobuf.WellKnownTypes {
return new ListValue(this); return new ListValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
values_.Freeze();
}
public const int ValuesFieldNumber = 1; public const int ValuesFieldNumber = 1;
private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Value> _repeated_values_codec private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Value> _repeated_values_codec
= pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Value.Parser); = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Value.Parser);
......
...@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -70,19 +70,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Timestamp(this); return new Timestamp(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int SecondsFieldNumber = 1; public const int SecondsFieldNumber = 1;
private long seconds_; private long seconds_;
public long Seconds { public long Seconds {
get { return seconds_; } get { return seconds_; }
set { set {
pb::Freezable.CheckMutable(this);
seconds_ = value; seconds_ = value;
} }
} }
...@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -92,7 +84,6 @@ namespace Google.Protobuf.WellKnownTypes {
public int Nanos { public int Nanos {
get { return nanos_; } get { return nanos_; }
set { set {
pb::Freezable.CheckMutable(this);
nanos_ = value; nanos_ = value;
} }
} }
......
...@@ -103,23 +103,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -103,23 +103,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Type(this); 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; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -153,7 +141,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -153,7 +141,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext { public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
get { return sourceContext_; } get { return sourceContext_; }
set { set {
pb::Freezable.CheckMutable(this);
sourceContext_ = value; sourceContext_ = value;
} }
} }
...@@ -314,20 +301,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -314,20 +301,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Field(this); return new Field(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
options_.Freeze();
}
public const int KindFieldNumber = 1; public const int KindFieldNumber = 1;
private global::Google.Protobuf.WellKnownTypes.Field.Types.Kind kind_ = global::Google.Protobuf.WellKnownTypes.Field.Types.Kind.TYPE_UNKNOWN; 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 { public global::Google.Protobuf.WellKnownTypes.Field.Types.Kind Kind {
get { return kind_; } get { return kind_; }
set { set {
pb::Freezable.CheckMutable(this);
kind_ = value; kind_ = value;
} }
} }
...@@ -337,7 +315,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -337,7 +315,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.Field.Types.Cardinality Cardinality { public global::Google.Protobuf.WellKnownTypes.Field.Types.Cardinality Cardinality {
get { return cardinality_; } get { return cardinality_; }
set { set {
pb::Freezable.CheckMutable(this);
cardinality_ = value; cardinality_ = value;
} }
} }
...@@ -347,7 +324,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -347,7 +324,6 @@ namespace Google.Protobuf.WellKnownTypes {
public int Number { public int Number {
get { return number_; } get { return number_; }
set { set {
pb::Freezable.CheckMutable(this);
number_ = value; number_ = value;
} }
} }
...@@ -357,7 +333,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -357,7 +333,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -367,7 +342,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -367,7 +342,6 @@ namespace Google.Protobuf.WellKnownTypes {
public string TypeUrl { public string TypeUrl {
get { return typeUrl_; } get { return typeUrl_; }
set { set {
pb::Freezable.CheckMutable(this);
typeUrl_ = value ?? ""; typeUrl_ = value ?? "";
} }
} }
...@@ -377,7 +351,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -377,7 +351,6 @@ namespace Google.Protobuf.WellKnownTypes {
public int OneofIndex { public int OneofIndex {
get { return oneofIndex_; } get { return oneofIndex_; }
set { set {
pb::Freezable.CheckMutable(this);
oneofIndex_ = value; oneofIndex_ = value;
} }
} }
...@@ -387,7 +360,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -387,7 +360,6 @@ namespace Google.Protobuf.WellKnownTypes {
public bool Packed { public bool Packed {
get { return packed_; } get { return packed_; }
set { set {
pb::Freezable.CheckMutable(this);
packed_ = value; packed_ = value;
} }
} }
...@@ -642,22 +614,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -642,22 +614,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Enum(this); 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; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -683,7 +644,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -683,7 +644,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext { public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
get { return sourceContext_; } get { return sourceContext_; }
set { set {
pb::Freezable.CheckMutable(this);
sourceContext_ = value; sourceContext_ = value;
} }
} }
...@@ -830,20 +790,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -830,20 +790,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new EnumValue(this); return new EnumValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
options_.Freeze();
}
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -853,7 +804,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -853,7 +804,6 @@ namespace Google.Protobuf.WellKnownTypes {
public int Number { public int Number {
get { return number_; } get { return number_; }
set { set {
pb::Freezable.CheckMutable(this);
number_ = value; number_ = value;
} }
} }
...@@ -992,20 +942,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -992,20 +942,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Option(this); return new Option(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
if (value_ != null) Value.Freeze();
}
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
public string Name { public string Name {
get { return name_; } get { return name_; }
set { set {
pb::Freezable.CheckMutable(this);
name_ = value ?? ""; name_ = value ?? "";
} }
} }
...@@ -1015,7 +956,6 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -1015,7 +956,6 @@ namespace Google.Protobuf.WellKnownTypes {
public global::Google.Protobuf.WellKnownTypes.Any Value { public global::Google.Protobuf.WellKnownTypes.Any Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
......
...@@ -78,19 +78,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -78,19 +78,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new DoubleValue(this); return new DoubleValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private double value_; private double value_;
public double Value { public double Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -195,19 +187,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -195,19 +187,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new FloatValue(this); return new FloatValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private float value_; private float value_;
public float Value { public float Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -312,19 +296,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -312,19 +296,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Int64Value(this); return new Int64Value(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private long value_; private long value_;
public long Value { public long Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -429,19 +405,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -429,19 +405,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new UInt64Value(this); return new UInt64Value(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private ulong value_; private ulong value_;
public ulong Value { public ulong Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -546,19 +514,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -546,19 +514,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new Int32Value(this); return new Int32Value(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private int value_; private int value_;
public int Value { public int Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -663,19 +623,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -663,19 +623,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new UInt32Value(this); return new UInt32Value(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private uint value_; private uint value_;
public uint Value { public uint Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -780,19 +732,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -780,19 +732,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new BoolValue(this); return new BoolValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private bool value_; private bool value_;
public bool Value { public bool Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value; value_ = value;
} }
} }
...@@ -897,19 +841,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -897,19 +841,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new StringValue(this); return new StringValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private string value_ = ""; private string value_ = "";
public string Value { public string Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value ?? ""; value_ = value ?? "";
} }
} }
...@@ -1014,19 +950,11 @@ namespace Google.Protobuf.WellKnownTypes { ...@@ -1014,19 +950,11 @@ namespace Google.Protobuf.WellKnownTypes {
return new BytesValue(this); return new BytesValue(this);
} }
public void Freeze() {
if (IsFrozen) {
return;
}
_frozen = true;
}
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private pb::ByteString value_ = pb::ByteString.Empty; private pb::ByteString value_ = pb::ByteString.Empty;
public pb::ByteString Value { public pb::ByteString Value {
get { return value_; } get { return value_; }
set { set {
pb::Freezable.CheckMutable(this);
value_ = value ?? pb::ByteString.Empty; value_ = value ?? pb::ByteString.Empty;
} }
} }
......
...@@ -129,8 +129,6 @@ void MapFieldGenerator::GenerateCloningCode(io::Printer* printer) { ...@@ -129,8 +129,6 @@ void MapFieldGenerator::GenerateCloningCode(io::Printer* printer) {
} }
void MapFieldGenerator::GenerateFreezingCode(io::Printer* printer) { void MapFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
printer->Print(variables_,
"$name$_.Freeze();\n");
} }
} // namespace csharp } // namespace csharp
......
...@@ -190,7 +190,6 @@ void MessageGenerator::Generate(io::Printer* printer) { ...@@ -190,7 +190,6 @@ void MessageGenerator::Generate(io::Printer* printer) {
" get { return $name$Case_; }\n" " get { return $name$Case_; }\n"
"}\n\n" "}\n\n"
"public void Clear$property_name$() {\n" "public void Clear$property_name$() {\n"
" pb::Freezable.CheckMutable(this);\n"
" $name$Case_ = $property_name$OneofCase.None;\n" " $name$Case_ = $property_name$OneofCase.None;\n"
" $name$_ = null;\n" " $name$_ = null;\n"
"}\n\n"); "}\n\n");
...@@ -293,33 +292,6 @@ void MessageGenerator::GenerateCloningCode(io::Printer* printer) { ...@@ -293,33 +292,6 @@ void MessageGenerator::GenerateCloningCode(io::Printer* printer) {
} }
void MessageGenerator::GenerateFreezingCode(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) { void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) {
......
...@@ -67,7 +67,6 @@ void MessageFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -67,7 +67,6 @@ void MessageFieldGenerator::GenerateMembers(io::Printer* printer) {
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $name$_; }\n" " get { return $name$_; }\n"
" set {\n" " set {\n"
" pb::Freezable.CheckMutable(this);\n"
" $name$_ = value;\n" " $name$_ = value;\n"
" }\n" " }\n"
"}\n"); "}\n");
...@@ -134,8 +133,6 @@ void MessageFieldGenerator::GenerateCloningCode(io::Printer* printer) { ...@@ -134,8 +133,6 @@ void MessageFieldGenerator::GenerateCloningCode(io::Printer* printer) {
} }
void MessageFieldGenerator::GenerateFreezingCode(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) { void MessageFieldGenerator::GenerateCodecCode(io::Printer* printer) {
...@@ -161,7 +158,6 @@ void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -161,7 +158,6 @@ void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : null; }\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : null; }\n"
" set {\n" " set {\n"
" pb::Freezable.CheckMutable(this);\n"
" $oneof_name$_ = value;\n" " $oneof_name$_ = value;\n"
" $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n" " $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n"
" }\n" " }\n"
......
...@@ -73,8 +73,7 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -73,8 +73,7 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) {
variables_, variables_,
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $name$_; }\n" " get { return $name$_; }\n"
" set {\n" " set {\n");
" pb::Freezable.CheckMutable(this);\n");
if (is_value_type) { if (is_value_type) {
printer->Print( printer->Print(
variables_, variables_,
...@@ -176,8 +175,7 @@ void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -176,8 +175,7 @@ void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
variables_, variables_,
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n"
" set {\n" " set {\n");
" pb::Freezable.CheckMutable(this);\n");
if (is_value_type) { if (is_value_type) {
printer->Print( printer->Print(
variables_, variables_,
......
...@@ -117,8 +117,6 @@ void RepeatedEnumFieldGenerator::GenerateCloningCode(io::Printer* printer) { ...@@ -117,8 +117,6 @@ void RepeatedEnumFieldGenerator::GenerateCloningCode(io::Printer* printer) {
} }
void RepeatedEnumFieldGenerator::GenerateFreezingCode(io::Printer* printer) { void RepeatedEnumFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
printer->Print(variables_,
"$name$_.Freeze();\n");
} }
} // namespace csharp } // namespace csharp
......
...@@ -132,8 +132,6 @@ void RepeatedMessageFieldGenerator::GenerateCloningCode(io::Printer* printer) { ...@@ -132,8 +132,6 @@ void RepeatedMessageFieldGenerator::GenerateCloningCode(io::Printer* printer) {
} }
void RepeatedMessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) { void RepeatedMessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
printer->Print(variables_,
"$name$_.Freeze();\n");
} }
} // namespace csharp } // namespace csharp
......
...@@ -115,8 +115,6 @@ void RepeatedPrimitiveFieldGenerator::GenerateCloningCode(io::Printer* printer) ...@@ -115,8 +115,6 @@ void RepeatedPrimitiveFieldGenerator::GenerateCloningCode(io::Printer* printer)
} }
void RepeatedPrimitiveFieldGenerator::GenerateFreezingCode(io::Printer* printer) { void RepeatedPrimitiveFieldGenerator::GenerateFreezingCode(io::Printer* printer) {
printer->Print(variables_,
"$name$_.Freeze();\n");
} }
} // namespace csharp } // namespace csharp
......
...@@ -76,7 +76,6 @@ void WrapperFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -76,7 +76,6 @@ void WrapperFieldGenerator::GenerateMembers(io::Printer* printer) {
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $name$_; }\n" " get { return $name$_; }\n"
" set {\n" " set {\n"
" pb::Freezable.CheckMutable(this);\n"
" $name$_ = value;\n" " $name$_ = value;\n"
" }\n" " }\n"
"}\n"); "}\n");
...@@ -172,7 +171,6 @@ void WrapperOneofFieldGenerator::GenerateMembers(io::Printer* printer) { ...@@ -172,7 +171,6 @@ void WrapperOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
"$access_level$ $type_name$ $property_name$ {\n" "$access_level$ $type_name$ $property_name$ {\n"
" get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : ($type_name$) null; }\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : ($type_name$) null; }\n"
" set {\n" " set {\n"
" pb::Freezable.CheckMutable(this);\n"
" $oneof_name$_ = value;\n" " $oneof_name$_ = value;\n"
" $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n" " $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n"
" }\n" " }\n"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment