Annotate fields accessors with tagNumber  (#282)


diff --git a/protobuf/CHANGELOG.md b/protobuf/CHANGELOG.md
index e3e0336..7b39814 100644
--- a/protobuf/CHANGELOG.md
+++ b/protobuf/CHANGELOG.md
@@ -1,12 +1,11 @@
 ## 0.14.4
-
 * Add `permissiveEnums` option to `mergeFromProto3Json`.
   It will do a case-insensitive matching of enum values ignoring `-` and `_`.
-
 * Add support for 'ensureX' methods generated by `protoc_plugin` 19.0.0.
-
 * Add specialized getters for `String`, `int`, and `bool` with usual default values.
 * Shrink dart2js generated code for `getDefault()`.
+* Added an annotation class `TagNumber`. This is used by code generated by
+  `protoc_plugin` from version 19.0.0.
 
 ## 0.14.3
 
diff --git a/protobuf/lib/src/protobuf/builder_info.dart b/protobuf/lib/src/protobuf/builder_info.dart
index dc49cdb..86e6b82 100644
--- a/protobuf/lib/src/protobuf/builder_info.dart
+++ b/protobuf/lib/src/protobuf/builder_info.dart
@@ -285,3 +285,15 @@
     return f(rawValue);
   }
 }
+
+/// Annotation for marking accessors that belong together.
+class TagNumber {
+  final int tagNumber;
+
+  /// Annotation for marking accessors that belong together.
+  ///
+  /// Allows tooling to associate related accessors.
+  /// [tagNumber] is the protobuf tagnumber associated with the annotated
+  /// accessor.
+  const TagNumber(this.tagNumber);
+}
diff --git a/protobuf/pubspec.yaml b/protobuf/pubspec.yaml
index 4cd2d7e..d3ced8c 100644
--- a/protobuf/pubspec.yaml
+++ b/protobuf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protobuf
-version: 0.14.4-dev
+version: 0.14.4
 author: Dart Team <misc@dartlang.org>
 description: >
   Runtime library for protocol buffers support.
diff --git a/protoc_plugin/CHANGELOG.md b/protoc_plugin/CHANGELOG.md
index d37ed94..7bfe13a 100644
--- a/protoc_plugin/CHANGELOG.md
+++ b/protoc_plugin/CHANGELOG.md
@@ -1,9 +1,16 @@
-## 19.0.0-dev
+## 19.0.0
 * Breaking: Generates code that requires at least `protobuf` 0.14.4.
+  If protoc_plugin is installed in your path with `pub global activate` you can upgrade with `pub global activate protoc_plugin 19.0.0`
   - GeneratedMessage classes now have methods `ensureX` for each message field X.
   - Add specialized getters for `String`, `int`, and `bool` with usual default values.
+  - Annotate generated accessors with the tag number of the associated field.
 * Breaking: Use unmangled names for the string representation of enum values.
   Mangled names would lead to wrong proto3 json en- and decoding.
+* Annotate generated accessors with the tag number of the associated field.
+
+## 18.0.3
+
+* Fix: Allow decoding tagnumbers of up to 29 bits. Would fail before with more than 28 bits.
 
 ## 18.0.2
 
diff --git a/protoc_plugin/lib/message_generator.dart b/protoc_plugin/lib/message_generator.dart
index d38f7d8..221d827 100644
--- a/protoc_plugin/lib/message_generator.dart
+++ b/protoc_plugin/lib/message_generator.dart
@@ -453,6 +453,7 @@
 
     _emitDeprecatedIf(field.isDeprecated, out);
     _emitOverrideIf(field.overridesGetter, out);
+    _emitIndexAnnotation(field.number, out);
     final getterExpr = _getterExpression(fieldTypeString, field.index,
         defaultExpr, field.isRepeated, field.isMapField);
     out.printlnAnnotated(
@@ -480,6 +481,7 @@
       var fastSetter = field.baseType.setter;
       _emitDeprecatedIf(field.isDeprecated, out);
       _emitOverrideIf(field.overridesSetter, out);
+      _emitIndexAnnotation(field.number, out);
       if (fastSetter != null) {
         out.printlnAnnotated(
             'set ${names.fieldName}'
@@ -507,6 +509,7 @@
       }
       _emitDeprecatedIf(field.isDeprecated, out);
       _emitOverrideIf(field.overridesHasMethod, out);
+      _emitIndexAnnotation(field.number, out);
       out.printlnAnnotated(
           '$_coreImportPrefix.bool ${names.hasMethodName}() =>'
           ' \$_has(${field.index});',
@@ -518,6 +521,7 @@
           ]);
       _emitDeprecatedIf(field.isDeprecated, out);
       _emitOverrideIf(field.overridesClearMethod, out);
+      _emitIndexAnnotation(field.number, out);
       out.printlnAnnotated(
           'void ${names.clearMethodName}() =>'
           ' clearField(${field.number});',
@@ -528,6 +532,8 @@
                 start: 'void '.length)
           ]);
       if (field.baseType.isMessage) {
+        _emitDeprecatedIf(field.isDeprecated, out);
+        _emitIndexAnnotation(field.number, out);
         out.printlnAnnotated(
             '${fieldTypeString} ${names.ensureMethodName}() => '
             '\$_ensure(${field.index});',
@@ -586,6 +592,10 @@
     }
   }
 
