Support unknown json data and add internal set/clear field methods for generated accessors. (#918)

Add support for unknown fields to JSON (de-)serialized proto messages.
This allows data to be roundtripped from a server via this format
without dropping fields when the client doesn't contain metadata for
some fields.

Store the data as decoded but unparsed json and append it back to the
message when re-serializing a message.

Ignore unknown json data for equality/hashing to preserve existing
behavior for users. Taking this data into account would change the
result of existing `==` and `hashCode` calls.

By separating out `$_setField` and `$_clearField` this allows one to
differentiate reflective uses of `setField` and `clearField` (i.e. from
user code, usually with the result of `getTagNumber`) vs. internal uses
from the generated accessors.

Fixes #49.

---

cl/611522109
cl/612283849

---------

Co-authored-by: Nate Biggs <natebiggs@google.com>
Co-authored-by: Ömer Sinan Ağacan <omersa@google.com>
diff --git a/protobuf/CHANGELOG.md b/protobuf/CHANGELOG.md
index 186f726..32a41e6 100644
--- a/protobuf/CHANGELOG.md
+++ b/protobuf/CHANGELOG.md
@@ -25,9 +25,20 @@
   To migrate, use `PbMap.unmodifiable(map.keyFieldType, map.valueFieldType)`
   instead of `PbMap.unmodifiable(map)`. ([#902])
 
+* Messages deserialized from JSON now generate the unknown fields when
+  serialized as JSON.
+
+  Note that, as before, unknown fields in JSON messages are not stored in the
+  `unknownFields` of the message. They are only used by the JSON serializers to
+  support roundtripping.
+
+  ([#49], [#918])
+
 [#738]: https://github.com/google/protobuf.dart/issues/738
 [#896]: https://github.com/google/protobuf.dart/issues/896
 [#902]: https://github.com/google/protobuf.dart/issues/902
+[#49]: https://github.com/google/protobuf.dart/issues/49
+[#918]: https://github.com/google/protobuf.dart/pulls/918
 
 ## 3.1.0
 
diff --git a/protobuf/lib/meta.dart b/protobuf/lib/meta.dart
index 7f43263..9fe7dd0 100644
--- a/protobuf/lib/meta.dart
+++ b/protobuf/lib/meta.dart
@@ -56,6 +56,7 @@
   'writeToCodedBufferWriter',
   'writeToJson',
   'writeToJsonMap',
+  r'$_clearField',
   r'$_ensure',
   r'$_get',
   r'$_getI64',
@@ -72,6 +73,7 @@
   r'$_setBool',
   r'$_setBytes',
   r'$_setDouble',
+  r'$_setField',
   r'$_setFloat',
   r'$_setInt64',
   r'$_setSignedInt32',
diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index 89930de..bd97991 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -33,6 +33,9 @@
   /// Contains all the unknown fields, or null if there aren't any.
   UnknownFieldSet? _unknownFields;
 
+  /// Contains unknown data for messages deserialized from json.
+  Map<String, dynamic>? _unknownJsonData;
+
   /// Encodes whether `this` has been frozen, and if so, also memoizes the
   /// hash code.
   ///
@@ -105,6 +108,7 @@
       if (_isReadOnly) return UnknownFieldSet.emptyUnknownFieldSet;
       _unknownFields = UnknownFieldSet();
     }
+    _unknownJsonData = null;
     return _unknownFields!;
   }
 
@@ -531,6 +535,8 @@
       if (_unknownFields != o._unknownFields) return false;
     }
 
+    // Ignore _unknownJsonData to preserve existing equality behavior.
+
     return true;
   }
 
@@ -597,6 +603,8 @@
     // Hash with unknown fields.
     hash = _HashUtils._combine(hash, _unknownFields?.hashCode ?? 0);
 
+    // Ignore _unknownJsonData to preserve existing hashing behavior.
+
     if (_isReadOnly) {
       _frozenState = hash;
     }
@@ -682,6 +690,11 @@
     } else {
       out.write(UnknownFieldSet().toString());
     }
+
+    final unknownJsonData = _unknownJsonData;
+    if (unknownJsonData != null) {
+      out.write(unknownJsonData.toString());
+    }
   }
 
   /// Merges the contents of the [other] into this message.
@@ -713,6 +726,15 @@
     if (otherUnknownFields != null) {
       _ensureUnknownFields().mergeFromUnknownFieldSet(otherUnknownFields);
     }
+
+    final otherUnknownJsonData = other._unknownJsonData;
+    if (otherUnknownJsonData != null) {
+      final newUnknownJsonData =
+          Map<String, dynamic>.from(_unknownJsonData ?? {});
+      otherUnknownJsonData
+          .forEach((key, value) => newUnknownJsonData[key] = value);
+      _unknownJsonData = newUnknownJsonData.isEmpty ? null : newUnknownJsonData;
+    }
   }
 
   void _mergeField(FieldInfo otherFi, fieldValue, {required bool isExtension}) {
@@ -868,6 +890,11 @@
       _ensureUnknownFields()._fields.addAll(originalUnknownFields._fields);
     }
 
+    final unknownJsonData = original._unknownJsonData;
+    if (unknownJsonData != null) {
+      _unknownJsonData = Map.from(unknownJsonData);
+    }
+
     _oneofCases?.addAll(original._oneofCases!);
   }
 }
diff --git a/protobuf/lib/src/protobuf/generated_message.dart b/protobuf/lib/src/protobuf/generated_message.dart
index d34dac4..5a0b51c 100644
--- a/protobuf/lib/src/protobuf/generated_message.dart
+++ b/protobuf/lib/src/protobuf/generated_message.dart
@@ -173,6 +173,10 @@
   }
 
   /// Serialize the message as the protobuf binary format.
+  ///
+  /// Unknown field data, data for which there is no metadata for the associated
+  /// field, will only be included if this message was deserialized from the
+  /// same wire format.
   Uint8List writeToBuffer() {
     final out = CodedBufferWriter();
     writeToCodedBufferWriter(out);
@@ -211,6 +215,10 @@
   /// Returns the JSON encoding of this message as a Dart [Map].
   ///
   /// The encoding is described in [GeneratedMessage.writeToJson].
+  ///
+  /// Unknown field data, data for which there is no metadata for the associated
+  /// field, will only be included if this message was deserialized from the
+  /// same wire format.
   Map<String, dynamic> writeToJsonMap() => _writeToJsonMap(_fieldSet);
 
   /// Returns a JSON string that encodes this message.
@@ -226,6 +234,10 @@
   /// represented as their integer value.
   ///
   /// For the proto3 JSON format use: [toProto3Json].
+  ///
+  /// Unknown field data, data for which there is no metadata for the associated
+  /// field, will only be included if this message was deserialized from the
+  /// same wire format.
   String writeToJson() => jsonEncode(writeToJsonMap());
 
   /// Returns an Object representing Proto3 JSON serialization of `this`.
@@ -241,6 +253,9 @@
   /// The [typeRegistry] is be used for encoding `Any` messages. If an `Any`
   /// message encoding a type not in [typeRegistry] is encountered, an
   /// error is thrown.
+  ///
+  /// Unknown field data, data for which there is no metadata for the associated
+  /// field, will not be included.
   Object? toProto3Json(
           {TypeRegistry typeRegistry = const TypeRegistry.empty()}) =>
       _writeToProto3Json(_fieldSet, typeRegistry);
@@ -509,6 +524,17 @@
   /// @nodoc
   void $_setInt64(int index, Int64 value) => _fieldSet._$set(index, value);
 
+  /// For generated code only. Separate from [setField] to distinguish
+  /// reflective accesses.
+  /// @nodoc
+  void $_setField(int tagNumber, Object value) =>
+      _fieldSet._setField(tagNumber, value);
+
+  /// For generated code only. Separate from [clearField] to distinguish
+  /// reflective accesses.
+  /// @nodoc
+  void $_clearField(int tagNumber) => _fieldSet._clearField(tagNumber);
+
   // Support for generating a read-only default singleton instance.
 
   static final Map<Function?, _SingletonMaker<GeneratedMessage>>
diff --git a/protobuf/lib/src/protobuf/json.dart b/protobuf/lib/src/protobuf/json.dart
index a59d2ca..1184fa6 100644
--- a/protobuf/lib/src/protobuf/json.dart
+++ b/protobuf/lib/src/protobuf/json.dart
@@ -89,6 +89,12 @@
       result['$tagNumber'] = convertToMap(value, fi.type);
     }
   }
+  final unknownJsonData = fs._unknownJsonData;
+  if (unknownJsonData != null) {
+    unknownJsonData.forEach((key, value) {
+      result[key] = value;
+    });
+  }
   return result;
 }
 
@@ -102,9 +108,11 @@
   for (final key in keys) {
     var fi = meta.byTagAsString[key];
     if (fi == null) {
-      if (registry == null) continue; // Unknown tag; skip
-      fi = registry.getExtension(fs._messageName, int.parse(key));
-      if (fi == null) continue; // Unknown tag; skip
+      fi = registry?.getExtension(fs._messageName, int.parse(key));
+      if (fi == null) {
+        (fs._unknownJsonData ??= {})[key] = json[key];
+        continue;
+      }
     }
     if (fi.isMapField) {
       _appendJsonMap(
diff --git a/protobuf/test/json_test.dart b/protobuf/test/json_test.dart
index e670038..11005d0 100644
--- a/protobuf/test/json_test.dart
+++ b/protobuf/test/json_test.dart
@@ -87,7 +87,7 @@
     checkJsonMap(m);
   });
 
-  test('testMergeFromJson', () {
+  test('testWriteToJsonMap', () {
     final t = T();
     t.mergeFromJson('''{"1": 123, "2": "hello"}''');
     checkMessage(t);
@@ -118,13 +118,21 @@
     final decoded = T()..mergeFromJsonMap(encoded);
     expect(decoded.int64, value);
   });
+
+  test('testJsonMapWithUnknown', () {
+    final m = example.writeToJsonMap();
+    m['9999'] = 'world';
+    final t = T()..mergeFromJsonMap(m);
+    checkJsonMap(t.writeToJsonMap(), unknownFields: {'9999': 'world'});
+  });
 }
 
-void checkJsonMap(Map m) {
-  expect(m.length, 3);
+void checkJsonMap(Map m, {Map<String, dynamic>? unknownFields}) {
+  expect(m.length, 3 + (unknownFields?.length ?? 0));
   expect(m['1'], 123);
   expect(m['2'], 'hello');
   expect(m['4'], [1, 2, 3]);
+  unknownFields?.forEach((k, v) => expect(m[k], v));
 }
 
 void checkMessage(T t) {
diff --git a/protoc_plugin/lib/src/generated/dart_options.pb.dart b/protoc_plugin/lib/src/generated/dart_options.pb.dart
index c1119da..f045820 100644
--- a/protoc_plugin/lib/src/generated/dart_options.pb.dart
+++ b/protoc_plugin/lib/src/generated/dart_options.pb.dart
@@ -82,7 +82,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   /// A URI pointing to the Dart library that defines the mixin.
   /// The generated Dart code will use this in an import statement.
@@ -96,7 +96,7 @@
   @$pb.TagNumber(2)
   $core.bool hasImportFrom() => $_has(1);
   @$pb.TagNumber(2)
-  void clearImportFrom() => clearField(2);
+  void clearImportFrom() => $_clearField(2);
 
   /// The name of another mixin to be applied ahead of this one.
   /// The generated class for the message will inherit from all mixins
@@ -111,7 +111,7 @@
   @$pb.TagNumber(3)
   $core.bool hasParent() => $_has(2);
   @$pb.TagNumber(3)
-  void clearParent() => clearField(3);
+  void clearParent() => $_clearField(3);
 }
 
 /// Defines additional Dart imports to be used with messages in this file.
diff --git a/protoc_plugin/lib/src/generated/descriptor.pb.dart b/protoc_plugin/lib/src/generated/descriptor.pb.dart
index 11ccb6f..d367d33 100644
--- a/protoc_plugin/lib/src/generated/descriptor.pb.dart
+++ b/protoc_plugin/lib/src/generated/descriptor.pb.dart
@@ -200,7 +200,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.String get package => $_getSZ(1);
@@ -212,7 +212,7 @@
   @$pb.TagNumber(2)
   $core.bool hasPackage() => $_has(1);
   @$pb.TagNumber(2)
-  void clearPackage() => clearField(2);
+  void clearPackage() => $_clearField(2);
 
   /// Names of files imported by this file.
   @$pb.TagNumber(3)
@@ -235,13 +235,13 @@
   FileOptions get options => $_getN(7);
   @$pb.TagNumber(8)
   set options(FileOptions v) {
-    setField(8, v);
+    $_setField(8, v);
   }
 
   @$pb.TagNumber(8)
   $core.bool hasOptions() => $_has(7);
   @$pb.TagNumber(8)
-  void clearOptions() => clearField(8);
+  void clearOptions() => $_clearField(8);
   @$pb.TagNumber(8)
   FileOptions ensureOptions() => $_ensure(7);
 
@@ -253,13 +253,13 @@
   SourceCodeInfo get sourceCodeInfo => $_getN(8);
   @$pb.TagNumber(9)
   set sourceCodeInfo(SourceCodeInfo v) {
-    setField(9, v);
+    $_setField(9, v);
   }
 
   @$pb.TagNumber(9)
   $core.bool hasSourceCodeInfo() => $_has(8);
   @$pb.TagNumber(9)
-  void clearSourceCodeInfo() => clearField(9);
+  void clearSourceCodeInfo() => $_clearField(9);
   @$pb.TagNumber(9)
   SourceCodeInfo ensureSourceCodeInfo() => $_ensure(8);
 
@@ -284,7 +284,7 @@
   @$pb.TagNumber(12)
   $core.bool hasSyntax() => $_has(11);
   @$pb.TagNumber(12)
-  void clearSyntax() => clearField(12);
+  void clearSyntax() => $_clearField(12);
 }
 
 class DescriptorProto_ExtensionRange extends $pb.GeneratedMessage {
@@ -360,7 +360,7 @@
   @$pb.TagNumber(1)
   $core.bool hasStart() => $_has(0);
   @$pb.TagNumber(1)
-  void clearStart() => clearField(1);
+  void clearStart() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get end => $_getIZ(1);
@@ -372,19 +372,19 @@
   @$pb.TagNumber(2)
   $core.bool hasEnd() => $_has(1);
   @$pb.TagNumber(2)
-  void clearEnd() => clearField(2);
+  void clearEnd() => $_clearField(2);
 
   @$pb.TagNumber(3)
   ExtensionRangeOptions get options => $_getN(2);
   @$pb.TagNumber(3)
   set options(ExtensionRangeOptions v) {
-    setField(3, v);
+    $_setField(3, v);
   }
 
   @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
   @$pb.TagNumber(3)
-  void clearOptions() => clearField(3);
+  void clearOptions() => $_clearField(3);
   @$pb.TagNumber(3)
   ExtensionRangeOptions ensureOptions() => $_ensure(2);
 }
@@ -460,7 +460,7 @@
   @$pb.TagNumber(1)
   $core.bool hasStart() => $_has(0);
   @$pb.TagNumber(1)
-  void clearStart() => clearField(1);
+  void clearStart() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get end => $_getIZ(1);
@@ -472,7 +472,7 @@
   @$pb.TagNumber(2)
   $core.bool hasEnd() => $_has(1);
   @$pb.TagNumber(2)
-  void clearEnd() => clearField(2);
+  void clearEnd() => $_clearField(2);
 }
 
 /// Describes a message type.
@@ -594,7 +594,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.List<FieldDescriptorProto> get field => $_getList(1);
@@ -615,13 +615,13 @@
   MessageOptions get options => $_getN(6);
   @$pb.TagNumber(7)
   set options(MessageOptions v) {
-    setField(7, v);
+    $_setField(7, v);
   }
 
   @$pb.TagNumber(7)
   $core.bool hasOptions() => $_has(6);
   @$pb.TagNumber(7)
-  void clearOptions() => clearField(7);
+  void clearOptions() => $_clearField(7);
   @$pb.TagNumber(7)
   MessageOptions ensureOptions() => $_ensure(6);
 
@@ -814,7 +814,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   /// For extensions, this is the name of the type being extended.  It is
   /// resolved in the same manner as type_name.
@@ -828,7 +828,7 @@
   @$pb.TagNumber(2)
   $core.bool hasExtendee() => $_has(1);
   @$pb.TagNumber(2)
-  void clearExtendee() => clearField(2);
+  void clearExtendee() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $core.int get number => $_getIZ(2);
@@ -840,19 +840,19 @@
   @$pb.TagNumber(3)
   $core.bool hasNumber() => $_has(2);
   @$pb.TagNumber(3)
-  void clearNumber() => clearField(3);
+  void clearNumber() => $_clearField(3);
 
   @$pb.TagNumber(4)
   FieldDescriptorProto_Label get label => $_getN(3);
   @$pb.TagNumber(4)
   set label(FieldDescriptorProto_Label v) {
-    setField(4, v);
+    $_setField(4, v);
   }
 
   @$pb.TagNumber(4)
   $core.bool hasLabel() => $_has(3);
   @$pb.TagNumber(4)
-  void clearLabel() => clearField(4);
+  void clearLabel() => $_clearField(4);
 
   /// If type_name is set, this need not be set.  If both this and type_name
   /// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
@@ -860,13 +860,13 @@
   FieldDescriptorProto_Type get type => $_getN(4);
   @$pb.TagNumber(5)
   set type(FieldDescriptorProto_Type v) {
-    setField(5, v);
+    $_setField(5, v);
   }
 
   @$pb.TagNumber(5)
   $core.bool hasType() => $_has(4);
   @$pb.TagNumber(5)
-  void clearType() => clearField(5);
+  void clearType() => $_clearField(5);
 
   /// For message and enum types, this is the name of the type.  If the name
   /// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
@@ -883,7 +883,7 @@
   @$pb.TagNumber(6)
   $core.bool hasTypeName() => $_has(5);
   @$pb.TagNumber(6)
-  void clearTypeName() => clearField(6);
+  void clearTypeName() => $_clearField(6);
 
   /// For numeric types, contains the original text representation of the value.
   /// For booleans, "true" or "false".
@@ -900,19 +900,19 @@
   @$pb.TagNumber(7)
   $core.bool hasDefaultValue() => $_has(6);
   @$pb.TagNumber(7)
-  void clearDefaultValue() => clearField(7);
+  void clearDefaultValue() => $_clearField(7);
 
   @$pb.TagNumber(8)
   FieldOptions get options => $_getN(7);
   @$pb.TagNumber(8)
   set options(FieldOptions v) {
-    setField(8, v);
+    $_setField(8, v);
   }
 
   @$pb.TagNumber(8)
   $core.bool hasOptions() => $_has(7);
   @$pb.TagNumber(8)
-  void clearOptions() => clearField(8);
+  void clearOptions() => $_clearField(8);
   @$pb.TagNumber(8)
   FieldOptions ensureOptions() => $_ensure(7);
 
@@ -928,7 +928,7 @@
   @$pb.TagNumber(9)
   $core.bool hasOneofIndex() => $_has(8);
   @$pb.TagNumber(9)
-  void clearOneofIndex() => clearField(9);
+  void clearOneofIndex() => $_clearField(9);
 
   /// JSON name of this field. The value is set by protocol compiler. If the
   /// user has set a "json_name" option on this field, that option's value
@@ -944,7 +944,7 @@
   @$pb.TagNumber(10)
   $core.bool hasJsonName() => $_has(9);
   @$pb.TagNumber(10)
-  void clearJsonName() => clearField(10);
+  void clearJsonName() => $_clearField(10);
 
   ///  If true, this is a proto3 "optional". When a proto3 field is optional, it
   ///  tracks presence regardless of field type.
@@ -977,7 +977,7 @@
   @$pb.TagNumber(17)
   $core.bool hasProto3Optional() => $_has(10);
   @$pb.TagNumber(17)
-  void clearProto3Optional() => clearField(17);
+  void clearProto3Optional() => $_clearField(17);
 }
 
 /// Describes a oneof.