+  void _emitIndexAnnotation(int index, IndentingWriter out) {
+    out.println('@$_protobufImportPrefix.TagNumber($index)');
+  }
+
   void generateEnums(IndentingWriter out) {
     for (EnumGenerator e in _enumGenerators) {
       e.generate(out);
diff --git a/protoc_plugin/lib/src/dart_options.pb.dart b/protoc_plugin/lib/src/dart_options.pb.dart
index 169aaa4..ad2b620 100644
--- a/protoc_plugin/lib/src/dart_options.pb.dart
+++ b/protoc_plugin/lib/src/dart_options.pb.dart
@@ -39,28 +39,40 @@
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DartMixin>(create);
   static DartMixin _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.String get importFrom => $_getSZ(1);
+  @$pb.TagNumber(2)
   set importFrom($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasImportFrom() => $_has(1);
+  @$pb.TagNumber(2)
   void clearImportFrom() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.String get parent => $_getSZ(2);
+  @$pb.TagNumber(3)
   set parent($core.String v) {
     $_setString(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasParent() => $_has(2);
+  @$pb.TagNumber(3)
   void clearParent() => clearField(3);
 }
 
@@ -93,6 +105,7 @@
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Imports>(create);
   static Imports _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<DartMixin> get mixins => $_getList(0);
 }
 
diff --git a/protoc_plugin/lib/src/descriptor.pb.dart b/protoc_plugin/lib/src/descriptor.pb.dart
index 7ad4303..59408ef 100644
--- a/protoc_plugin/lib/src/descriptor.pb.dart
+++ b/protoc_plugin/lib/src/descriptor.pb.dart
@@ -43,6 +43,7 @@
       $pb.GeneratedMessage.$_defaultFor<FileDescriptorSet>(create);
   static FileDescriptorSet _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<FileDescriptorProto> get file => $_getList(0);
 }
 
@@ -90,58 +91,89 @@
       $pb.GeneratedMessage.$_defaultFor<FileDescriptorProto>(create);
   static FileDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.String get package => $_getSZ(1);
+  @$pb.TagNumber(2)
   set package($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasPackage() => $_has(1);
+  @$pb.TagNumber(2)
   void clearPackage() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.List<$core.String> get dependency => $_getList(2);
 
+  @$pb.TagNumber(4)
   $core.List<DescriptorProto> get messageType => $_getList(3);
 
+  @$pb.TagNumber(5)
   $core.List<EnumDescriptorProto> get enumType => $_getList(4);
 
+  @$pb.TagNumber(6)
   $core.List<ServiceDescriptorProto> get service => $_getList(5);
 
+  @$pb.TagNumber(7)
   $core.List<FieldDescriptorProto> get extension => $_getList(6);
 
+  @$pb.TagNumber(8)
   FileOptions get options => $_getN(7);
+  @$pb.TagNumber(8)
   set options(FileOptions v) {
     setField(8, v);
   }
 
+  @$pb.TagNumber(8)
   $core.bool hasOptions() => $_has(7);
+  @$pb.TagNumber(8)
   void clearOptions() => clearField(8);
+  @$pb.TagNumber(8)
+  FileOptions ensureOptions() => $_ensure(7);
 
+  @$pb.TagNumber(9)
   SourceCodeInfo get sourceCodeInfo => $_getN(8);
+  @$pb.TagNumber(9)
   set sourceCodeInfo(SourceCodeInfo v) {
     setField(9, v);
   }
 
+  @$pb.TagNumber(9)
   $core.bool hasSourceCodeInfo() => $_has(8);
+  @$pb.TagNumber(9)
   void clearSourceCodeInfo() => clearField(9);
+  @$pb.TagNumber(9)
+  SourceCodeInfo ensureSourceCodeInfo() => $_ensure(8);
 
+  @$pb.TagNumber(10)
   $core.List<$core.int> get publicDependency => $_getList(9);
 
+  @$pb.TagNumber(11)
   $core.List<$core.int> get weakDependency => $_getList(10);
 
+  @$pb.TagNumber(12)
   $core.String get syntax => $_getSZ(11);
+  @$pb.TagNumber(12)
   set syntax($core.String v) {
     $_setString(11, v);
   }
 
+  @$pb.TagNumber(12)
   $core.bool hasSyntax() => $_has(11);
+  @$pb.TagNumber(12)
   void clearSyntax() => clearField(12);
 }
 
@@ -180,20 +212,28 @@
       $pb.GeneratedMessage.$_defaultFor<DescriptorProto_ExtensionRange>(create);
   static DescriptorProto_ExtensionRange _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.int get start => $_getIZ(0);
+  @$pb.TagNumber(1)
   set start($core.int v) {
     $_setSignedInt32(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasStart() => $_has(0);
+  @$pb.TagNumber(1)
   void clearStart() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.int get end => $_getIZ(1);
+  @$pb.TagNumber(2)
   set end($core.int v) {
     $_setSignedInt32(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasEnd() => $_has(1);
+  @$pb.TagNumber(2)
   void clearEnd() => clearField(2);
 }
 
@@ -232,20 +272,28 @@
       $pb.GeneratedMessage.$_defaultFor<DescriptorProto_ReservedRange>(create);
   static DescriptorProto_ReservedRange _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.int get start => $_getIZ(0);
+  @$pb.TagNumber(1)
   set start($core.int v) {
     $_setSignedInt32(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasStart() => $_has(0);
+  @$pb.TagNumber(1)
   void clearStart() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.int get end => $_getIZ(1);
+  @$pb.TagNumber(2)
   set end($core.int v) {
     $_setSignedInt32(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasEnd() => $_has(1);
+  @$pb.TagNumber(2)
   void clearEnd() => clearField(2);
 }
 
@@ -294,36 +342,54 @@
       $pb.GeneratedMessage.$_defaultFor<DescriptorProto>(create);
   static DescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.List<FieldDescriptorProto> get field => $_getList(1);
 
+  @$pb.TagNumber(3)
   $core.List<DescriptorProto> get nestedType => $_getList(2);
 
+  @$pb.TagNumber(4)
   $core.List<EnumDescriptorProto> get enumType => $_getList(3);
 
+  @$pb.TagNumber(5)
   $core.List<DescriptorProto_ExtensionRange> get extensionRange => $_getList(4);
 
+  @$pb.TagNumber(6)
   $core.List<FieldDescriptorProto> get extension => $_getList(5);
 
+  @$pb.TagNumber(7)
   MessageOptions get options => $_getN(6);
+  @$pb.TagNumber(7)
   set options(MessageOptions v) {
     setField(7, v);
   }
 
+  @$pb.TagNumber(7)
   $core.bool hasOptions() => $_has(6);
+  @$pb.TagNumber(7)
   void clearOptions() => clearField(7);
+  @$pb.TagNumber(7)
+  MessageOptions ensureOptions() => $_ensure(6);
 
+  @$pb.TagNumber(8)
   $core.List<OneofDescriptorProto> get oneofDecl => $_getList(7);
 
+  @$pb.TagNumber(9)
   $core.List<DescriptorProto_ReservedRange> get reservedRange => $_getList(8);
 
+  @$pb.TagNumber(10)
   $core.List<$core.String> get reservedName => $_getList(9);
 }
 
@@ -371,84 +437,126 @@
       $pb.GeneratedMessage.$_defaultFor<FieldDescriptorProto>(create);
   static FieldDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.String get extendee => $_getSZ(1);
+  @$pb.TagNumber(2)
   set extendee($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasExtendee() => $_has(1);
+  @$pb.TagNumber(2)
   void clearExtendee() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.int get number => $_getIZ(2);
+  @$pb.TagNumber(3)
   set number($core.int v) {
     $_setSignedInt32(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasNumber() => $_has(2);
+  @$pb.TagNumber(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);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasLabel() => $_has(3);
+  @$pb.TagNumber(4)
   void clearLabel() => clearField(4);
 
+  @$pb.TagNumber(5)
   FieldDescriptorProto_Type get type => $_getN(4);
+  @$pb.TagNumber(5)
   set type(FieldDescriptorProto_Type v) {
     setField(5, v);
   }
 
+  @$pb.TagNumber(5)
   $core.bool hasType() => $_has(4);
+  @$pb.TagNumber(5)
   void clearType() => clearField(5);
 
+  @$pb.TagNumber(6)
   $core.String get typeName => $_getSZ(5);
+  @$pb.TagNumber(6)
   set typeName($core.String v) {
     $_setString(5, v);
   }
 
+  @$pb.TagNumber(6)
   $core.bool hasTypeName() => $_has(5);
+  @$pb.TagNumber(6)
   void clearTypeName() => clearField(6);
 
+  @$pb.TagNumber(7)
   $core.String get defaultValue => $_getSZ(6);
+  @$pb.TagNumber(7)
   set defaultValue($core.String v) {
     $_setString(6, v);
   }
 
+  @$pb.TagNumber(7)
   $core.bool hasDefaultValue() => $_has(6);
+  @$pb.TagNumber(7)
   void clearDefaultValue() => clearField(7);
 
+  @$pb.TagNumber(8)
   FieldOptions get options => $_getN(7);
+  @$pb.TagNumber(8)
   set options(FieldOptions v) {
     setField(8, v);
   }
 
+  @$pb.TagNumber(8)
   $core.bool hasOptions() => $_has(7);
+  @$pb.TagNumber(8)
   void clearOptions() => clearField(8);
+  @$pb.TagNumber(8)
+  FieldOptions ensureOptions() => $_ensure(7);
 
+  @$pb.TagNumber(9)
   $core.int get oneofIndex => $_getIZ(8);
+  @$pb.TagNumber(9)
   set oneofIndex($core.int v) {
     $_setSignedInt32(8, v);
   }
 
+  @$pb.TagNumber(9)
   $core.bool hasOneofIndex() => $_has(8);
+  @$pb.TagNumber(9)
   void clearOneofIndex() => clearField(9);
 
+  @$pb.TagNumber(10)
   $core.String get jsonName => $_getSZ(9);
+  @$pb.TagNumber(10)
   set jsonName($core.String v) {
     $_setString(9, v);
   }
 
+  @$pb.TagNumber(10)
   $core.bool hasJsonName() => $_has(9);
+  @$pb.TagNumber(10)
   void clearJsonName() => clearField(10);
 }
 
@@ -482,21 +590,31 @@
       $pb.GeneratedMessage.$_defaultFor<OneofDescriptorProto>(create);
   static OneofDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   OneofOptions get options => $_getN(1);
+  @$pb.TagNumber(2)
   set options(OneofOptions v) {
     setField(2, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasOptions() => $_has(1);
+  @$pb.TagNumber(2)
   void clearOptions() => clearField(2);
+  @$pb.TagNumber(2)
+  OneofOptions ensureOptions() => $_ensure(1);
 }
 
 class EnumDescriptorProto extends $pb.GeneratedMessage {
@@ -530,23 +648,34 @@
       $pb.GeneratedMessage.$_defaultFor<EnumDescriptorProto>(create);
   static EnumDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.List<EnumValueDescriptorProto> get value => $_getList(1);
 
+  @$pb.TagNumber(3)
   EnumOptions get options => $_getN(2);
+  @$pb.TagNumber(3)
   set options(EnumOptions v) {
     setField(3, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
+  @$pb.TagNumber(3)
   void clearOptions() => clearField(3);
+  @$pb.TagNumber(3)
+  EnumOptions ensureOptions() => $_ensure(2);
 }
 
 class EnumValueDescriptorProto extends $pb.GeneratedMessage {
@@ -581,29 +710,43 @@
       $pb.GeneratedMessage.$_defaultFor<EnumValueDescriptorProto>(create);
   static EnumValueDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.int get number => $_getIZ(1);
+  @$pb.TagNumber(2)
   set number($core.int v) {
     $_setSignedInt32(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasNumber() => $_has(1);
+  @$pb.TagNumber(2)
   void clearNumber() => clearField(2);
 
+  @$pb.TagNumber(3)
   EnumValueOptions get options => $_getN(2);
+  @$pb.TagNumber(3)
   set options(EnumValueOptions v) {
     setField(3, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
+  @$pb.TagNumber(3)
   void clearOptions() => clearField(3);
+  @$pb.TagNumber(3)
+  EnumValueOptions ensureOptions() => $_ensure(2);
 }
 
 class ServiceDescriptorProto extends $pb.GeneratedMessage {
@@ -639,23 +782,34 @@
       $pb.GeneratedMessage.$_defaultFor<ServiceDescriptorProto>(create);
   static ServiceDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.List<MethodDescriptorProto> get method => $_getList(1);
 
+  @$pb.TagNumber(3)
   ServiceOptions get options => $_getN(2);
+  @$pb.TagNumber(3)
   set options(ServiceOptions v) {
     setField(3, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasOptions() => $_has(2);
+  @$pb.TagNumber(3)
   void clearOptions() => clearField(3);
+  @$pb.TagNumber(3)
+  ServiceOptions ensureOptions() => $_ensure(2);
 }
 
 class MethodDescriptorProto extends $pb.GeneratedMessage {
@@ -693,52 +847,78 @@
       $pb.GeneratedMessage.$_defaultFor<MethodDescriptorProto>(create);
   static MethodDescriptorProto _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.String get inputType => $_getSZ(1);
+  @$pb.TagNumber(2)
   set inputType($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasInputType() => $_has(1);
+  @$pb.TagNumber(2)
   void clearInputType() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.String get outputType => $_getSZ(2);
+  @$pb.TagNumber(3)
   set outputType($core.String v) {
     $_setString(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasOutputType() => $_has(2);
+  @$pb.TagNumber(3)
   void clearOutputType() => clearField(3);
 
+  @$pb.TagNumber(4)
   MethodOptions get options => $_getN(3);
+  @$pb.TagNumber(4)
   set options(MethodOptions v) {
     setField(4, v);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasOptions() => $_has(3);
+  @$pb.TagNumber(4)
   void clearOptions() => clearField(4);
+  @$pb.TagNumber(4)
+  MethodOptions ensureOptions() => $_ensure(3);
 
+  @$pb.TagNumber(5)
   $core.bool get clientStreaming => $_getBF(4);
+  @$pb.TagNumber(5)
   set clientStreaming($core.bool v) {
     $_setBool(4, v);
   }
 
+  @$pb.TagNumber(5)
   $core.bool hasClientStreaming() => $_has(4);
+  @$pb.TagNumber(5)
   void clearClientStreaming() => clearField(5);
 
+  @$pb.TagNumber(6)
   $core.bool get serverStreaming => $_getBF(5);
+  @$pb.TagNumber(6)
   set serverStreaming($core.bool v) {
     $_setBool(5, v);
   }
 
+  @$pb.TagNumber(6)
   $core.bool hasServerStreaming() => $_has(5);
+  @$pb.TagNumber(6)
   void clearServerStreaming() => clearField(6);
 }
 
@@ -791,146 +971,215 @@
       $pb.GeneratedMessage.$_defaultFor<FileOptions>(create);
   static FileOptions _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get javaPackage => $_getSZ(0);
+  @$pb.TagNumber(1)
   set javaPackage($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasJavaPackage() => $_has(0);
+  @$pb.TagNumber(1)
   void clearJavaPackage() => clearField(1);
 
+  @$pb.TagNumber(8)
   $core.String get javaOuterClassname => $_getSZ(1);
+  @$pb.TagNumber(8)
   set javaOuterClassname($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(8)
   $core.bool hasJavaOuterClassname() => $_has(1);
+  @$pb.TagNumber(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);
   }
 
+  @$pb.TagNumber(9)
   $core.bool hasOptimizeFor() => $_has(2);
+  @$pb.TagNumber(9)
   void clearOptimizeFor() => clearField(9);
 
+  @$pb.TagNumber(10)
   $core.bool get javaMultipleFiles => $_getBF(3);
+  @$pb.TagNumber(10)
   set javaMultipleFiles($core.bool v) {
     $_setBool(3, v);
   }
 
+  @$pb.TagNumber(10)
   $core.bool hasJavaMultipleFiles() => $_has(3);
+  @$pb.TagNumber(10)
   void clearJavaMultipleFiles() => clearField(10);
 
+  @$pb.TagNumber(11)
   $core.String get goPackage => $_getSZ(4);
+  @$pb.TagNumber(11)
   set goPackage($core.String v) {
     $_setString(4, v);
   }
 
+  @$pb.TagNumber(11)
   $core.bool hasGoPackage() => $_has(4);
+  @$pb.TagNumber(11)
   void clearGoPackage() => clearField(11);
 
+  @$pb.TagNumber(16)
   $core.bool get ccGenericServices => $_getBF(5);
+  @$pb.TagNumber(16)
   set ccGenericServices($core.bool v) {
     $_setBool(5, v);
   }
 
+  @$pb.TagNumber(16)
   $core.bool hasCcGenericServices() => $_has(5);
+  @$pb.TagNumber(16)
   void clearCcGenericServices() => clearField(16);
 
+  @$pb.TagNumber(17)
   $core.bool get javaGenericServices => $_getBF(6);
+  @$pb.TagNumber(17)
   set javaGenericServices($core.bool v) {
     $_setBool(6, v);
   }
 
+  @$pb.TagNumber(17)
   $core.bool hasJavaGenericServices() => $_has(6);
+  @$pb.TagNumber(17)
   void clearJavaGenericServices() => clearField(17);
 
+  @$pb.TagNumber(18)
   $core.bool get pyGenericServices => $_getBF(7);
+  @$pb.TagNumber(18)
   set pyGenericServices($core.bool v) {
     $_setBool(7, v);
   }
 
+  @$pb.TagNumber(18)
   $core.bool hasPyGenericServices() => $_has(7);
+  @$pb.TagNumber(18)
   void clearPyGenericServices() => clearField(18);
 
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(20)
   $core.bool get javaGenerateEqualsAndHash => $_getBF(8);
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(20)
   set javaGenerateEqualsAndHash($core.bool v) {
     $_setBool(8, v);
   }
 
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(20)
   $core.bool hasJavaGenerateEqualsAndHash() => $_has(8);
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(20)
   void clearJavaGenerateEqualsAndHash() => clearField(20);
 
+  @$pb.TagNumber(23)
   $core.bool get deprecated => $_getBF(9);
+  @$pb.TagNumber(23)
   set deprecated($core.bool v) {
     $_setBool(9, v);
   }
 
+  @$pb.TagNumber(23)
   $core.bool hasDeprecated() => $_has(9);
+  @$pb.TagNumber(23)
   void clearDeprecated() => clearField(23);
 
+  @$pb.TagNumber(27)
   $core.bool get javaStringCheckUtf8 => $_getBF(10);
+  @$pb.TagNumber(27)
   set javaStringCheckUtf8($core.bool v) {
     $_setBool(10, v);
   }
 
+  @$pb.TagNumber(27)
   $core.bool hasJavaStringCheckUtf8() => $_has(10);
+  @$pb.TagNumber(27)
   void clearJavaStringCheckUtf8() => clearField(27);
 
+  @$pb.TagNumber(31)
   $core.bool get ccEnableArenas => $_getBF(11);
+  @$pb.TagNumber(31)
   set ccEnableArenas($core.bool v) {
     $_setBool(11, v);
   }
 
+  @$pb.TagNumber(31)
   $core.bool hasCcEnableArenas() => $_has(11);
+  @$pb.TagNumber(31)
   void clearCcEnableArenas() => clearField(31);
 
+  @$pb.TagNumber(36)
   $core.String get objcClassPrefix => $_getSZ(12);
+  @$pb.TagNumber(36)
   set objcClassPrefix($core.String v) {
     $_setString(12, v);
   }
 
+  @$pb.TagNumber(36)
   $core.bool hasObjcClassPrefix() => $_has(12);
+  @$pb.TagNumber(36)
   void clearObjcClassPrefix() => clearField(36);
 
+  @$pb.TagNumber(37)
   $core.String get csharpNamespace => $_getSZ(13);
+  @$pb.TagNumber(37)
   set csharpNamespace($core.String v) {
     $_setString(13, v);
   }
 
+  @$pb.TagNumber(37)
   $core.bool hasCsharpNamespace() => $_has(13);
+  @$pb.TagNumber(37)
   void clearCsharpNamespace() => clearField(37);
 
+  @$pb.TagNumber(39)
   $core.String get swiftPrefix => $_getSZ(14);
+  @$pb.TagNumber(39)
   set swiftPrefix($core.String v) {
     $_setString(14, v);
   }
 
+  @$pb.TagNumber(39)
   $core.bool hasSwiftPrefix() => $_has(14);
+  @$pb.TagNumber(39)
   void clearSwiftPrefix() => clearField(39);
 
+  @$pb.TagNumber(40)
   $core.String get phpClassPrefix => $_getSZ(15);
+  @$pb.TagNumber(40)
   set phpClassPrefix($core.String v) {
     $_setString(15, v);
   }
 
+  @$pb.TagNumber(40)
   $core.bool hasPhpClassPrefix() => $_has(15);
+  @$pb.TagNumber(40)
   void clearPhpClassPrefix() => clearField(40);
 
+  @$pb.TagNumber(41)
   $core.String get phpNamespace => $_getSZ(16);
+  @$pb.TagNumber(41)
   set phpNamespace($core.String v) {
     $_setString(16, v);
   }
 
+  @$pb.TagNumber(41)
   $core.bool hasPhpNamespace() => $_has(16);
+  @$pb.TagNumber(41)
   void clearPhpNamespace() => clearField(41);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(17);
 }
 
@@ -968,38 +1217,55 @@
       $pb.GeneratedMessage.$_defaultFor<MessageOptions>(create);
   static MessageOptions _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.bool get messageSetWireFormat => $_getBF(0);
+  @$pb.TagNumber(1)
   set messageSetWireFormat($core.bool v) {
     $_setBool(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasMessageSetWireFormat() => $_has(0);
+  @$pb.TagNumber(1)
   void clearMessageSetWireFormat() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.bool get noStandardDescriptorAccessor => $_getBF(1);
+  @$pb.TagNumber(2)
   set noStandardDescriptorAccessor($core.bool v) {
     $_setBool(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasNoStandardDescriptorAccessor() => $_has(1);
+  @$pb.TagNumber(2)
   void clearNoStandardDescriptorAccessor() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.bool get deprecated => $_getBF(2);
+  @$pb.TagNumber(3)
   set deprecated($core.bool v) {
     $_setBool(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(2);
+  @$pb.TagNumber(3)
   void clearDeprecated() => clearField(3);
 
+  @$pb.TagNumber(7)
   $core.bool get mapEntry => $_getBF(3);
+  @$pb.TagNumber(7)
   set mapEntry($core.bool v) {
     $_setBool(3, v);
   }
 
+  @$pb.TagNumber(7)
   $core.bool hasMapEntry() => $_has(3);
+  @$pb.TagNumber(7)
   void clearMapEntry() => clearField(7);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(4);
 }
 
@@ -1045,54 +1311,79 @@
       $pb.GeneratedMessage.$_defaultFor<FieldOptions>(create);
   static FieldOptions _defaultInstance;
 
+  @$pb.TagNumber(1)
   FieldOptions_CType get ctype => $_getN(0);
+  @$pb.TagNumber(1)
   set ctype(FieldOptions_CType v) {
     setField(1, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasCtype() => $_has(0);
+  @$pb.TagNumber(1)
   void clearCtype() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.bool get packed => $_getBF(1);
+  @$pb.TagNumber(2)
   set packed($core.bool v) {
     $_setBool(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasPacked() => $_has(1);
+  @$pb.TagNumber(2)
   void clearPacked() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.bool get deprecated => $_getBF(2);
+  @$pb.TagNumber(3)
   set deprecated($core.bool v) {
     $_setBool(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(2);
+  @$pb.TagNumber(3)
   void clearDeprecated() => clearField(3);
 
+  @$pb.TagNumber(5)
   $core.bool get lazy => $_getBF(3);
+  @$pb.TagNumber(5)
   set lazy($core.bool v) {
     $_setBool(3, v);
   }
 
+  @$pb.TagNumber(5)
   $core.bool hasLazy() => $_has(3);
+  @$pb.TagNumber(5)
   void clearLazy() => clearField(5);
 
+  @$pb.TagNumber(6)
   FieldOptions_JSType get jstype => $_getN(4);
+  @$pb.TagNumber(6)
   set jstype(FieldOptions_JSType v) {
     setField(6, v);
   }
 
+  @$pb.TagNumber(6)
   $core.bool hasJstype() => $_has(4);
+  @$pb.TagNumber(6)
   void clearJstype() => clearField(6);
 
+  @$pb.TagNumber(10)
   $core.bool get weak => $_getBF(5);
+  @$pb.TagNumber(10)
   set weak($core.bool v) {
     $_setBool(5, v);
   }
 
+  @$pb.TagNumber(10)
   $core.bool hasWeak() => $_has(5);
+  @$pb.TagNumber(10)
   void clearWeak() => clearField(10);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(6);
 }
 
@@ -1126,6 +1417,7 @@
       $pb.GeneratedMessage.$_defaultFor<OneofOptions>(create);
   static OneofOptions _defaultInstance;
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(0);
 }
 
@@ -1160,22 +1452,31 @@
       $pb.GeneratedMessage.$_defaultFor<EnumOptions>(create);
   static EnumOptions _defaultInstance;
 
+  @$pb.TagNumber(2)
   $core.bool get allowAlias => $_getBF(0);
+  @$pb.TagNumber(2)
   set allowAlias($core.bool v) {
     $_setBool(0, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasAllowAlias() => $_has(0);
+  @$pb.TagNumber(2)
   void clearAllowAlias() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.bool get deprecated => $_getBF(1);
+  @$pb.TagNumber(3)
   set deprecated($core.bool v) {
     $_setBool(1, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasDeprecated() => $_has(1);
+  @$pb.TagNumber(3)
   void clearDeprecated() => clearField(3);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(2);
 }
 
@@ -1210,14 +1511,19 @@
       $pb.GeneratedMessage.$_defaultFor<EnumValueOptions>(create);
   static EnumValueOptions _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.bool get deprecated => $_getBF(0);
+  @$pb.TagNumber(1)
   set deprecated($core.bool v) {
     $_setBool(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasDeprecated() => $_has(0);
+  @$pb.TagNumber(1)
   void clearDeprecated() => clearField(1);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(1);
 }
 
@@ -1252,14 +1558,19 @@
       $pb.GeneratedMessage.$_defaultFor<ServiceOptions>(create);
   static ServiceOptions _defaultInstance;
 
+  @$pb.TagNumber(33)
   $core.bool get deprecated => $_getBF(0);
+  @$pb.TagNumber(33)
   set deprecated($core.bool v) {
     $_setBool(0, v);
   }
 
+  @$pb.TagNumber(33)
   $core.bool hasDeprecated() => $_has(0);
+  @$pb.TagNumber(33)
   void clearDeprecated() => clearField(33);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(1);
 }
 
@@ -1299,22 +1610,31 @@
       $pb.GeneratedMessage.$_defaultFor<MethodOptions>(create);
   static MethodOptions _defaultInstance;
 
+  @$pb.TagNumber(33)
   $core.bool get deprecated => $_getBF(0);
+  @$pb.TagNumber(33)
   set deprecated($core.bool v) {
     $_setBool(0, v);
   }
 
+  @$pb.TagNumber(33)
   $core.bool hasDeprecated() => $_has(0);
+  @$pb.TagNumber(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);
   }
 
+  @$pb.TagNumber(34)
   $core.bool hasIdempotencyLevel() => $_has(1);
+  @$pb.TagNumber(34)
   void clearIdempotencyLevel() => clearField(34);
 
+  @$pb.TagNumber(999)
   $core.List<UninterpretedOption> get uninterpretedOption => $_getList(2);
 }
 
@@ -1352,20 +1672,28 @@
       $pb.GeneratedMessage.$_defaultFor<UninterpretedOption_NamePart>(create);
   static UninterpretedOption_NamePart _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get namePart => $_getSZ(0);
+  @$pb.TagNumber(1)
   set namePart($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasNamePart() => $_has(0);
+  @$pb.TagNumber(1)
   void clearNamePart() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.bool get isExtension => $_getBF(1);
+  @$pb.TagNumber(2)
   set isExtension($core.bool v) {
     $_setBool(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasIsExtension() => $_has(1);
+  @$pb.TagNumber(2)
   void clearIsExtension() => clearField(2);
 }
 
@@ -1405,54 +1733,79 @@
       $pb.GeneratedMessage.$_defaultFor<UninterpretedOption>(create);
   static UninterpretedOption _defaultInstance;
 
+  @$pb.TagNumber(2)
   $core.List<UninterpretedOption_NamePart> get name => $_getList(0);
 
+  @$pb.TagNumber(3)
   $core.String get identifierValue => $_getSZ(1);
+  @$pb.TagNumber(3)
   set identifierValue($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasIdentifierValue() => $_has(1);
+  @$pb.TagNumber(3)
   void clearIdentifierValue() => clearField(3);
 
+  @$pb.TagNumber(4)
   Int64 get positiveIntValue => $_getI64(2);
+  @$pb.TagNumber(4)
   set positiveIntValue(Int64 v) {
     $_setInt64(2, v);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasPositiveIntValue() => $_has(2);
+  @$pb.TagNumber(4)
   void clearPositiveIntValue() => clearField(4);
 
+  @$pb.TagNumber(5)
   Int64 get negativeIntValue => $_getI64(3);
+  @$pb.TagNumber(5)
   set negativeIntValue(Int64 v) {
     $_setInt64(3, v);
   }
 
+  @$pb.TagNumber(5)
   $core.bool hasNegativeIntValue() => $_has(3);
+  @$pb.TagNumber(5)
   void clearNegativeIntValue() => clearField(5);
 
+  @$pb.TagNumber(6)
   $core.double get doubleValue => $_getN(4);
+  @$pb.TagNumber(6)
   set doubleValue($core.double v) {
     $_setDouble(4, v);
   }
 
+  @$pb.TagNumber(6)
   $core.bool hasDoubleValue() => $_has(4);
+  @$pb.TagNumber(6)
   void clearDoubleValue() => clearField(6);
 
+  @$pb.TagNumber(7)
   $core.List<$core.int> get stringValue => $_getN(5);
+  @$pb.TagNumber(7)
   set stringValue($core.List<$core.int> v) {
     $_setBytes(5, v);
   }
 
+  @$pb.TagNumber(7)
   $core.bool hasStringValue() => $_has(5);
+  @$pb.TagNumber(7)
   void clearStringValue() => clearField(7);
 
+  @$pb.TagNumber(8)
   $core.String get aggregateValue => $_getSZ(6);
+  @$pb.TagNumber(8)
   set aggregateValue($core.String v) {
     $_setString(6, v);
   }
 
+  @$pb.TagNumber(8)
   $core.bool hasAggregateValue() => $_has(6);
+  @$pb.TagNumber(8)
   void clearAggregateValue() => clearField(8);
 }
 
@@ -1491,26 +1844,37 @@
       $pb.GeneratedMessage.$_defaultFor<SourceCodeInfo_Location>(create);
   static SourceCodeInfo_Location _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<$core.int> get path => $_getList(0);
 
+  @$pb.TagNumber(2)
   $core.List<$core.int> get span => $_getList(1);
 
+  @$pb.TagNumber(3)
   $core.String get leadingComments => $_getSZ(2);
+  @$pb.TagNumber(3)
   set leadingComments($core.String v) {
     $_setString(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasLeadingComments() => $_has(2);
+  @$pb.TagNumber(3)
   void clearLeadingComments() => clearField(3);
 
+  @$pb.TagNumber(4)
   $core.String get trailingComments => $_getSZ(3);
+  @$pb.TagNumber(4)
   set trailingComments($core.String v) {
     $_setString(3, v);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasTrailingComments() => $_has(3);
+  @$pb.TagNumber(4)
   void clearTrailingComments() => clearField(4);
 
+  @$pb.TagNumber(6)
   $core.List<$core.String> get leadingDetachedComments => $_getList(4);
 }
 
@@ -1544,6 +1908,7 @@
       $pb.GeneratedMessage.$_defaultFor<SourceCodeInfo>(create);
   static SourceCodeInfo _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<SourceCodeInfo_Location> get location => $_getList(0);
 }
 
@@ -1584,30 +1949,43 @@
       $pb.GeneratedMessage.$_defaultFor<GeneratedCodeInfo_Annotation>(create);
   static GeneratedCodeInfo_Annotation _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<$core.int> get path => $_getList(0);
 
+  @$pb.TagNumber(2)
   $core.String get sourceFile => $_getSZ(1);
+  @$pb.TagNumber(2)
   set sourceFile($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasSourceFile() => $_has(1);
+  @$pb.TagNumber(2)
   void clearSourceFile() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.int get begin => $_getIZ(2);
+  @$pb.TagNumber(3)
   set begin($core.int v) {
     $_setSignedInt32(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasBegin() => $_has(2);
+  @$pb.TagNumber(3)
   void clearBegin() => clearField(3);
 
+  @$pb.TagNumber(4)
   $core.int get end => $_getIZ(3);
+  @$pb.TagNumber(4)
   set end($core.int v) {
     $_setSignedInt32(3, v);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasEnd() => $_has(3);
+  @$pb.TagNumber(4)
   void clearEnd() => clearField(4);
 }
 
@@ -1641,5 +2019,6 @@
       $pb.GeneratedMessage.$_defaultFor<GeneratedCodeInfo>(create);
   static GeneratedCodeInfo _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<GeneratedCodeInfo_Annotation> get annotation => $_getList(0);
 }
diff --git a/protoc_plugin/lib/src/plugin.pb.dart b/protoc_plugin/lib/src/plugin.pb.dart
index 7521c99..1c5ce4e 100644
--- a/protoc_plugin/lib/src/plugin.pb.dart
+++ b/protoc_plugin/lib/src/plugin.pb.dart
@@ -42,36 +42,52 @@
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Version>(create);
   static Version _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.int get major => $_getIZ(0);
+  @$pb.TagNumber(1)
   set major($core.int v) {
     $_setSignedInt32(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasMajor() => $_has(0);
+  @$pb.TagNumber(1)
   void clearMajor() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.int get minor => $_getIZ(1);
+  @$pb.TagNumber(2)
   set minor($core.int v) {
     $_setSignedInt32(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasMinor() => $_has(1);
+  @$pb.TagNumber(2)
   void clearMinor() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.int get patch => $_getIZ(2);
+  @$pb.TagNumber(3)
   set patch($core.int v) {
     $_setSignedInt32(2, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasPatch() => $_has(2);
+  @$pb.TagNumber(3)
   void clearPatch() => clearField(3);
 
+  @$pb.TagNumber(4)
   $core.String get suffix => $_getSZ(3);
+  @$pb.TagNumber(4)
   set suffix($core.String v) {
     $_setString(3, v);
   }
 
+  @$pb.TagNumber(4)
   $core.bool hasSuffix() => $_has(3);
+  @$pb.TagNumber(4)
   void clearSuffix() => clearField(4);
 }
 
@@ -108,24 +124,36 @@
       $pb.GeneratedMessage.$_defaultFor<CodeGeneratorRequest>(create);
   static CodeGeneratorRequest _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.List<$core.String> get fileToGenerate => $_getList(0);
 
+  @$pb.TagNumber(2)
   $core.String get parameter => $_getSZ(1);
+  @$pb.TagNumber(2)
   set parameter($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasParameter() => $_has(1);
+  @$pb.TagNumber(2)
   void clearParameter() => clearField(2);
 
+  @$pb.TagNumber(3)
   Version get compilerVersion => $_getN(2);
+  @$pb.TagNumber(3)
   set compilerVersion(Version v) {
     setField(3, v);
   }
 
+  @$pb.TagNumber(3)
   $core.bool hasCompilerVersion() => $_has(2);
+  @$pb.TagNumber(3)
   void clearCompilerVersion() => clearField(3);
+  @$pb.TagNumber(3)
+  Version ensureCompilerVersion() => $_ensure(2);
 
+  @$pb.TagNumber(15)
   $core.List<$0.FileDescriptorProto> get protoFile => $_getList(3);
 }
 
@@ -164,28 +192,40 @@
       $pb.GeneratedMessage.$_defaultFor<CodeGeneratorResponse_File>(create);
   static CodeGeneratorResponse_File _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
   set name($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
   void clearName() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.String get insertionPoint => $_getSZ(1);
+  @$pb.TagNumber(2)
   set insertionPoint($core.String v) {
     $_setString(1, v);
   }
 
+  @$pb.TagNumber(2)
   $core.bool hasInsertionPoint() => $_has(1);
+  @$pb.TagNumber(2)
   void clearInsertionPoint() => clearField(2);
 
+  @$pb.TagNumber(15)
   $core.String get content => $_getSZ(2);
+  @$pb.TagNumber(15)
   set content($core.String v) {
     $_setString(2, v);
   }
 
+  @$pb.TagNumber(15)
   $core.bool hasContent() => $_has(2);
+  @$pb.TagNumber(15)
   void clearContent() => clearField(15);
 }
 
@@ -222,13 +262,18 @@
       $pb.GeneratedMessage.$_defaultFor<CodeGeneratorResponse>(create);
   static CodeGeneratorResponse _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get error => $_getSZ(0);
+  @$pb.TagNumber(1)
   set error($core.String v) {
     $_setString(0, v);
   }
 
+  @$pb.TagNumber(1)
   $core.bool hasError() => $_has(0);
+  @$pb.TagNumber(1)
   void clearError() => clearField(1);
 
+  @$pb.TagNumber(15)
   $core.List<CodeGeneratorResponse_File> get file => $_getList(1);
 }
diff --git a/protoc_plugin/pubspec.yaml b/protoc_plugin/pubspec.yaml
index 2e04d2a..a5d62e5 100644
--- a/protoc_plugin/pubspec.yaml
+++ b/protoc_plugin/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protoc_plugin
-version: 19.0.0-dev
+version: 19.0.0
 author: Dart Team <misc@dartlang.org>
 description: Protoc compiler plugin to generate Dart code
 homepage: https://github.com/dart-lang/protobuf
diff --git a/protoc_plugin/test/goldens/imports.pb b/protoc_plugin/test/goldens/imports.pb
index 00eb417..71c05ef 100644
--- a/protoc_plugin/test/goldens/imports.pb
+++ b/protoc_plugin/test/goldens/imports.pb
@@ -35,22 +35,37 @@
   static M getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<M>(create);
   static M _defaultInstance;
 
+  @$pb.TagNumber(1)
   M get m => $_getN(0);
+  @$pb.TagNumber(1)
   set m(M v) { setField(1, v); }
+  @$pb.TagNumber(1)
   $core.bool hasM() => $_has(0);
+  @$pb.TagNumber(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); }
+  @$pb.TagNumber(2)
   $core.bool hasM1() => $_has(1);
+  @$pb.TagNumber(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); }
+  @$pb.TagNumber(3)
   $core.bool hasM2() => $_has(2);
+  @$pb.TagNumber(3)
   void clearM2() => clearField(3);
+  @$pb.TagNumber(3)
   $2.M ensureM2() => $_ensure(2);
 }
 
diff --git a/protoc_plugin/test/goldens/messageGenerator b/protoc_plugin/test/goldens/messageGenerator
index 999a909..aecf6a9 100644
--- a/protoc_plugin/test/goldens/messageGenerator
+++ b/protoc_plugin/test/goldens/messageGenerator
@@ -21,28 +21,44 @@
   static PhoneNumber getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PhoneNumber>(create);
   static PhoneNumber _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get number => $_getSZ(0);
+  @$pb.TagNumber(1)
   set number($core.String v) { $_setString(0, v); }
+  @$pb.TagNumber(1)
   $core.bool hasNumber() => $_has(0);
+  @$pb.TagNumber(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); }
+  @$pb.TagNumber(2)
   $core.bool hasType() => $_has(1);
+  @$pb.TagNumber(2)
   void clearType() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.String get name => $_getS(2, '\$');
+  @$pb.TagNumber(3)
   set name($core.String v) { $_setString(2, v); }
+  @$pb.TagNumber(3)
   $core.bool hasName() => $_has(2);
+  @$pb.TagNumber(3)
   void clearName() => clearField(3);
 
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
   $core.String get deprecatedField => $_getSZ(3);
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
   set deprecatedField($core.String v) { $_setString(3, v); }
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
   $core.bool hasDeprecatedField() => $_has(3);
   @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
   void clearDeprecatedField() => clearField(4);
 }
 
diff --git a/protoc_plugin/test/goldens/messageGenerator.meta b/protoc_plugin/test/goldens/messageGenerator.meta
index 246b543..2e309eb 100644
--- a/protoc_plugin/test/goldens/messageGenerator.meta
+++ b/protoc_plugin/test/goldens/messageGenerator.meta
@@ -18,8 +18,8 @@
   path: 2
   path: 1
   sourceFile: 
-  begin: 1472
-  end: 1478
+  begin: 1492
+  end: 1498
 }
 annotation: {
   path: 4
@@ -27,8 +27,8 @@
   path: 2
   path: 1
   sourceFile: 
-  begin: 1500
-  end: 1506
+  begin: 1540
+  end: 1546
 }
 annotation: {
   path: 4
@@ -36,8 +36,8 @@
   path: 2
   path: 1
   sourceFile: 
-  begin: 1559
-  end: 1568
+  begin: 1619
+  end: 1628
 }
 annotation: {
   path: 4
@@ -45,8 +45,8 @@
   path: 2
   path: 1
   sourceFile: 
-  begin: 1591
-  end: 1602
+  begin: 1671
+  end: 1682
 }
 annotation: {
   path: 4
@@ -54,8 +54,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 1652
-  end: 1656
+  begin: 1752
+  end: 1756
 }
 annotation: {
   path: 4
@@ -63,8 +63,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 1677
-  end: 1681
+  begin: 1797
+  end: 1801
 }
 annotation: {
   path: 4
@@ -72,8 +72,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 1740
-  end: 1747
+  begin: 1880
+  end: 1887
 }
 annotation: {
   path: 4
@@ -81,8 +81,8 @@
   path: 2
   path: 0
   sourceFile: 
-  begin: 1770
-  end: 1779
+  begin: 1930
+  end: 1939
 }
 annotation: {
   path: 4
@@ -90,8 +90,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 1820
-  end: 1824
+  begin: 2000
+  end: 2004
 }
 annotation: {
   path: 4
@@ -99,8 +99,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 1851
-  end: 1855
+  begin: 2051
+  end: 2055
 }
 annotation: {
   path: 4
@@ -108,8 +108,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 1908
-  end: 1915
+  begin: 2128
+  end: 2135
 }
 annotation: {
   path: 4
@@ -117,8 +117,8 @@
   path: 2
   path: 2
   sourceFile: 
-  begin: 1938
-  end: 1947
+  begin: 2178
+  end: 2187
 }
 annotation: {
   path: 4
@@ -126,8 +126,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2037
-  end: 2052
+  begin: 2297
+  end: 2312
 }
 annotation: {
   path: 4
@@ -135,8 +135,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2123
-  end: 2138
+  begin: 2403
+  end: 2418
 }
 annotation: {
   path: 4
@@ -144,8 +144,8 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2240
-  end: 2258
+  begin: 2540
+  end: 2558
 }
 annotation: {
   path: 4
@@ -153,6 +153,6 @@
   path: 2
   path: 3
   sourceFile: 
-  begin: 2330
-  end: 2350
+  begin: 2650
+  end: 2670
 }
diff --git a/protoc_plugin/test/goldens/oneMessage.pb b/protoc_plugin/test/goldens/oneMessage.pb
index 8f4c7de..31afbd6 100644
--- a/protoc_plugin/test/goldens/oneMessage.pb
+++ b/protoc_plugin/test/goldens/oneMessage.pb
@@ -31,19 +31,31 @@
   static PhoneNumber getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PhoneNumber>(create);
   static PhoneNumber _defaultInstance;
 
+  @$pb.TagNumber(1)
   $core.String get number => $_getSZ(0);
+  @$pb.TagNumber(1)
   set number($core.String v) { $_setString(0, v); }
+  @$pb.TagNumber(1)
   $core.bool hasNumber() => $_has(0);
+  @$pb.TagNumber(1)
   void clearNumber() => clearField(1);
 
+  @$pb.TagNumber(2)
   $core.int get type => $_getIZ(1);
+  @$pb.TagNumber(2)
   set type($core.int v) { $_setSignedInt32(1, v); }
+  @$pb.TagNumber(2)
   $core.bool hasType() => $_has(1);
+  @$pb.TagNumber(2)
   void clearType() => clearField(2);
 
+  @$pb.TagNumber(3)
   $core.String get name => $_getS(2, '\$');
+  @$pb.TagNumber(3)
   set name($core.String v) { $_setString(2, v); }
+  @$pb.TagNumber(3)
   $core.bool hasName() => $_has(2);
+  @$pb.TagNumber(3)
   void clearName() => clearField(3);
 }
 
diff --git a/protoc_plugin/test/goldens/oneMessage.pb.meta b/protoc_plugin/test/goldens/oneMessage.pb.meta
index aae73d2..15c9bb5 100644
--- a/protoc_plugin/test/goldens/oneMessage.pb.meta
+++ b/protoc_plugin/test/goldens/oneMessage.pb.meta
@@ -18,8 +18,8 @@
   path: 2
   path: 0
   sourceFile: test
-  begin: 1593
-  end: 1599
+  begin: 1613
+  end: 1619
 }
 annotation: {
   path: 4
@@ -27,8 +27,8 @@
   path: 2
   path: 0
   sourceFile: test
-  begin: 1621
-  end: 1627
+  begin: 1661
+  end: 1667
 }
 annotation: {
   path: 4
@@ -36,8 +36,8 @@
   path: 2
   path: 0
   sourceFile: test
-  begin: 1680
-  end: 1689
+  begin: 1740
+  end: 1749
 }
 annotation: {
   path: 4
@@ -45,8 +45,8 @@
   path: 2
   path: 0
   sourceFile: test
-  begin: 1712
-  end: 1723
+  begin: 1792
+  end: 1803
 }
 annotation: {
   path: 4
@@ -54,8 +54,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 1761
-  end: 1765
+  begin: 1861
+  end: 1865
 }
 annotation: {
   path: 4
@@ -63,8 +63,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 1787
-  end: 1791
+  begin: 1907
+  end: 1911
 }
 annotation: {
   path: 4
@@ -72,8 +72,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 1846
-  end: 1853
+  begin: 1986
+  end: 1993
 }
 annotation: {
   path: 4
@@ -81,8 +81,8 @@
   path: 2
   path: 1
   sourceFile: test
-  begin: 1876
-  end: 1885
+  begin: 2036
+  end: 2045
 }
 annotation: {
   path: 4
@@ -90,8 +90,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 1926
-  end: 1930
+  begin: 2106
+  end: 2110
 }
 annotation: {
   path: 4
@@ -99,8 +99,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 1957
-  end: 1961
+  begin: 2157
+  end: 2161
 }
 annotation: {
   path: 4
@@ -108,8 +108,8 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2014
-  end: 2021
+  begin: 2234
+  end: 2241
 }
 annotation: {
   path: 4
@@ -117,6 +117,6 @@
   path: 2
   path: 2
   sourceFile: test
-  begin: 2044
-  end: 2053
+  begin: 2284
+  end: 2293
 }