@@ -1046,19 +1046,19 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   OneofOptions get options => $_getN(1);
   @$pb.TagNumber(2)
   set options(OneofOptions v) {
-    setField(2, v);
+    $_setField(2, v);
   }
 
   @$pb.TagNumber(2)
   $core.bool hasOptions() => $_has(1);
   @$pb.TagNumber(2)
-  void clearOptions() => clearField(2);
+  void clearOptions() => $_clearField(2);
   @$pb.TagNumber(2)
   OneofOptions ensureOptions() => $_ensure(1);
 }
@@ -1139,7 +1139,7 @@
   @$pb.TagNumber(1)
   $core.bool hasStart() => $_has(0);
   @$pb.TagNumber(1)
-  void clearStart() => clearField(1);
+  void clearStart() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get end => $_getIZ(1);
@@ -1151,7 +1151,7 @@
   @$pb.TagNumber(2)
   $core.bool hasEnd() => $_has(1);
   @$pb.TagNumber(2)
-  void clearEnd() => clearField(2);
+  void clearEnd() => $_clearField(2);
 }
 
 /// Describes an enum type.
@@ -1238,7 +1238,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.List<EnumValueDescriptorProto> get value => $_getList(1);
@@ -1247,13 +1247,13 @@
   EnumOptions get options => $_getN(2);
   @$pb.TagNumber(3)
   set options(EnumOptions v) {
-    setField(3, v);
+    $_setField(3, v);
   }
 
   @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
   @$pb.TagNumber(3)
-  void clearOptions() => clearField(3);
+  void clearOptions() => $_clearField(3);
   @$pb.TagNumber(3)
   EnumOptions ensureOptions() => $_ensure(2);
 
@@ -1342,7 +1342,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get number => $_getIZ(1);
@@ -1354,19 +1354,19 @@
   @$pb.TagNumber(2)
   $core.bool hasNumber() => $_has(1);
   @$pb.TagNumber(2)
-  void clearNumber() => clearField(2);
+  void clearNumber() => $_clearField(2);
 
   @$pb.TagNumber(3)
   EnumValueOptions get options => $_getN(2);
   @$pb.TagNumber(3)
   set options(EnumValueOptions v) {
-    setField(3, v);
+    $_setField(3, v);
   }
 
   @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
   @$pb.TagNumber(3)
-  void clearOptions() => clearField(3);
+  void clearOptions() => $_clearField(3);
   @$pb.TagNumber(3)
   EnumValueOptions ensureOptions() => $_ensure(2);
 }
@@ -1445,7 +1445,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.List<MethodDescriptorProto> get method => $_getList(1);
@@ -1454,13 +1454,13 @@
   ServiceOptions get options => $_getN(2);
   @$pb.TagNumber(3)
   set options(ServiceOptions v) {
-    setField(3, v);
+    $_setField(3, v);
   }
 
   @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
   @$pb.TagNumber(3)
-  void clearOptions() => clearField(3);
+  void clearOptions() => $_clearField(3);
   @$pb.TagNumber(3)
   ServiceOptions ensureOptions() => $_ensure(2);
 }
@@ -1552,7 +1552,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   /// Input and output type names.  These are resolved in the same way as
   /// FieldDescriptorProto.type_name, but must refer to a message type.
@@ -1566,7 +1566,7 @@
   @$pb.TagNumber(2)
   $core.bool hasInputType() => $_has(1);
   @$pb.TagNumber(2)
-  void clearInputType() => clearField(2);
+  void clearInputType() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $core.String get outputType => $_getSZ(2);
@@ -1578,19 +1578,19 @@
   @$pb.TagNumber(3)
   $core.bool hasOutputType() => $_has(2);
   @$pb.TagNumber(3)
-  void clearOutputType() => clearField(3);
+  void clearOutputType() => $_clearField(3);
 
   @$pb.TagNumber(4)
   MethodOptions get options => $_getN(3);
   @$pb.TagNumber(4)
   set options(MethodOptions v) {
-    setField(4, v);
+    $_setField(4, v);
   }
 
   @$pb.TagNumber(4)
   $core.bool hasOptions() => $_has(3);
   @$pb.TagNumber(4)
-  void clearOptions() => clearField(4);
+  void clearOptions() => $_clearField(4);
   @$pb.TagNumber(4)
   MethodOptions ensureOptions() => $_ensure(3);
 
@@ -1605,7 +1605,7 @@
   @$pb.TagNumber(5)
   $core.bool hasClientStreaming() => $_has(4);
   @$pb.TagNumber(5)
-  void clearClientStreaming() => clearField(5);
+  void clearClientStreaming() => $_clearField(5);
 
   /// Identifies if server streams multiple server messages
   @$pb.TagNumber(6)
@@ -1618,7 +1618,7 @@
   @$pb.TagNumber(6)
   $core.bool hasServerStreaming() => $_has(5);
   @$pb.TagNumber(6)
-  void clearServerStreaming() => clearField(6);
+  void clearServerStreaming() => $_clearField(6);
 }
 
 class FileOptions extends $pb.GeneratedMessage {
@@ -1793,7 +1793,7 @@
   @$pb.TagNumber(1)
   $core.bool hasJavaPackage() => $_has(0);
   @$pb.TagNumber(1)
-  void clearJavaPackage() => clearField(1);
+  void clearJavaPackage() => $_clearField(1);
 
   /// If set, all the classes from the .proto file are wrapped in a single
   /// outer class with the given name.  This applies to both Proto1
@@ -1810,19 +1810,19 @@
   @$pb.TagNumber(8)
   $core.bool hasJavaOuterClassname() => $_has(1);
   @$pb.TagNumber(8)
-  void clearJavaOuterClassname() => clearField(8);
+  void clearJavaOuterClassname() => $_clearField(8);
 
   @$pb.TagNumber(9)
   FileOptions_OptimizeMode get optimizeFor => $_getN(2);
   @$pb.TagNumber(9)
   set optimizeFor(FileOptions_OptimizeMode v) {
-    setField(9, v);
+    $_setField(9, v);
   }
 
   @$pb.TagNumber(9)
   $core.bool hasOptimizeFor() => $_has(2);
   @$pb.TagNumber(9)
-  void clearOptimizeFor() => clearField(9);
+  void clearOptimizeFor() => $_clearField(9);
 
   /// If set true, then the Java code generator will generate a separate .java
   /// file for each top-level message, enum, and service defined in the .proto
@@ -1840,7 +1840,7 @@
   @$pb.TagNumber(10)
   $core.bool hasJavaMultipleFiles() => $_has(3);
   @$pb.TagNumber(10)
-  void clearJavaMultipleFiles() => clearField(10);
+  void clearJavaMultipleFiles() => $_clearField(10);
 
   /// Sets the Go package where structs generated from this .proto will be
   /// placed. If omitted, the Go package will be derived from the following:
@@ -1857,7 +1857,7 @@
   @$pb.TagNumber(11)
   $core.bool hasGoPackage() => $_has(4);
   @$pb.TagNumber(11)
-  void clearGoPackage() => clearField(11);
+  void clearGoPackage() => $_clearField(11);
 
   ///  Should generic services be generated in each language?  "Generic" services
   ///  are not specific to any particular RPC system.  They are generated by the
@@ -1879,7 +1879,7 @@
   @$pb.TagNumber(16)
   $core.bool hasCcGenericServices() => $_has(5);
   @$pb.TagNumber(16)
-  void clearCcGenericServices() => clearField(16);
+  void clearCcGenericServices() => $_clearField(16);
 
   @$pb.TagNumber(17)
   $core.bool get javaGenericServices => $_getBF(6);
@@ -1891,7 +1891,7 @@
   @$pb.TagNumber(17)
   $core.bool hasJavaGenericServices() => $_has(6);
   @$pb.TagNumber(17)
-  void clearJavaGenericServices() => clearField(17);
+  void clearJavaGenericServices() => $_clearField(17);
 
   @$pb.TagNumber(18)
   $core.bool get pyGenericServices => $_getBF(7);
@@ -1903,7 +1903,7 @@
   @$pb.TagNumber(18)
   $core.bool hasPyGenericServices() => $_has(7);
   @$pb.TagNumber(18)
-  void clearPyGenericServices() => clearField(18);
+  void clearPyGenericServices() => $_clearField(18);
 
   /// This option does nothing.
   @$core.Deprecated('This field is deprecated.')
@@ -1920,7 +1920,7 @@
   $core.bool hasJavaGenerateEqualsAndHash() => $_has(8);
   @$core.Deprecated('This field is deprecated.')
   @$pb.TagNumber(20)
-  void clearJavaGenerateEqualsAndHash() => clearField(20);
+  void clearJavaGenerateEqualsAndHash() => $_clearField(20);
 
   /// Is this file deprecated?
   /// Depending on the target platform, this can emit Deprecated annotations
@@ -1936,7 +1936,7 @@
   @$pb.TagNumber(23)
   $core.bool hasDeprecated() => $_has(9);
   @$pb.TagNumber(23)
-  void clearDeprecated() => clearField(23);
+  void clearDeprecated() => $_clearField(23);
 
   /// If set true, then the Java2 code generator will generate code that
   /// throws an exception whenever an attempt is made to assign a non-UTF-8
@@ -1954,7 +1954,7 @@
   @$pb.TagNumber(27)
   $core.bool hasJavaStringCheckUtf8() => $_has(10);
   @$pb.TagNumber(27)
-  void clearJavaStringCheckUtf8() => clearField(27);
+  void clearJavaStringCheckUtf8() => $_clearField(27);
 
   /// Enables the use of arenas for the proto messages in this file. This applies
   /// only to generated classes for C++.
@@ -1968,7 +1968,7 @@
   @$pb.TagNumber(31)
   $core.bool hasCcEnableArenas() => $_has(11);
   @$pb.TagNumber(31)
-  void clearCcEnableArenas() => clearField(31);
+  void clearCcEnableArenas() => $_clearField(31);
 
   /// Sets the objective c class prefix which is prepended to all objective c
   /// generated classes from this .proto. There is no default.
@@ -1982,7 +1982,7 @@
   @$pb.TagNumber(36)
   $core.bool hasObjcClassPrefix() => $_has(12);
   @$pb.TagNumber(36)
-  void clearObjcClassPrefix() => clearField(36);
+  void clearObjcClassPrefix() => $_clearField(36);
 
   /// Namespace for generated classes; defaults to the package.
   @$pb.TagNumber(37)
@@ -1995,7 +1995,7 @@
   @$pb.TagNumber(37)
   $core.bool hasCsharpNamespace() => $_has(13);
   @$pb.TagNumber(37)
-  void clearCsharpNamespace() => clearField(37);
+  void clearCsharpNamespace() => $_clearField(37);
 
   /// By default Swift generators will take the proto package and CamelCase it
   /// replacing '.' with underscore and use that to prefix the types/symbols
@@ -2011,7 +2011,7 @@
   @$pb.TagNumber(39)
   $core.bool hasSwiftPrefix() => $_has(14);
   @$pb.TagNumber(39)
-  void clearSwiftPrefix() => clearField(39);
+  void clearSwiftPrefix() => $_clearField(39);
 
   /// Sets the php class prefix which is prepended to all php generated classes
   /// from this .proto. Default is empty.
@@ -2025,7 +2025,7 @@
   @$pb.TagNumber(40)
   $core.bool hasPhpClassPrefix() => $_has(15);
   @$pb.TagNumber(40)
-  void clearPhpClassPrefix() => clearField(40);
+  void clearPhpClassPrefix() => $_clearField(40);
 
   /// Use this option to change the namespace of php generated classes. Default
   /// is empty. When this option is empty, the package name will be used for
@@ -2040,7 +2040,7 @@
   @$pb.TagNumber(41)
   $core.bool hasPhpNamespace() => $_has(16);
   @$pb.TagNumber(41)
-  void clearPhpNamespace() => clearField(41);
+  void clearPhpNamespace() => $_clearField(41);
 
   @$pb.TagNumber(42)
   $core.bool get phpGenericServices => $_getBF(17);
@@ -2052,7 +2052,7 @@
   @$pb.TagNumber(42)
   $core.bool hasPhpGenericServices() => $_has(17);
   @$pb.TagNumber(42)
-  void clearPhpGenericServices() => clearField(42);
+  void clearPhpGenericServices() => $_clearField(42);
 
   /// Use this option to change the namespace of php generated metadata classes.
   /// Default is empty. When this option is empty, the proto file name will be
@@ -2067,7 +2067,7 @@
   @$pb.TagNumber(44)
   $core.bool hasPhpMetadataNamespace() => $_has(18);
   @$pb.TagNumber(44)
-  void clearPhpMetadataNamespace() => clearField(44);
+  void clearPhpMetadataNamespace() => $_clearField(44);
 
   /// Use this option to change the package of ruby generated classes. Default
   /// is empty. When this option is not set, the package name will be used for
@@ -2082,7 +2082,7 @@
   @$pb.TagNumber(45)
   $core.bool hasRubyPackage() => $_has(19);
   @$pb.TagNumber(45)
-  void clearRubyPackage() => clearField(45);
+  void clearRubyPackage() => $_clearField(45);
 
   /// The parser stores options it doesn't recognize here.
   /// See the documentation for the "Options" section above.
@@ -2189,7 +2189,7 @@
   @$pb.TagNumber(1)
   $core.bool hasMessageSetWireFormat() => $_has(0);
   @$pb.TagNumber(1)
-  void clearMessageSetWireFormat() => clearField(1);
+  void clearMessageSetWireFormat() => $_clearField(1);
 
   /// Disables the generation of the standard "descriptor()" accessor, which can
   /// conflict with a field of the same name.  This is meant to make migration
@@ -2204,7 +2204,7 @@
   @$pb.TagNumber(2)
   $core.bool hasNoStandardDescriptorAccessor() => $_has(1);
   @$pb.TagNumber(2)
-  void clearNoStandardDescriptorAccessor() => clearField(2);
+  void clearNoStandardDescriptorAccessor() => $_clearField(2);
 
   /// Is this message deprecated?
   /// Depending on the target platform, this can emit Deprecated annotations
@@ -2220,7 +2220,7 @@
   @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(2);
   @$pb.TagNumber(3)
-  void clearDeprecated() => clearField(3);
+  void clearDeprecated() => $_clearField(3);
 
   ///  Whether the message is an automatically generated map entry type for the
   ///  maps field.
@@ -2253,7 +2253,7 @@
   @$pb.TagNumber(7)
   $core.bool hasMapEntry() => $_has(3);
   @$pb.TagNumber(7)
-  void clearMapEntry() => clearField(7);
+  void clearMapEntry() => $_clearField(7);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2357,13 +2357,13 @@
   FieldOptions_CType get ctype => $_getN(0);
   @$pb.TagNumber(1)
   set ctype(FieldOptions_CType v) {
-    setField(1, v);
+    $_setField(1, v);
   }
 
   @$pb.TagNumber(1)
   $core.bool hasCtype() => $_has(0);
   @$pb.TagNumber(1)
-  void clearCtype() => clearField(1);
+  void clearCtype() => $_clearField(1);
 
   /// The packed option can be enabled for repeated primitive fields to enable
   /// a more efficient representation on the wire. Rather than repeatedly
@@ -2380,7 +2380,7 @@
   @$pb.TagNumber(2)
   $core.bool hasPacked() => $_has(1);
   @$pb.TagNumber(2)
-  void clearPacked() => clearField(2);
+  void clearPacked() => $_clearField(2);
 
   /// Is this field deprecated?
   /// Depending on the target platform, this can emit Deprecated annotations
@@ -2396,7 +2396,7 @@
   @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(2);
   @$pb.TagNumber(3)
-  void clearDeprecated() => clearField(3);
+  void clearDeprecated() => $_clearField(3);
 
   ///  Should this field be parsed lazily?  Lazy applies only to message-type
   ///  fields.  It means that when the outer message is initially parsed, the
@@ -2436,7 +2436,7 @@
   @$pb.TagNumber(5)
   $core.bool hasLazy() => $_has(3);
   @$pb.TagNumber(5)
-  void clearLazy() => clearField(5);
+  void clearLazy() => $_clearField(5);
 
   ///  The jstype option determines the JavaScript type used for values of the
   ///  field.  The option is permitted only for 64 bit integral and fixed types
@@ -2453,13 +2453,13 @@
   FieldOptions_JSType get jstype => $_getN(4);
   @$pb.TagNumber(6)
   set jstype(FieldOptions_JSType v) {
-    setField(6, v);
+    $_setField(6, v);
   }
 
   @$pb.TagNumber(6)
   $core.bool hasJstype() => $_has(4);
   @$pb.TagNumber(6)
-  void clearJstype() => clearField(6);
+  void clearJstype() => $_clearField(6);
 
   /// For Google-internal migration only. Do not use.
   @$pb.TagNumber(10)
@@ -2472,7 +2472,7 @@
   @$pb.TagNumber(10)
   $core.bool hasWeak() => $_has(5);
   @$pb.TagNumber(10)
-  void clearWeak() => clearField(10);
+  void clearWeak() => $_clearField(10);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2607,7 +2607,7 @@
   @$pb.TagNumber(2)
   $core.bool hasAllowAlias() => $_has(0);
   @$pb.TagNumber(2)
-  void clearAllowAlias() => clearField(2);
+  void clearAllowAlias() => $_clearField(2);
 
   /// Is this enum deprecated?
   /// Depending on the target platform, this can emit Deprecated annotations
@@ -2623,7 +2623,7 @@
   @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(1);
   @$pb.TagNumber(3)
-  void clearDeprecated() => clearField(3);
+  void clearDeprecated() => $_clearField(3);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2700,7 +2700,7 @@
   @$pb.TagNumber(1)
   $core.bool hasDeprecated() => $_has(0);
   @$pb.TagNumber(1)
-  void clearDeprecated() => clearField(1);
+  void clearDeprecated() => $_clearField(1);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2777,7 +2777,7 @@
   @$pb.TagNumber(33)
   $core.bool hasDeprecated() => $_has(0);
   @$pb.TagNumber(33)
-  void clearDeprecated() => clearField(33);
+  void clearDeprecated() => $_clearField(33);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2863,19 +2863,19 @@
   @$pb.TagNumber(33)
   $core.bool hasDeprecated() => $_has(0);
   @$pb.TagNumber(33)
-  void clearDeprecated() => clearField(33);
+  void clearDeprecated() => $_clearField(33);
 
   @$pb.TagNumber(34)
   MethodOptions_IdempotencyLevel get idempotencyLevel => $_getN(1);
   @$pb.TagNumber(34)
   set idempotencyLevel(MethodOptions_IdempotencyLevel v) {
-    setField(34, v);
+    $_setField(34, v);
   }
 
   @$pb.TagNumber(34)
   $core.bool hasIdempotencyLevel() => $_has(1);
   @$pb.TagNumber(34)
-  void clearIdempotencyLevel() => clearField(34);
+  void clearIdempotencyLevel() => $_clearField(34);
 
   /// The parser stores options it doesn't recognize here. See above.
   @$pb.TagNumber(999)
@@ -2955,7 +2955,7 @@
   @$pb.TagNumber(1)
   $core.bool hasNamePart() => $_has(0);
   @$pb.TagNumber(1)
-  void clearNamePart() => clearField(1);
+  void clearNamePart() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.bool get isExtension => $_getBF(1);
@@ -2967,7 +2967,7 @@
   @$pb.TagNumber(2)
   $core.bool hasIsExtension() => $_has(1);
   @$pb.TagNumber(2)
-  void clearIsExtension() => clearField(2);
+  void clearIsExtension() => $_clearField(2);
 }
 
 /// A message representing a option the parser does not recognize. This only
@@ -3075,7 +3075,7 @@
   @$pb.TagNumber(3)
   $core.bool hasIdentifierValue() => $_has(1);
   @$pb.TagNumber(3)
-  void clearIdentifierValue() => clearField(3);
+  void clearIdentifierValue() => $_clearField(3);
 
   @$pb.TagNumber(4)
   $fixnum.Int64 get positiveIntValue => $_getI64(2);
@@ -3087,7 +3087,7 @@
   @$pb.TagNumber(4)
   $core.bool hasPositiveIntValue() => $_has(2);
   @$pb.TagNumber(4)
-  void clearPositiveIntValue() => clearField(4);
+  void clearPositiveIntValue() => $_clearField(4);
 
   @$pb.TagNumber(5)
   $fixnum.Int64 get negativeIntValue => $_getI64(3);
@@ -3099,7 +3099,7 @@
   @$pb.TagNumber(5)
   $core.bool hasNegativeIntValue() => $_has(3);
   @$pb.TagNumber(5)
-  void clearNegativeIntValue() => clearField(5);
+  void clearNegativeIntValue() => $_clearField(5);
 
   @$pb.TagNumber(6)
   $core.double get doubleValue => $_getN(4);
@@ -3111,7 +3111,7 @@
   @$pb.TagNumber(6)
   $core.bool hasDoubleValue() => $_has(4);
   @$pb.TagNumber(6)
-  void clearDoubleValue() => clearField(6);
+  void clearDoubleValue() => $_clearField(6);
 
   @$pb.TagNumber(7)
   $core.List<$core.int> get stringValue => $_getN(5);
@@ -3123,7 +3123,7 @@
   @$pb.TagNumber(7)
   $core.bool hasStringValue() => $_has(5);
   @$pb.TagNumber(7)
-  void clearStringValue() => clearField(7);
+  void clearStringValue() => $_clearField(7);
 
   @$pb.TagNumber(8)
   $core.String get aggregateValue => $_getSZ(6);
@@ -3135,7 +3135,7 @@
   @$pb.TagNumber(8)
   $core.bool hasAggregateValue() => $_has(6);
   @$pb.TagNumber(8)
-  void clearAggregateValue() => clearField(8);
+  void clearAggregateValue() => $_clearField(8);
 }
 
 class SourceCodeInfo_Location extends $pb.GeneratedMessage {
@@ -3300,7 +3300,7 @@
   @$pb.TagNumber(3)
   $core.bool hasLeadingComments() => $_has(2);
   @$pb.TagNumber(3)
-  void clearLeadingComments() => clearField(3);
+  void clearLeadingComments() => $_clearField(3);
 
   @$pb.TagNumber(4)
   $core.String get trailingComments => $_getSZ(3);
@@ -3312,7 +3312,7 @@
   @$pb.TagNumber(4)
   $core.bool hasTrailingComments() => $_has(3);
   @$pb.TagNumber(4)
-  void clearTrailingComments() => clearField(4);
+  void clearTrailingComments() => $_clearField(4);
 
   @$pb.TagNumber(6)
   $core.List<$core.String> get leadingDetachedComments => $_getList(4);
@@ -3502,7 +3502,7 @@
   @$pb.TagNumber(2)
   $core.bool hasSourceFile() => $_has(1);
   @$pb.TagNumber(2)
-  void clearSourceFile() => clearField(2);
+  void clearSourceFile() => $_clearField(2);
 
   /// Identifies the starting offset in bytes in the generated code
   /// that relates to the identified object.
@@ -3516,7 +3516,7 @@
   @$pb.TagNumber(3)
   $core.bool hasBegin() => $_has(2);
   @$pb.TagNumber(3)
-  void clearBegin() => clearField(3);
+  void clearBegin() => $_clearField(3);
 
   /// Identifies the ending offset in bytes in the generated code that
   /// relates to the identified offset. The end offset should be one past
@@ -3531,7 +3531,7 @@
   @$pb.TagNumber(4)
   $core.bool hasEnd() => $_has(3);
   @$pb.TagNumber(4)
-  void clearEnd() => clearField(4);
+  void clearEnd() => $_clearField(4);
 }
 
 /// Describes the relationship between generated code and its original source
diff --git a/protoc_plugin/lib/src/generated/plugin.pb.dart b/protoc_plugin/lib/src/generated/plugin.pb.dart
index f05dbe1..bad2418 100644
--- a/protoc_plugin/lib/src/generated/plugin.pb.dart
+++ b/protoc_plugin/lib/src/generated/plugin.pb.dart
@@ -91,7 +91,7 @@
   @$pb.TagNumber(1)
   $core.bool hasMajor() => $_has(0);
   @$pb.TagNumber(1)
-  void clearMajor() => clearField(1);
+  void clearMajor() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get minor => $_getIZ(1);
@@ -103,7 +103,7 @@
   @$pb.TagNumber(2)
   $core.bool hasMinor() => $_has(1);
   @$pb.TagNumber(2)
-  void clearMinor() => clearField(2);
+  void clearMinor() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $core.int get patch => $_getIZ(2);
@@ -115,7 +115,7 @@
   @$pb.TagNumber(3)
   $core.bool hasPatch() => $_has(2);
   @$pb.TagNumber(3)
-  void clearPatch() => clearField(3);
+  void clearPatch() => $_clearField(3);
 
   /// A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
   /// be empty for mainline stable releases.
@@ -129,7 +129,7 @@
   @$pb.TagNumber(4)
   $core.bool hasSuffix() => $_has(3);
   @$pb.TagNumber(4)
-  void clearSuffix() => clearField(4);
+  void clearSuffix() => $_clearField(4);
 }
 
 /// An encoded CodeGeneratorRequest is written to the plugin's stdin.
@@ -217,20 +217,20 @@
   @$pb.TagNumber(2)
   $core.bool hasParameter() => $_has(1);
   @$pb.TagNumber(2)
-  void clearParameter() => clearField(2);
+  void clearParameter() => $_clearField(2);
 
   /// The version number of protocol compiler.
   @$pb.TagNumber(3)
   Version get compilerVersion => $_getN(2);
   @$pb.TagNumber(3)
   set compilerVersion(Version v) {
-    setField(3, v);
+    $_setField(3, v);
   }
 
   @$pb.TagNumber(3)
   $core.bool hasCompilerVersion() => $_has(2);
   @$pb.TagNumber(3)
-  void clearCompilerVersion() => clearField(3);
+  void clearCompilerVersion() => $_clearField(3);
   @$pb.TagNumber(3)
   Version ensureCompilerVersion() => $_ensure(2);
 
@@ -342,7 +342,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 
   ///  If non-empty, indicates that the named file should already exist, and the
   ///  content here is to be inserted into that file at a defined insertion
@@ -391,7 +391,7 @@
   @$pb.TagNumber(2)
   $core.bool hasInsertionPoint() => $_has(1);
   @$pb.TagNumber(2)
-  void clearInsertionPoint() => clearField(2);
+  void clearInsertionPoint() => $_clearField(2);
 
   /// The file contents.
   @$pb.TagNumber(15)
@@ -404,7 +404,7 @@
   @$pb.TagNumber(15)
   $core.bool hasContent() => $_has(2);
   @$pb.TagNumber(15)
-  void clearContent() => clearField(15);
+  void clearContent() => $_clearField(15);
 
   /// Information describing the file content being inserted. If an insertion
   /// point is used, this information will be appropriately offset and inserted
@@ -413,13 +413,13 @@
   $0.GeneratedCodeInfo get generatedCodeInfo => $_getN(3);
   @$pb.TagNumber(16)
   set generatedCodeInfo($0.GeneratedCodeInfo v) {
-    setField(16, v);
+    $_setField(16, v);
   }
 
   @$pb.TagNumber(16)
   $core.bool hasGeneratedCodeInfo() => $_has(3);
   @$pb.TagNumber(16)
-  void clearGeneratedCodeInfo() => clearField(16);
+  void clearGeneratedCodeInfo() => $_clearField(16);
   @$pb.TagNumber(16)
   $0.GeneratedCodeInfo ensureGeneratedCodeInfo() => $_ensure(3);
 }
@@ -508,7 +508,7 @@
   @$pb.TagNumber(1)
   $core.bool hasError() => $_has(0);
   @$pb.TagNumber(1)
-  void clearError() => clearField(1);
+  void clearError() => $_clearField(1);
 
   /// A bitmask of supported features that the code generator supports.
   /// This is a bitwise "or" of values from the Feature enum.
@@ -522,7 +522,7 @@
   @$pb.TagNumber(2)
   $core.bool hasSupportedFeatures() => $_has(1);
   @$pb.TagNumber(2)
-  void clearSupportedFeatures() => clearField(2);
+  void clearSupportedFeatures() => $_clearField(2);
 
   @$pb.TagNumber(15)
   $core.List<CodeGeneratorResponse_File> get file => $_getList(2);
diff --git a/protoc_plugin/lib/src/message_generator.dart b/protoc_plugin/lib/src/message_generator.dart
index ee6e099..b3020c8 100644
--- a/protoc_plugin/lib/src/message_generator.dart
+++ b/protoc_plugin/lib/src/message_generator.dart
@@ -535,7 +535,7 @@
     out.println('${oneof.oneofEnumName} ${oneof.whichOneofMethodName}() '
         '=> ${oneof.byTagMapName}[\$_whichOneof(${oneof.index})]!;');
     out.println('void ${oneof.clearMethodName}() '
-        '=> clearField(\$_whichOneof(${oneof.index}));');
+        '=> \$_clearField(\$_whichOneof(${oneof.index}));');
   }
 
   void generateFieldAccessorsMutators(
@@ -597,7 +597,7 @@
         out.printlnAnnotated(
             'set ${names.fieldName}'
             '($fieldTypeString v) { '
-            'setField(${field.number}, v);'
+            '\$_setField(${field.number}, v);'
             ' }',
             [
               NamedLocation(
@@ -625,7 +625,7 @@
       _emitIndexAnnotation(field.number, out);
       out.printlnAnnotated(
           'void ${names.clearMethodName}() =>'
-          ' clearField(${field.number});',
+          ' \$_clearField(${field.number});',
           [
             NamedLocation(
                 name: names.clearMethodName!,
diff --git a/protoc_plugin/test/goldens/deprecations b/protoc_plugin/test/goldens/deprecations
index 9a03a71..97e98f7 100644
--- a/protoc_plugin/test/goldens/deprecations
+++ b/protoc_plugin/test/goldens/deprecations
@@ -73,7 +73,7 @@
   $core.bool hasName() => $_has(0);
   @$core.Deprecated('This field is deprecated.')
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 }
 
 class HelloReply extends $pb.GeneratedMessage {
@@ -124,7 +124,7 @@
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
-  void clearMessage() => clearField(1);
+  void clearMessage() => $_clearField(1);
 }
 
 @$core.Deprecated('This service is deprecated')
diff --git a/protoc_plugin/test/goldens/doc_comments b/protoc_plugin/test/goldens/doc_comments
index e7964ee..9460bcd 100644
--- a/protoc_plugin/test/goldens/doc_comments
+++ b/protoc_plugin/test/goldens/doc_comments
@@ -70,7 +70,7 @@
   @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
   @$pb.TagNumber(1)
-  void clearName() => clearField(1);
+  void clearName() => $_clearField(1);
 }
 
 class HelloReply extends $pb.GeneratedMessage {
@@ -121,7 +121,7 @@
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
-  void clearMessage() => clearField(1);
+  void clearMessage() => $_clearField(1);
 }
 
 /// This is a service.
diff --git a/protoc_plugin/test/goldens/imports.pb b/protoc_plugin/test/goldens/imports.pb
index 0f8f891..288535a 100644
--- a/protoc_plugin/test/goldens/imports.pb
+++ b/protoc_plugin/test/goldens/imports.pb
@@ -55,33 +55,33 @@
   @$pb.TagNumber(1)
   M get m => $_getN(0);
   @$pb.TagNumber(1)
-  set m(M v) { setField(1, v); }
+  set m(M v) { $_setField(1, v); }
   @$pb.TagNumber(1)
   $core.bool hasM() => $_has(0);
   @$pb.TagNumber(1)
-  void clearM() => clearField(1);
+  void clearM() => $_clearField(1);
   @$pb.TagNumber(1)
   M ensureM() => $_ensure(0);
 
   @$pb.TagNumber(2)
   $1.M get m1 => $_getN(1);
   @$pb.TagNumber(2)
-  set m1($1.M v) { setField(2, v); }
+  set m1($1.M v) { $_setField(2, v); }
   @$pb.TagNumber(2)
   $core.bool hasM1() => $_has(1);
   @$pb.TagNumber(2)
-  void clearM1() => clearField(2);
+  void clearM1() => $_clearField(2);
   @$pb.TagNumber(2)
   $1.M ensureM1() => $_ensure(1);
 
   @$pb.TagNumber(3)
   $2.M get m2 => $_getN(2);
   @$pb.TagNumber(3)
-  set m2($2.M v) { setField(3, v); }
+  set m2($2.M v) { $_setField(3, v); }
   @$pb.TagNumber(3)
   $core.bool hasM2() => $_has(2);
   @$pb.TagNumber(3)
-  void clearM2() => clearField(3);
+  void clearM2() => $_clearField(3);
   @$pb.TagNumber(3)
   $2.M ensureM2() => $_ensure(2);
 }
diff --git a/protoc_plugin/test/goldens/int64.pb b/protoc_plugin/test/goldens/int64.pb
index 047e012..64040ad 100644
--- a/protoc_plugin/test/goldens/int64.pb
+++ b/protoc_plugin/test/goldens/int64.pb
@@ -55,7 +55,7 @@
   @$pb.TagNumber(1)
   $core.bool hasValue() => $_has(0);
   @$pb.TagNumber(1)
-  void clearValue() => clearField(1);
+  void clearValue() => $_clearField(1);
 }
 
 
diff --git a/protoc_plugin/test/goldens/messageGenerator b/protoc_plugin/test/goldens/messageGenerator
index b4c504d..5eab020 100644
--- a/protoc_plugin/test/goldens/messageGenerator
+++ b/protoc_plugin/test/goldens/messageGenerator
@@ -39,16 +39,16 @@
   @$pb.TagNumber(1)
   $core.bool hasNumber() => $_has(0);
   @$pb.TagNumber(1)
-  void clearNumber() => clearField(1);
+  void clearNumber() => $_clearField(1);
 
   @$pb.TagNumber(2)
   PhoneNumber_PhoneType get type => $_getN(1);
   @$pb.TagNumber(2)
-  set type(PhoneNumber_PhoneType v) { setField(2, v); }
+  set type(PhoneNumber_PhoneType v) { $_setField(2, v); }
   @$pb.TagNumber(2)
   $core.bool hasType() => $_has(1);
   @$pb.TagNumber(2)
-  void clearType() => clearField(2);
+  void clearType() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $core.String get name => $_getS(2, '\$');
@@ -57,7 +57,7 @@
   @$pb.TagNumber(3)
   $core.bool hasName() => $_has(2);
   @$pb.TagNumber(3)
-  void clearName() => clearField(3);
+  void clearName() => $_clearField(3);
 
   @$core.Deprecated('This field is deprecated.')
   @$pb.TagNumber(4)
@@ -70,7 +70,7 @@
   $core.bool hasDeprecatedField() => $_has(3);
   @$core.Deprecated('This field is deprecated.')
   @$pb.TagNumber(4)
-  void clearDeprecatedField() => clearField(4);
+  void clearDeprecatedField() => $_clearField(4);
 }
 
 
diff --git a/protoc_plugin/test/goldens/messageGenerator.meta b/protoc_plugin/test/goldens/messageGenerator.meta
index 090ca15..c398f60 100644
--- a/protoc_plugin/test/goldens/messageGenerator.meta
+++ b/protoc_plugin/test/goldens/messageGenerator.meta
@@ -54,8 +54,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 2263
-  end: 2267
+  begin: 2265
+  end: 2269
 }
 annotation: {
   path: 4
@@ -63,8 +63,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 2308
-  end: 2312
+  begin: 2310
+  end: 2314
 }
 annotation: {
   path: 4
@@ -72,8 +72,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 2391
-  end: 2398
+  begin: 2395
+  end: 2402
 }
 annotation: {
   path: 4
@@ -81,8 +81,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 2441
-  end: 2450
+  begin: 2445
+  end: 2454
 }
 annotation: {
   path: 4
@@ -90,8 +90,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 2511
-  end: 2515
+  begin: 2517
+  end: 2521
 }
 annotation: {
   path: 4
@@ -99,8 +99,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 2562
-  end: 2566
+  begin: 2568
+  end: 2572
 }
 annotation: {
   path: 4
@@ -108,8 +108,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 2639
-  end: 2646
+  begin: 2645
+  end: 2652
 }
 annotation: {
   path: 4
@@ -117,8 +117,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 2689
-  end: 2698
+  begin: 2695
+  end: 2704
 }
 annotation: {
   path: 4
@@ -126,8 +126,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2808
-  end: 2823
+  begin: 2816
+  end: 2831
 }
 annotation: {
   path: 4
@@ -135,8 +135,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2914
-  end: 2929
+  begin: 2922
+  end: 2937
 }
 annotation: {
   path: 4
@@ -144,8 +144,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 3051
-  end: 3069
+  begin: 3059
+  end: 3077
 }
 annotation: {
   path: 4
@@ -153,6 +153,6 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 3161
-  end: 3181
+  begin: 3169
+  end: 3189
 }
diff --git a/protoc_plugin/test/goldens/oneMessage.pb b/protoc_plugin/test/goldens/oneMessage.pb
index 984bc61..c5212f9 100644
--- a/protoc_plugin/test/goldens/oneMessage.pb
+++ b/protoc_plugin/test/goldens/oneMessage.pb
@@ -55,7 +55,7 @@
   @$pb.TagNumber(1)
   $core.bool hasNumber() => $_has(0);
   @$pb.TagNumber(1)
-  void clearNumber() => clearField(1);
+  void clearNumber() => $_clearField(1);
 
   @$pb.TagNumber(2)
   $core.int get type => $_getIZ(1);
@@ -64,7 +64,7 @@
   @$pb.TagNumber(2)
   $core.bool hasType() => $_has(1);
   @$pb.TagNumber(2)
-  void clearType() => clearField(2);
+  void clearType() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $core.String get name => $_getS(2, '\$');
@@ -73,7 +73,7 @@
   @$pb.TagNumber(3)
   $core.bool hasName() => $_has(2);
   @$pb.TagNumber(3)
-  void clearName() => clearField(3);
+  void clearName() => $_clearField(3);
 }
 
 
diff --git a/protoc_plugin/test/goldens/oneMessage.pb.meta b/protoc_plugin/test/goldens/oneMessage.pb.meta
index 9e1a0e9..20dfc3c 100644
--- a/protoc_plugin/test/goldens/oneMessage.pb.meta
+++ b/protoc_plugin/test/goldens/oneMessage.pb.meta
@@ -54,8 +54,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 2576
-  end: 2580
+  begin: 2578
+  end: 2582
 }
 annotation: {
   path: 4
@@ -63,8 +63,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 2622
-  end: 2626
+  begin: 2624
+  end: 2628
 }
 annotation: {
   path: 4
@@ -72,8 +72,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 2701
-  end: 2708
+  begin: 2703
+  end: 2710
 }
 annotation: {
   path: 4
@@ -81,8 +81,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 2751
-  end: 2760
+  begin: 2753
+  end: 2762
 }
 annotation: {
   path: 4
@@ -90,8 +90,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2821
-  end: 2825
+  begin: 2825
+  end: 2829
 }
 annotation: {
   path: 4
@@ -99,8 +99,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2872
-  end: 2876
+  begin: 2876
+  end: 2880
 }
 annotation: {
   path: 4
@@ -108,8 +108,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2949
-  end: 2956
+  begin: 2953
+  end: 2960
 }
 annotation: {
   path: 4
@@ -117,6 +117,6 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2999
-  end: 3008
+  begin: 3003
+  end: 3012
 }