diff --git a/protobuf/analysis_options.yaml b/protobuf/analysis_options.yaml
index 108d105..88748cf 100644
--- a/protobuf/analysis_options.yaml
+++ b/protobuf/analysis_options.yaml
@@ -1 +1,5 @@
 include: package:pedantic/analysis_options.yaml
+
+linter:
+  rules:
+    prefer_spread_collections: false
diff --git a/protobuf/benchmarks/benchmark_js.dart b/protobuf/benchmarks/benchmark_js.dart
index 3a864f2..0d32987 100644
--- a/protobuf/benchmarks/benchmark_js.dart
+++ b/protobuf/benchmarks/benchmark_js.dart
@@ -12,13 +12,13 @@
 import 'd8.dart';
 
 final files = [
-  "benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb",
-  "benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb",
-  "benchmarks/datasets/google_message2/dataset.google_message2.pb"
+  'benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb',
+  'benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb',
+  'benchmarks/datasets/google_message2/dataset.google_message2.pb'
 ];
 
 void main(List<String> arguments) {
-  final List<Dataset> datasets = files
+  final datasets = files
       .map((file) => Dataset.fromBinary(readAsBytesSync(file)))
       .toList(growable: false);
 
diff --git a/protobuf/benchmarks/common.dart b/protobuf/benchmarks/common.dart
index 086746e..9259375 100644
--- a/protobuf/benchmarks/common.dart
+++ b/protobuf/benchmarks/common.dart
@@ -63,32 +63,32 @@
   Dataset._(this.name, this.factories);
 }
 
-typedef dynamic FromBufferFactory(List<int> binary);
-typedef dynamic FromJsonFactory(String json);
+typedef FromBufferFactory = dynamic Function(List<int> binary);
+typedef FromJsonFactory = dynamic Function(String json);
 
 class Factories {
   final FromBufferFactory fromBuffer;
   final FromJsonFactory fromJson;
 
   static Factories forMessage(String name) =>
-      _factories[name] ?? (throw "Unsupported message: ${name}");
+      _factories[name] ?? (throw 'Unsupported message: ${name}');
 
   /// Mapping between [BenchmarkProto.messageName] and corresponding
   /// deserialization factories.
   static final _factories = {
-    "benchmarks.proto2.GoogleMessage1": Factories._(
+    'benchmarks.proto2.GoogleMessage1': Factories._(
         fromBuffer: (List<int> binary) => p2.GoogleMessage1.fromBuffer(binary),
         fromJson: (String json) => p2.GoogleMessage1.fromJson(json)),
-    "benchmarks.proto3.GoogleMessage1": Factories._(
+    'benchmarks.proto3.GoogleMessage1': Factories._(
         fromBuffer: (List<int> binary) => p3.GoogleMessage1.fromBuffer(binary),
         fromJson: (String json) => p3.GoogleMessage1.fromJson(json)),
-    "benchmarks.proto2.GoogleMessage2": Factories._(
+    'benchmarks.proto2.GoogleMessage2': Factories._(
         fromBuffer: (List<int> binary) => GoogleMessage2.fromBuffer(binary),
         fromJson: (String json) => GoogleMessage2.fromJson(json)),
-    "benchmarks.google_message3.GoogleMessage3": Factories._(
+    'benchmarks.google_message3.GoogleMessage3': Factories._(
         fromBuffer: (List<int> binary) => GoogleMessage3.fromBuffer(binary),
         fromJson: (String json) => GoogleMessage3.fromJson(json)),
-    "benchmarks.google_message4.GoogleMessage4": Factories._(
+    'benchmarks.google_message4.GoogleMessage4': Factories._(
         fromBuffer: (List<int> binary) => GoogleMessage4.fromBuffer(binary),
         fromJson: (String json) => GoogleMessage4.fromJson(json)),
   };
@@ -105,8 +105,9 @@
 
 /// Binary deserialization benchmark.
 class FromBinaryBenchmark extends _ProtobufBenchmark {
-  FromBinaryBenchmark(datasets) : super(datasets, "FromBinary");
+  FromBinaryBenchmark(datasets) : super(datasets, 'FromBinary');
 
+  @override
   void run() {
     for (var i = 0; i < datasets.length; i++) {
       final ds = datasets[i];
@@ -120,8 +121,9 @@
 
 /// Binary serialization benchmark.
 class ToBinaryBenchmark extends _ProtobufBenchmark {
-  ToBinaryBenchmark(datasets) : super(datasets, "ToBinary");
+  ToBinaryBenchmark(datasets) : super(datasets, 'ToBinary');
 
+  @override
   void run() {
     for (var i = 0; i < datasets.length; i++) {
       final ds = datasets[i];
@@ -134,8 +136,9 @@
 
 /// JSON deserialization benchmark.
 class FromJsonBenchmark extends _ProtobufBenchmark {
-  FromJsonBenchmark(datasets) : super(datasets, "FromJson");
+  FromJsonBenchmark(datasets) : super(datasets, 'FromJson');
 
+  @override
   void run() {
     for (var i = 0; i < datasets.length; i++) {
       final ds = datasets[i];
@@ -149,8 +152,9 @@
 
 /// JSON serialization benchmark.
 class ToJsonBenchmark extends _ProtobufBenchmark {
-  ToJsonBenchmark(datasets) : super(datasets, "ToJson");
+  ToJsonBenchmark(datasets) : super(datasets, 'ToJson');
 
+  @override
   void run() {
     for (var i = 0; i < datasets.length; i++) {
       final ds = datasets[i];
diff --git a/protobuf/lib/src/protobuf/builder_info.dart b/protobuf/lib/src/protobuf/builder_info.dart
index a492f96..95fa3b0 100644
--- a/protobuf/lib/src/protobuf/builder_info.dart
+++ b/protobuf/lib/src/protobuf/builder_info.dart
@@ -9,7 +9,7 @@
   /// The fully qualified name of this message.
   final String qualifiedMessageName;
   final List<FieldInfo> byIndex = <FieldInfo>[];
-  final Map<int, FieldInfo> fieldInfo = Map<int, FieldInfo>();
+  final Map<int, FieldInfo> fieldInfo = <int, FieldInfo>{};
   final Map<String, FieldInfo> byTagAsString = <String, FieldInfo>{};
   final Map<String, FieldInfo> byName = <String, FieldInfo>{};
   // Maps a tag number to the corresponding oneof index (if any).
@@ -30,7 +30,7 @@
       this.createEmptyInstance,
       this.toProto3Json,
       this.fromProto3Json})
-      : qualifiedMessageName = "${package.prefix}$messageName";
+      : qualifiedMessageName = '${package.prefix}$messageName';
 
   void add<T>(
       int tagNumber,
@@ -90,7 +90,7 @@
     // maps.
     if (!fi._isDummy) {
       fieldInfo[fi.tagNumber] = fi;
-      byTagAsString["${fi.tagNumber}"] = fi;
+      byTagAsString['${fi.tagNumber}'] = fi;
       byName[fi.name] = fi;
     }
   }
@@ -210,8 +210,7 @@
       List<ProtobufEnum> enumValues,
       PackageName packageName = const PackageName(''),
       String protoName}) {
-    BuilderInfo mapEntryBuilderInfo = BuilderInfo(entryClassName,
-        package: packageName)
+    var mapEntryBuilderInfo = BuilderInfo(entryClassName, package: packageName)
       ..add(PbMap._keyFieldNumber, 'key', keyFieldType, null, null, null, null)
       ..add(PbMap._valueFieldNumber, 'value', valueFieldType, null,
           valueCreator, valueOf, enumValues);
@@ -223,39 +222,39 @@
 
   bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber);
 
-  defaultValue(int tagNumber) {
-    MakeDefaultFunc func = makeDefault(tagNumber);
+  dynamic defaultValue(int tagNumber) {
+    var func = makeDefault(tagNumber);
     return func == null ? null : func();
   }
 
   // Returns the field name for a given tag number, for debugging purposes.
   String fieldName(int tagNumber) {
-    FieldInfo i = fieldInfo[tagNumber];
+    var i = fieldInfo[tagNumber];
     return i != null ? i.name : null;
   }
 
   int fieldType(int tagNumber) {
-    FieldInfo i = fieldInfo[tagNumber];
+    var i = fieldInfo[tagNumber];
     return i != null ? i.type : null;
   }
 
   MakeDefaultFunc makeDefault(int tagNumber) {
-    FieldInfo i = fieldInfo[tagNumber];
+    var i = fieldInfo[tagNumber];
     return i != null ? i.makeDefault : null;
   }
 
   CreateBuilderFunc subBuilder(int tagNumber) {
-    FieldInfo i = fieldInfo[tagNumber];
+    var i = fieldInfo[tagNumber];
     return i != null ? i.subBuilder : null;
   }
 
   int tagNumber(String fieldName) {
-    FieldInfo i = byName[fieldName];
+    var i = byName[fieldName];
     return i != null ? i.tagNumber : null;
   }
 
   ValueOfFunc valueOfFunc(int tagNumber) {
-    FieldInfo i = fieldInfo[tagNumber];
+    var i = fieldInfo[tagNumber];
     return i != null ? i.valueOf : null;
   }
 
@@ -279,7 +278,7 @@
 
   GeneratedMessage _makeEmptyMessage(
       int tagNumber, ExtensionRegistry extensionRegistry) {
-    CreateBuilderFunc subBuilderFunc = subBuilder(tagNumber);
+    var subBuilderFunc = subBuilder(tagNumber);
     if (subBuilderFunc == null && extensionRegistry != null) {
       subBuilderFunc = extensionRegistry
           .getExtension(qualifiedMessageName, tagNumber)
@@ -288,8 +287,9 @@
     return subBuilderFunc();
   }
 
-  _decodeEnum(int tagNumber, ExtensionRegistry registry, int rawValue) {
-    ValueOfFunc f = valueOfFunc(tagNumber);
+  ProtobufEnum _decodeEnum(
+      int tagNumber, ExtensionRegistry registry, int rawValue) {
+    var f = valueOfFunc(tagNumber);
     if (f == null && registry != null) {
       f = registry.getExtension(qualifiedMessageName, tagNumber).valueOf;
     }
diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart
index b7cd016..3709246 100644
--- a/protobuf/lib/src/protobuf/coded_buffer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer.dart
@@ -31,15 +31,13 @@
   assert(registry != null);
 
   while (true) {
-    int tag = input.readTag();
+    var tag = input.readTag();
     if (tag == 0) return;
-    int wireType = tag & 0x7;
-    int tagNumber = tag >> 3;
+    var wireType = tag & 0x7;
+    var tagNumber = tag >> 3;
 
-    FieldInfo fi = fs._nonExtensionInfo(tagNumber);
-    if (fi == null) {
-      fi = registry.getExtension(fs._messageName, tagNumber);
-    }
+    var fi = fs._nonExtensionInfo(tagNumber);
+    fi ??= registry.getExtension(fs._messageName, tagNumber);
 
     if (fi == null || !_wireTypeMatches(fi.type, wireType)) {
       if (!fs._ensureUnknownFields().mergeFieldFromBuffer(tag, input)) {
@@ -49,7 +47,7 @@
     }
 
     // Ignore required/optional packed/unpacked.
-    int fieldType = fi.type;
+    var fieldType = fi.type;
     fieldType &= ~(PbFieldType._PACKED_BIT | PbFieldType._REQUIRED_BIT);
     switch (fieldType) {
       case PbFieldType._OPTIONAL_BOOL:
@@ -68,7 +66,7 @@
         fs._setFieldUnchecked(fi, input.readDouble());
         break;
       case PbFieldType._OPTIONAL_ENUM:
-        int rawValue = input.readEnum();
+        var rawValue = input.readEnum();
         var value = fs._meta._decodeEnum(tagNumber, registry, rawValue);
         if (value == null) {
           var unknown = fs._ensureUnknownFields();
@@ -78,8 +76,7 @@
         }
         break;
       case PbFieldType._OPTIONAL_GROUP:
-        GeneratedMessage subMessage =
-            fs._meta._makeEmptyMessage(tagNumber, registry);
+        var subMessage = fs._meta._makeEmptyMessage(tagNumber, registry);
         var oldValue = fs._getFieldOrNull(fi);
         if (oldValue != null) {
           subMessage.mergeFromMessage(oldValue);
@@ -118,8 +115,7 @@
         fs._setFieldUnchecked(fi, input.readSfixed64());
         break;
       case PbFieldType._OPTIONAL_MESSAGE:
-        GeneratedMessage subMessage =
-            fs._meta._makeEmptyMessage(tagNumber, registry);
+        var subMessage = fs._meta._makeEmptyMessage(tagNumber, registry);
         var oldValue = fs._getFieldOrNull(fi);
         if (oldValue != null) {
           subMessage.mergeFromMessage(oldValue);
@@ -146,8 +142,7 @@
         _readPackableToListEnum(fs, input, wireType, fi, tagNumber, registry);
         break;
       case PbFieldType._REPEATED_GROUP:
-        GeneratedMessage subMessage =
-            fs._meta._makeEmptyMessage(tagNumber, registry);
+        var subMessage = fs._meta._makeEmptyMessage(tagNumber, registry);
         input.readGroup(tagNumber, subMessage, registry);
         fs._ensureRepeatedField(fi).add(subMessage);
         break;
@@ -182,8 +177,7 @@
         _readPackable(fs, input, wireType, fi, input.readSfixed64);
         break;
       case PbFieldType._REPEATED_MESSAGE:
-        GeneratedMessage subMessage =
-            fs._meta._makeEmptyMessage(tagNumber, registry);
+        var subMessage = fs._meta._makeEmptyMessage(tagNumber, registry);
         input.readMessage(subMessage, registry);
         fs._ensureRepeatedField(fi).add(subMessage);
         break;
@@ -205,7 +199,7 @@
 void _readPackableToListEnum(_FieldSet fs, CodedBufferReader input,
     int wireType, FieldInfo fi, int tagNumber, ExtensionRegistry registry) {
   void readToList(List list) {
-    int rawValue = input.readEnum();
+    var rawValue = input.readEnum();
     var value = fs._meta._decodeEnum(tagNumber, registry, rawValue);
     if (value == null) {
       var unknown = fs._ensureUnknownFields();
@@ -220,7 +214,7 @@
 
 void _readPackableToList(_FieldSet fs, CodedBufferReader input, int wireType,
     FieldInfo fi, Function readToList) {
-  List list = fs._ensureRepeatedField(fi);
+  var list = fs._ensureRepeatedField(fi);
 
   if (wireType == WIRETYPE_LENGTH_DELIMITED) {
     // Packed.
diff --git a/protobuf/lib/src/protobuf/coded_buffer_reader.dart b/protobuf/lib/src/protobuf/coded_buffer_reader.dart
index b7e86b4..d61f977 100644
--- a/protobuf/lib/src/protobuf/coded_buffer_reader.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer_reader.dart
@@ -40,7 +40,7 @@
           ' which claimed to have negative size.');
     }
     byteLimit += _bufferPos;
-    int oldLimit = _currentLimit;
+    var oldLimit = _currentLimit;
     if ((oldLimit != -1 && byteLimit > oldLimit) || byteLimit > _sizeLimit) {
       throw InvalidProtocolBufferException.truncatedMessage();
     }
@@ -73,7 +73,7 @@
       throw InvalidProtocolBufferException.recursionLimitExceeded();
     }
     ++_recursionDepth;
-    UnknownFieldSet unknownFieldSet = UnknownFieldSet();
+    var unknownFieldSet = UnknownFieldSet();
     unknownFieldSet.mergeFromCodedBufferReader(this);
     checkLastTagWas(makeTag(fieldNumber, WIRETYPE_END_GROUP));
     --_recursionDepth;
@@ -82,7 +82,7 @@
 
   void readMessage(
       GeneratedMessage message, ExtensionRegistry extensionRegistry) {
-    int length = readInt32();
+    var length = readInt32();
     if (_recursionDepth >= _recursionLimit) {
       throw InvalidProtocolBufferException.recursionLimitExceeded();
     }
@@ -92,7 +92,7 @@
           ' which claimed to have negative size.');
     }
 
-    int oldLimit = _currentLimit;
+    var oldLimit = _currentLimit;
     _currentLimit = _bufferPos + length;
     if (_currentLimit > oldLimit) {
       throw InvalidProtocolBufferException.truncatedMessage();
@@ -122,7 +122,7 @@
 
   bool readBool() => _readRawVarint32(true) != 0;
   List<int> readBytes() {
-    int length = readInt32();
+    var length = readInt32();
     _checkLimit(length);
     return Uint8List.view(
         _buffer.buffer, _buffer.offsetInBytes + _bufferPos - length, length);
@@ -167,12 +167,12 @@
     // Read up to 10 bytes.
     // We use a local [bufferPos] variable to avoid repeatedly loading/store the
     // this._bufferpos field.
-    int bufferPos = _bufferPos;
-    int bytes = _currentLimit - bufferPos;
+    var bufferPos = _bufferPos;
+    var bytes = _currentLimit - bufferPos;
     if (bytes > 10) bytes = 10;
-    int result = 0;
-    for (int i = 0; i < bytes; i++) {
-      int byte = _buffer[bufferPos++];
+    var result = 0;
+    for (var i = 0; i < bytes; i++) {
+      var byte = _buffer[bufferPos++];
       result |= (byte & 0x7f) << (i * 7);
       if ((byte & 0x80) == 0) {
         result &= 0xffffffff;
@@ -185,19 +185,19 @@
   }
 
   Int64 _readRawVarint64() {
-    int lo = 0;
-    int hi = 0;
+    var lo = 0;
+    var hi = 0;
 
     // Read low 28 bits.
-    for (int i = 0; i < 4; i++) {
-      int byte = _readRawVarintByte();
+    for (var i = 0; i < 4; i++) {
+      var byte = _readRawVarintByte();
       lo |= (byte & 0x7f) << (i * 7);
       if ((byte & 0x80) == 0) return Int64.fromInts(hi, lo);
     }
 
     // Read middle 7 bits: 4 low belong to low part above,
     // 3 remaining belong to hi.
-    int byte = _readRawVarintByte();
+    var byte = _readRawVarintByte();
     lo |= (byte & 0xf) << 28;
     hi = (byte >> 4) & 0x7;
     if ((byte & 0x80) == 0) {
@@ -205,8 +205,8 @@
     }
 
     // Read remaining bits of hi.
-    for (int i = 0; i < 5; i++) {
-      int byte = _readRawVarintByte();
+    for (var i = 0; i < 5; i++) {
+      var byte = _readRawVarintByte();
       hi |= (byte & 0x7f) << ((i * 7) + 3);
       if ((byte & 0x80) == 0) return Int64.fromInts(hi, lo);
     }
diff --git a/protobuf/lib/src/protobuf/coded_buffer_writer.dart b/protobuf/lib/src/protobuf/coded_buffer_writer.dart
index e4f6781..f19cb63 100644
--- a/protobuf/lib/src/protobuf/coded_buffer_writer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer_writer.dart
@@ -63,7 +63,7 @@
   }
 
   void writeField(int fieldNumber, int fieldType, fieldValue) {
-    final int valueType = fieldType & ~0x07;
+    final valueType = fieldType & ~0x07;
 
     if ((fieldType & PbFieldType._PACKED_BIT) != 0) {
       if (!fieldValue.isEmpty) {
@@ -77,12 +77,12 @@
       return;
     }
 
-    final int wireFormat = _wireTypes[_valueTypeIndex(valueType)];
+    final wireFormat = _wireTypes[_valueTypeIndex(valueType)];
 
     if ((fieldType & PbFieldType._MAP_BIT) != 0) {
-      final int keyWireFormat =
+      final keyWireFormat =
           _wireTypes[_valueTypeIndex(fieldValue.keyFieldType)];
-      final int valueWireFormat =
+      final valueWireFormat =
           _wireTypes[_valueTypeIndex(fieldValue.valueFieldType)];
 
       fieldValue.forEach((key, value) {
@@ -107,7 +107,7 @@
   }
 
   Uint8List toBuffer() {
-    Uint8List result = Uint8List(_bytesTotal);
+    var result = Uint8List(_bytesTotal);
     writeTo(result);
     return result;
   }
@@ -124,14 +124,14 @@
     _commitChunk(false);
     _commitSplice();
 
-    int outPos = offset; // Output position in the buffer.
-    int chunkIndex = 0, chunkPos = 0; // Position within _outputChunks.
-    for (int i = 0; i < _splices.length; i++) {
+    var outPos = offset; // Output position in the buffer.
+    var chunkIndex = 0, chunkPos = 0; // Position within _outputChunks.
+    for (var i = 0; i < _splices.length; i++) {
       final action = _splices[i];
       if (action is int) {
         if (action <= 0) {
           // action is a positive varint to be emitted into the output buffer.
-          int v = 0 - action; // Note: 0 - action to avoid -0.0 in JS.
+          var v = 0 - action; // Note: 0 - action to avoid -0.0 in JS.
           while (v >= 0x80) {
             buffer[outPos++] = 0x80 | (v & 0x7f);
             v >>= 7;
@@ -140,7 +140,7 @@
         } else {
           // action is an amount of bytes to copy from _outputChunks into the
           // buffer.
-          int bytesToCopy = action;
+          var bytesToCopy = action;
           while (bytesToCopy > 0) {
             final Uint8List chunk = _outputChunks[chunkIndex];
             final int bytesInChunk = _outputChunks[chunkIndex + 1];
@@ -233,7 +233,7 @@
   /// of bytes written into the reserved slice space.
   int _startLengthDelimited() {
     _commitSplice();
-    int index = _splices.length;
+    var index = _splices.length;
     // Reserve a space for a splice and use it to record the current number of
     // bytes written so that we can compute the length of data later in
     // _endLengthDelimited.
@@ -259,7 +259,7 @@
 
   void _writeVarint32(int value) {
     _ensureBytes(5);
-    int i = _bytesInChunk;
+    var i = _bytesInChunk;
     while (value >= 0x80) {
       _outputChunk[i++] = 0x80 | (value & 0x7f);
       value >>= 7;
@@ -271,9 +271,9 @@
 
   void _writeVarint64(Int64 value) {
     _ensureBytes(10);
-    int i = _bytesInChunk;
-    int lo = value.toUnsigned(32).toInt();
-    int hi = (value >> 32).toUnsigned(32).toInt();
+    var i = _bytesInChunk;
+    var lo = value.toUnsigned(32).toInt();
+    var hi = (value >> 32).toUnsigned(32).toInt();
     while (hi > 0 || lo >= 0x80) {
       _outputChunk[i++] = 0x80 | (lo & 0x7f);
       lo = (lo >> 7) | ((hi & 0x7f) << 25);
@@ -297,8 +297,8 @@
   }
 
   void _writeFloat(double value) {
-    const double MIN_FLOAT_DENORM = 1.401298464324817E-45;
-    const double MAX_FLOAT = 3.4028234663852886E38;
+    const MIN_FLOAT_DENORM = 1.401298464324817E-45;
+    const MAX_FLOAT = 3.4028234663852886E38;
     if (value.isNaN) {
       _writeInt32(0x7fc00000);
     } else if (value.abs() < MIN_FLOAT_DENORM) {
@@ -390,12 +390,12 @@
     }
   }
 
-  _writeBytesNoTag(dynamic value) {
+  void _writeBytesNoTag(dynamic value) {
     writeInt32NoTag(value.length);
     _writeRawBytes(value);
   }
 
-  _writeTag(int fieldNumber, int wireFormat) {
+  void _writeTag(int fieldNumber, int wireFormat) {
     writeInt32NoTag(makeTag(fieldNumber, wireFormat));
   }
 
@@ -417,16 +417,16 @@
   /// Has a specialization for Uint8List for performance.
   int _copyInto(Uint8List buffer, int pos, TypedData value) {
     if (value is Uint8List) {
-      int len = value.length;
-      for (int j = 0; j < len; j++) {
+      var len = value.length;
+      for (var j = 0; j < len; j++) {
         buffer[pos++] = value[j];
       }
       return pos;
     } else {
-      int len = value.lengthInBytes;
-      Uint8List u8 = Uint8List.view(
+      var len = value.lengthInBytes;
+      var u8 = Uint8List.view(
           value.buffer, value.offsetInBytes, value.lengthInBytes);
-      for (int j = 0; j < len; j++) {
+      for (var j = 0; j < len; j++) {
         buffer[pos++] = u8[j];
       }
       return pos;
diff --git a/protobuf/lib/src/protobuf/exceptions.dart b/protobuf/lib/src/protobuf/exceptions.dart
index bc8d43c..0c34665 100644
--- a/protobuf/lib/src/protobuf/exceptions.dart
+++ b/protobuf/lib/src/protobuf/exceptions.dart
@@ -9,6 +9,7 @@
 
   InvalidProtocolBufferException._(this.message);
 
+  @override
   String toString() => 'InvalidProtocolBufferException: $message';
 
   InvalidProtocolBufferException.invalidEndTag()
diff --git a/protobuf/lib/src/protobuf/extension.dart b/protobuf/lib/src/protobuf/extension.dart
index 2d87f79..cecc257 100644
--- a/protobuf/lib/src/protobuf/extension.dart
+++ b/protobuf/lib/src/protobuf/extension.dart
@@ -30,8 +30,10 @@
       : super.repeated(name, tagNumber, null, fieldType, check, subBuilder,
             valueOf: valueOf, enumValues: enumValues, protoName: protoName);
 
+  @override
   int get hashCode => extendee.hashCode * 31 + tagNumber;
 
+  @override
   bool operator ==(other) {
     if (other is! Extension) return false;
 
diff --git a/protobuf/lib/src/protobuf/extension_field_set.dart b/protobuf/lib/src/protobuf/extension_field_set.dart
index fe301db..e516a9d 100644
--- a/protobuf/lib/src/protobuf/extension_field_set.dart
+++ b/protobuf/lib/src/protobuf/extension_field_set.dart
@@ -14,7 +14,7 @@
 
   Extension _getInfoOrNull(int tagNumber) => _info[tagNumber];
 
-  _getFieldOrDefault(Extension fi) {
+  dynamic _getFieldOrDefault(Extension fi) {
     if (fi.isRepeated) return _getList(fi);
     _validateInfo(fi);
     // TODO(skybrian) seems unnecessary to add info?
@@ -62,7 +62,7 @@
     return newList;
   }
 
-  _getFieldOrNull(Extension extension) => _values[extension.tagNumber];
+  dynamic _getFieldOrNull(Extension extension) => _values[extension.tagNumber];
 
   void _clearFieldAndInfo(Extension fi) {
     _clearField(fi);
@@ -82,7 +82,7 @@
     var fi = _getInfoOrNull(tagNumber);
     if (fi == null) {
       throw ArgumentError(
-          "tag $tagNumber not defined in $_parent._messageName");
+          'tag $tagNumber not defined in $_parent._messageName');
     }
     if (fi.isRepeated) {
       throw ArgumentError(_parent._setFieldFailedMessage(
@@ -136,7 +136,7 @@
   Iterable<int> get _tagNumbers => _values.keys;
   Iterable<Extension> get _infos => _info.values;
 
-  get _hasValues => _values.isNotEmpty;
+  bool get _hasValues => _values.isNotEmpty;
 
   bool _equalValues(_ExtensionFieldSet other) =>
       other != null && _areMapsEqual(_values, other._values);
@@ -148,8 +148,8 @@
   /// Repeated fields are copied.
   /// Extensions cannot contain map fields.
   void _shallowCopyValues(_ExtensionFieldSet original) {
-    for (int tagNumber in original._tagNumbers) {
-      Extension extension = original._getInfoOrNull(tagNumber);
+    for (var tagNumber in original._tagNumbers) {
+      var extension = original._getInfoOrNull(tagNumber);
       _addInfoUnchecked(extension);
 
       final value = original._getFieldOrNull(extension);
@@ -166,7 +166,7 @@
   void _markReadOnly() {
     if (_isReadOnly) return;
     _isReadOnly = true;
-    for (Extension field in _info.values) {
+    for (var field in _info.values) {
       if (field.isRepeated) {
         final entries = _values[field.tagNumber];
         if (entries == null) continue;
diff --git a/protobuf/lib/src/protobuf/extension_registry.dart b/protobuf/lib/src/protobuf/extension_registry.dart
index fd04cda..9daeb1a 100644
--- a/protobuf/lib/src/protobuf/extension_registry.dart
+++ b/protobuf/lib/src/protobuf/extension_registry.dart
@@ -14,8 +14,8 @@
 
   /// Stores an [extension] in the registry.
   void add(Extension extension) {
-    var map = _extensions.putIfAbsent(
-        extension.extendee, () => Map<int, Extension>());
+    var map =
+        _extensions.putIfAbsent(extension.extendee, () => <int, Extension>{});
     map[extension.tagNumber] = extension;
   }
 
@@ -105,13 +105,12 @@
   UnknownFieldSet ensureUnknownFields() =>
       resultUnknownFields ??= ensureResult()._fieldSet._unknownFields;
 
-  UnknownFieldSet messageUnknownFields = message._fieldSet._unknownFields;
+  var messageUnknownFields = message._fieldSet._unknownFields;
   if (messageUnknownFields != null) {
-    CodedBufferWriter codedBufferWriter = CodedBufferWriter();
+    var codedBufferWriter = CodedBufferWriter();
     extensionRegistry._extensions[message.info_.qualifiedMessageName]
         ?.forEach((tagNumber, extension) {
-      final UnknownFieldSetField unknownField =
-          messageUnknownFields._fields[tagNumber];
+      final unknownField = messageUnknownFields._fields[tagNumber];
       if (unknownField != null) {
         unknownField.writeTo(tagNumber, codedBufferWriter);
         ensureUnknownFields()._fields.remove(tagNumber);
@@ -137,10 +136,9 @@
       final messageEntries = message._fieldSet._values[field.index];
       if (messageEntries == null) return;
       if (field.isGroupOrMessage) {
-        for (int i = 0; i < messageEntries.length; i++) {
+        for (var i = 0; i < messageEntries.length; i++) {
           final GeneratedMessage entry = messageEntries[i];
-          final GeneratedMessage reparsedEntry =
-              _reparseMessage(entry, extensionRegistry);
+          final reparsedEntry = _reparseMessage(entry, extensionRegistry);
           if (!identical(entry, reparsedEntry)) {
             ensureEntries()[i] = reparsedEntry;
           }
@@ -152,8 +150,7 @@
       if (_isGroupOrMessage(field.valueFieldType)) {
         for (var key in messageMap.keys) {
           final GeneratedMessage value = messageMap[key];
-          final GeneratedMessage reparsedValue =
-              _reparseMessage(value, extensionRegistry);
+          final reparsedValue = _reparseMessage(value, extensionRegistry);
           if (!identical(value, reparsedValue)) {
             ensureMap()[key] = reparsedValue;
           }
@@ -162,8 +159,8 @@
     } else if (field.isGroupOrMessage) {
       final messageSubField = message._fieldSet._values[field.index];
       if (messageSubField == null) return;
-      final GeneratedMessage reparsedSubField =
-          _reparseMessage(messageSubField, extensionRegistry);
+      final reparsedSubField =
+          _reparseMessage<GeneratedMessage>(messageSubField, extensionRegistry);
       if (!identical(messageSubField, reparsedSubField)) {
         ensureResult()._fieldSet._values[field.index] = reparsedSubField;
       }
@@ -180,18 +177,24 @@
 class _EmptyExtensionRegistry implements ExtensionRegistry {
   const _EmptyExtensionRegistry();
 
-  get _extensions => const <String, Map<int, Extension>>{};
+  @override
+  Map<String, Map<int, Extension>> get _extensions =>
+      const <String, Map<int, Extension>>{};
 
+  @override
   void add(Extension extension) {
     throw UnsupportedError('Immutable ExtensionRegistry');
   }
 
+  @override
   void addAll(Iterable<Extension> extensions) {
     throw UnsupportedError('Immutable ExtensionRegistry');
   }
 
+  @override
   Extension getExtension(String messageName, int tagNumber) => null;
 
+  @override
   T reparseMessage<T extends GeneratedMessage>(T message) =>
       _reparseMessage(message, this);
 }
diff --git a/protobuf/lib/src/protobuf/field_info.dart b/protobuf/lib/src/protobuf/field_info.dart
index 743a55a..1a52faf 100644
--- a/protobuf/lib/src/protobuf/field_info.dart
+++ b/protobuf/lib/src/protobuf/field_info.dart
@@ -101,7 +101,7 @@
 
   /// Returns a read-only default value for a field.
   /// (Unlike getField, doesn't create a repeated field.)
-  get readonlyDefault {
+  dynamic get readonlyDefault {
     if (isRepeated) {
       return _emptyList ??= FrozenPbList._([]);
     }
@@ -150,8 +150,8 @@
       if (!list[0]._fieldSet._hasRequiredFields) return;
 
       // Recurse on each item in the list.
-      int position = 0;
-      for (GeneratedMessage message in list) {
+      var position = 0;
+      for (var message in list) {
         message._fieldSet
             ._appendInvalidFields(problems, '$prefix$name[$position].');
         position++;
@@ -180,6 +180,7 @@
     return fs._ensureRepeatedField<T>(this);
   }
 
+  @override
   String toString() => name;
 }
 
diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index cb4b376..11df0c3 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -4,16 +4,17 @@
 
 part of protobuf;
 
-typedef void FrozenMessageErrorHandler(String messageName, [String methodName]);
+typedef FrozenMessageErrorHandler = void Function(String messageName,
+    [String methodName]);
 
 void defaultFrozenMessageModificationHandler(String messageName,
     [String methodName]) {
   if (methodName != null) {
     throw UnsupportedError(
-        "Attempted to call $methodName on a read-only message ($messageName)");
+        'Attempted to call $methodName on a read-only message ($messageName)');
   }
   throw UnsupportedError(
-      "Attempted to change a read-only message ($messageName)");
+      'Attempted to change a read-only message ($messageName)');
 }
 
 /// Invoked when an attempt is made to modify a frozen message.
@@ -96,18 +97,18 @@
   final Map<int, int> _oneofCases;
 
   _FieldSet(this._message, BuilderInfo meta, this._eventPlugin)
-      : this._meta = meta,
+      : _meta = meta,
         _values = _makeValueList(meta.byIndex.length),
         _oneofCases = meta.oneofs.isEmpty ? null : <int, int>{};
 
-  static _makeValueList(int length) {
+  static List _makeValueList(int length) {
     if (length == 0) return _zeroList;
     return List(length);
   }
 
   // Use a fixed length list and not a constant list to ensure that _values
   // always has the same implementation type.
-  static List _zeroList = List(0);
+  static final List _zeroList = List(0);
 
   // Metadata about multiple fields
 
@@ -152,7 +153,7 @@
   FieldInfo _ensureInfo(int tagNumber) {
     var fi = _getFieldInfoOrNull(tagNumber);
     if (fi != null) return fi;
-    throw ArgumentError("tag $tagNumber not defined in $_messageName");
+    throw ArgumentError('tag $tagNumber not defined in $_messageName');
   }
 
   /// Returns the FieldInfo for a regular or extension field.
@@ -207,7 +208,7 @@
   /// Works for both extended and non-extended fields.
   /// Creates repeated fields (unless read-only).
   /// Suitable for public API.
-  _getField(int tagNumber) {
+  dynamic _getField(int tagNumber) {
     var fi = _nonExtensionInfo(tagNumber);
     if (fi != null) {
       var value = _values[fi.index];
@@ -220,10 +221,10 @@
         return _extensions._getFieldOrDefault(fi);
       }
     }
-    throw ArgumentError("tag $tagNumber not defined in $_messageName");
+    throw ArgumentError('tag $tagNumber not defined in $_messageName');
   }
 
-  _getDefault(FieldInfo fi) {
+  dynamic _getDefault(FieldInfo fi) {
     if (!fi.isRepeated) return fi.makeDefault();
     if (_isReadOnly) return fi.readonlyDefault;
 
@@ -260,7 +261,7 @@
     return value;
   }
 
-  _getFieldOrNullByTag(int tagNumber) {
+  dynamic _getFieldOrNullByTag(int tagNumber) {
     var fi = _getFieldInfoOrNull(tagNumber);
     if (fi == null) return null;
     return _getFieldOrNull(fi);
@@ -270,7 +271,7 @@
   ///
   /// Works for both extended and non-extend fields.
   /// Works for both repeated and non-repeated fields.
-  _getFieldOrNull(FieldInfo fi) {
+  dynamic _getFieldOrNull(FieldInfo fi) {
     if (fi.index != null) return _values[fi.index];
     if (!_hasExtensions) return null;
     return _extensions._getFieldOrNull(fi);
@@ -295,7 +296,7 @@
         _oneofCases.remove(_meta.oneofs[fi.tagNumber]);
       }
 
-      int oneofIndex = _meta.oneofs[fi.tagNumber];
+      var oneofIndex = _meta.oneofs[fi.tagNumber];
       if (oneofIndex != null) _oneofCases[oneofIndex] = 0;
       return;
     }
@@ -322,7 +323,7 @@
     var fi = _nonExtensionInfo(tagNumber);
     if (fi == null) {
       if (!_hasExtensions) {
-        throw ArgumentError("tag $tagNumber not defined in $_messageName");
+        throw ArgumentError('tag $tagNumber not defined in $_messageName');
       }
       _extensions._setField(tagNumber, value);
       return;
@@ -387,8 +388,8 @@
 
   /// Sets a non-extended field and fires events.
   void _setNonExtensionFieldUnchecked(FieldInfo fi, value) {
-    int tag = fi.tagNumber;
-    int oneofIndex = _meta.oneofs[tag];
+    var tag = fi.tagNumber;
+    var oneofIndex = _meta.oneofs[tag];
     if (oneofIndex != null) {
       _clearField(_oneofCases[oneofIndex]);
       _oneofCases[oneofIndex] = tag;
@@ -511,9 +512,7 @@
   /// The implementation of a generated getter for Int64 fields.
   Int64 _$getI64(int index) {
     var value = _values[index];
-    if (value == null) {
-      value = _getDefault(_nonExtensionInfoByIndex(index));
-    }
+    value ??= _getDefault(_nonExtensionInfoByIndex(index));
     Int64 result = value;
     return result;
   }
@@ -541,8 +540,8 @@
     if (_hasObservers) {
       _eventPlugin.beforeSetField(_nonExtensionInfoByIndex(index), value);
     }
-    int tag = _meta.byIndex[index].tagNumber;
-    int oneofIndex = _meta.oneofs[tag];
+    var tag = _meta.byIndex[index].tagNumber;
+    var oneofIndex = _meta.oneofs[tag];
 
     if (oneofIndex != null) {
       _clearField(_oneofCases[oneofIndex]);
@@ -571,7 +570,7 @@
         }
       }
       if (_hasExtensions) {
-        for (int key in _extensions._tagNumbers) {
+        for (var key in _extensions._tagNumbers) {
           var fi = _extensions._getInfoOrNull(key);
           _eventPlugin.beforeClearField(fi);
         }
@@ -683,7 +682,7 @@
     }
 
     // Hash with descriptor.
-    int hash = _HashUtils._combine(0, _meta.hashCode);
+    var hash = _HashUtils._combine(0, _meta.hashCode);
     // Hash with fields.
     hash = hashEachField(hash);
     // Hash with unknown fields.
@@ -757,13 +756,13 @@
     // this case, we can merge the non-extension fields without field lookups or
     // validation checks.
 
-    for (FieldInfo fi in other._infosSortedByTag) {
+    for (var fi in other._infosSortedByTag) {
       var value = other._values[fi.index];
       if (value != null) _mergeField(fi, value, isExtension: false);
     }
     if (other._hasExtensions) {
       var others = other._extensions;
-      for (int tagNumber in others._tagNumbers) {
+      for (var tagNumber in others._tagNumbers) {
         var extension = others._getInfoOrNull(tagNumber);
         var value = others._getFieldOrNull(extension);
         _mergeField(extension, value, isExtension: true);
@@ -776,17 +775,17 @@
   }
 
   void _mergeField(FieldInfo otherFi, fieldValue, {bool isExtension}) {
-    int tagNumber = otherFi.tagNumber;
+    var tagNumber = otherFi.tagNumber;
 
     // Determine the FieldInfo to use.
     // Don't allow regular fields to be overwritten by extensions.
-    FieldInfo fi = _nonExtensionInfo(tagNumber);
+    var fi = _nonExtensionInfo(tagNumber);
     if (fi == null && isExtension) {
       // This will overwrite any existing extension field info.
       fi = otherFi;
     }
 
-    bool mustClone = _isGroupOrMessage(otherFi.type);
+    var mustClone = _isGroupOrMessage(otherFi.type);
 
     if (fi.isMapField) {
       MapFieldInfo f = fi;
@@ -807,7 +806,7 @@
         // fieldValue must be a PbListBase of GeneratedMessage.
         PbListBase<GeneratedMessage> pbList = fieldValue;
         var repeatedFields = fi._ensureRepeatedField(this);
-        for (int i = 0; i < pbList.length; ++i) {
+        for (var i = 0; i < pbList.length; ++i) {
           repeatedFields.add(_cloneMessage(pbList[i]));
         }
       } else {
@@ -895,8 +894,8 @@
   /// Map fields and repeated fields are copied.
   void _shallowCopyValues(_FieldSet original) {
     _values.setRange(0, original._values.length, original._values);
-    for (int index = 0; index < _meta.byIndex.length; index++) {
-      FieldInfo fieldInfo = _meta.byIndex[index];
+    for (var index = 0; index < _meta.byIndex.length; index++) {
+      var fieldInfo = _meta.byIndex[index];
       if (fieldInfo.isMapField) {
         PbMap map = _values[index];
         if (map != null) {
diff --git a/protobuf/lib/src/protobuf/generated_message.dart b/protobuf/lib/src/protobuf/generated_message.dart
index 0944569..13f4dfb 100644
--- a/protobuf/lib/src/protobuf/generated_message.dart
+++ b/protobuf/lib/src/protobuf/generated_message.dart
@@ -4,9 +4,9 @@
 
 part of protobuf;
 
-typedef GeneratedMessage CreateBuilderFunc();
-typedef MakeDefaultFunc();
-typedef ProtobufEnum ValueOfFunc(int value);
+typedef CreateBuilderFunc = GeneratedMessage Function();
+typedef MakeDefaultFunc = Function();
+typedef ValueOfFunc = ProtobufEnum Function(int value);
 
 /// The base class for all protobuf message types.
 ///
@@ -122,6 +122,7 @@
   ///
   /// The hash may change when any field changes (recursively).
   /// Therefore, protobufs used as map keys shouldn't be changed.
+  @override
   int get hashCode => _fieldSet._hashCode;
 
   /// Returns a String representation of this message.
@@ -132,6 +133,7 @@
   ///
   /// Note that this format is absolutely subject to change, and should only
   /// ever be used for debugging.
+  @override
   String toString() => toDebugString();
 
   /// Returns a String representation of this message.
@@ -146,15 +148,15 @@
 
   void check() {
     if (!isInitialized()) {
-      List<String> invalidFields = <String>[];
-      _fieldSet._appendInvalidFields(invalidFields, "");
-      String missingFields = (invalidFields..sort()).join(', ');
+      var invalidFields = <String>[];
+      _fieldSet._appendInvalidFields(invalidFields, '');
+      var missingFields = (invalidFields..sort()).join(', ');
       throw StateError('Message missing required fields: $missingFields');
     }
   }
 
   Uint8List writeToBuffer() {
-    CodedBufferWriter out = CodedBufferWriter();
+    var out = CodedBufferWriter();
     writeToCodedBufferWriter(out);
     return out.toBuffer();
   }
@@ -176,7 +178,7 @@
   ///   the existing sub-message.
   void mergeFromBuffer(List<int> input,
       [ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY]) {
-    CodedBufferReader codedInput = CodedBufferReader(input);
+    var codedInput = CodedBufferReader(input);
     _mergeFromCodedBufferReader(_fieldSet, codedInput, extensionRegistry);
     codedInput.checkLastTagWas(0);
   }
@@ -269,7 +271,7 @@
     _mergeFromJsonMap(_fieldSet, jsonMap, extensionRegistry);
   }
 
-  static _emptyReviver(k, v) => v;
+  static dynamic _emptyReviver(k, v) => v;
 
   /// Merges field values from a JSON object represented as a Dart map.
   ///
@@ -311,13 +313,13 @@
   /// Returns the value of [extension].
   ///
   /// If not set, returns the extension's default value.
-  getExtension(Extension extension) {
+  dynamic getExtension(Extension extension) {
     return _fieldSet._ensureExtensions()._getFieldOrDefault(extension);
   }
 
   /// Returns the value of the field associated with [tagNumber], or the
   /// default value if it is not set.
-  getField(int tagNumber) => _fieldSet._getField(tagNumber);
+  dynamic getField(int tagNumber) => _fieldSet._getField(tagNumber);
 
   /// Creates List implementing a mutable repeated field.
   ///
@@ -339,14 +341,15 @@
   ///
   /// For unset or cleared fields, returns null.
   /// Also returns null for unknown tag numbers.
-  getFieldOrNull(int tagNumber) => _fieldSet._getFieldOrNullByTag(tagNumber);
+  dynamic getFieldOrNull(int tagNumber) =>
+      _fieldSet._getFieldOrNullByTag(tagNumber);
 
   /// Returns the default value for the given field.
   ///
   /// For repeated fields, returns an immutable empty list
   /// (unlike [getField]). For all other fields, returns
   /// the same thing that getField() would for a cleared field.
-  getDefaultForField(int tagNumber) =>
+  dynamic getDefaultForField(int tagNumber) =>
       _fieldSet._ensureInfo(tagNumber).readonlyDefault;
 
   /// Returns [:true:] if a value of [extension] is present.
diff --git a/protobuf/lib/src/protobuf/json.dart b/protobuf/lib/src/protobuf/json.dart
index 23eb4fb..ff1ceb5 100644
--- a/protobuf/lib/src/protobuf/json.dart
+++ b/protobuf/lib/src/protobuf/json.dart
@@ -5,8 +5,8 @@
 part of protobuf;
 
 Map<String, dynamic> _writeToJsonMap(_FieldSet fs) {
-  convertToMap(dynamic fieldValue, int fieldType) {
-    int baseType = PbFieldType._baseType(fieldType);
+  dynamic convertToMap(dynamic fieldValue, int fieldType) {
+    var baseType = PbFieldType._baseType(fieldType);
 
     if (_isRepeated(fieldType)) {
       return List.from(fieldValue.map((e) => convertToMap(e, baseType)));
@@ -43,12 +43,12 @@
     }
   }
 
-  _writeMap(dynamic fieldValue, MapFieldInfo fi) {
-    return List.from(fieldValue.entries.map((MapEntry e) => {
-          '${PbMap._keyFieldNumber}': convertToMap(e.key, fi.keyFieldType),
-          '${PbMap._valueFieldNumber}': convertToMap(e.value, fi.valueFieldType)
-        }));
-  }
+  List _writeMap(dynamic fieldValue, MapFieldInfo fi) =>
+      List.from(fieldValue.entries.map((MapEntry e) => {
+            '${PbMap._keyFieldNumber}': convertToMap(e.key, fi.keyFieldType),
+            '${PbMap._valueFieldNumber}':
+                convertToMap(e.value, fi.valueFieldType)
+          }));
 
   var result = <String, dynamic>{};
   for (var fi in fs._infosSortedByTag) {
@@ -63,7 +63,7 @@
     result['${fi.tagNumber}'] = convertToMap(value, fi.type);
   }
   if (fs._hasExtensions) {
-    for (int tagNumber in _sorted(fs._extensions._tagNumbers)) {
+    for (var tagNumber in _sorted(fs._extensions._tagNumbers)) {
       var value = fs._extensions._values[tagNumber];
       if (value is List && value.isEmpty) {
         continue; // It's repeated or an empty byte array.
@@ -79,9 +79,9 @@
 // (Called recursively on nested messages.)
 void _mergeFromJsonMap(
     _FieldSet fs, Map<String, dynamic> json, ExtensionRegistry registry) {
-  Iterable<String> keys = json.keys;
+  var keys = json.keys;
   var meta = fs._meta;
-  for (String key in keys) {
+  for (var key in keys) {
     var fi = meta.byTagAsString[key];
     if (fi == null) {
       if (registry == null) continue; // Unknown tag; skip
@@ -105,7 +105,7 @@
   // alloc:
   //   for (t1 = J.get$iterator$ax(json), t2 = fi.tagNumber, t3 = fi.type,
   //       t4 = J.getInterceptor$ax(repeated); t1.moveNext$0();)
-  for (int i = 0, len = jsonList.length; i < len; i++) {
+  for (var i = 0, len = jsonList.length; i < len; i++) {
     var value = jsonList[i];
     var convertedValue =
         _convertJsonValue(fs, value, fi.tagNumber, fi.type, registry);
@@ -119,7 +119,7 @@
     _FieldSet fs, List jsonList, MapFieldInfo fi, ExtensionRegistry registry) {
   PbMap map = fi._ensureMapField(fs);
   for (Map<String, dynamic> jsonEntry in jsonList) {
-    _FieldSet entryFieldSet = map._entryFieldSet();
+    var entryFieldSet = map._entryFieldSet();
     final convertedKey = _convertJsonValue(
         entryFieldSet,
         jsonEntry['${PbMap._keyFieldNumber}'],
@@ -156,7 +156,7 @@
 /// Returns the converted value.  This function returns [null] if the caller
 /// should ignore the field value, because it is an unknown enum value.
 /// This function throws [ArgumentError] if it cannot convert the value.
-_convertJsonValue(_FieldSet fs, value, int tagNumber, int fieldType,
+dynamic _convertJsonValue(_FieldSet fs, value, int tagNumber, int fieldType,
     ExtensionRegistry registry) {
   String expectedType; // for exception message
   switch (PbFieldType._baseType(fieldType)) {
@@ -237,8 +237,7 @@
     case PbFieldType._MESSAGE_BIT:
       if (value is Map) {
         Map<String, dynamic> messageValue = value;
-        GeneratedMessage subMessage =
-            fs._meta._makeEmptyMessage(tagNumber, registry);
+        var subMessage = fs._meta._makeEmptyMessage(tagNumber, registry);
         _mergeFromJsonMap(subMessage._fieldSet, messageValue, registry);
         return subMessage;
       }
diff --git a/protobuf/lib/src/protobuf/json_parsing_context.dart b/protobuf/lib/src/protobuf/json_parsing_context.dart
index 7f27bbb..d9e9f53 100644
--- a/protobuf/lib/src/protobuf/json_parsing_context.dart
+++ b/protobuf/lib/src/protobuf/json_parsing_context.dart
@@ -26,7 +26,7 @@
 
   /// Returns a FormatException indicating the indices to the current [path].
   Exception parseException(String message, Object source) {
-    String formattedPath = _path.map((s) => '[\"$s\"]').join();
+    var formattedPath = _path.map((s) => '[\"$s\"]').join();
     return FormatException(
         'Protobuf JSON decoding failed at: root$formattedPath. $message',
         source);
diff --git a/protobuf/lib/src/protobuf/mixins/event_mixin.dart b/protobuf/lib/src/protobuf/mixins/event_mixin.dart
index 4741fd2..a611df0 100644
--- a/protobuf/lib/src/protobuf/mixins/event_mixin.dart
+++ b/protobuf/lib/src/protobuf/mixins/event_mixin.dart
@@ -4,10 +4,10 @@
 
 library protobuf.mixins.event;
 
-import "dart:async" show Stream, StreamController, scheduleMicrotask;
-import "dart:collection" show UnmodifiableListView;
+import 'dart:async' show Stream, StreamController, scheduleMicrotask;
+import 'dart:collection' show UnmodifiableListView;
 
-import "package:protobuf/protobuf.dart"
+import 'package:protobuf/protobuf.dart'
     show GeneratedMessage, FieldInfo, EventPlugin;
 
 /// Provides a stream of changes to fields in a GeneratedMessage.
@@ -62,12 +62,11 @@
   }
 
   Stream<List<PbFieldChange>> get changes {
-    if (_controller == null) {
-      _controller = StreamController.broadcast(sync: true);
-    }
+    _controller ??= StreamController.broadcast(sync: true);
     return _controller.stream;
   }
 
+  @override
   bool get hasObservers => _controller != null && _controller.hasListener;
 
   void deliverChanges() {
@@ -90,7 +89,7 @@
   @override
   void beforeSetField(FieldInfo fi, newValue) {
     var oldValue = _parent.getFieldOrNull(fi.tagNumber);
-    if (oldValue == null) oldValue = fi.readonlyDefault;
+    oldValue ??= fi.readonlyDefault;
     if (identical(oldValue, newValue)) return;
     addEvent(PbFieldChange(_parent, fi, oldValue, newValue));
   }
diff --git a/protobuf/lib/src/protobuf/mixins/map_mixin.dart b/protobuf/lib/src/protobuf/mixins/map_mixin.dart
index 9b0a280..2608fb0 100644
--- a/protobuf/lib/src/protobuf/mixins/map_mixin.dart
+++ b/protobuf/lib/src/protobuf/mixins/map_mixin.dart
@@ -4,7 +4,7 @@
 
 library protobuf.mixins.map;
 
-import "package:protobuf/protobuf.dart" show BuilderInfo;
+import 'package:protobuf/protobuf.dart' show BuilderInfo;
 
 /// Note that this class does not claim to implement [Map]. Instead, this needs
 /// to be specified using a dart_options.imports clause specifying MapMixin as a
@@ -18,10 +18,10 @@
   BuilderInfo get info_;
   void clear();
   int getTagNumber(String fieldName);
-  getField(int tagNumber);
+  dynamic getField(int tagNumber);
   void setField(int tagNumber, var value);
 
-  operator [](key) {
+  dynamic operator [](key) {
     if (key is! String) return null;
     var tag = getTagNumber(key);
     if (tag == null) return null;
@@ -43,8 +43,8 @@
 
   int get length => info_.byName.length;
 
-  remove(key) {
+  dynamic remove(key) {
     throw UnsupportedError(
-        "remove() not supported by ${info_.qualifiedMessageName}");
+        'remove() not supported by ${info_.qualifiedMessageName}');
   }
 }
diff --git a/protobuf/lib/src/protobuf/mixins/well_known.dart b/protobuf/lib/src/protobuf/mixins/well_known.dart
index 2114680..0375840 100644
--- a/protobuf/lib/src/protobuf/mixins/well_known.dart
+++ b/protobuf/lib/src/protobuf/mixins/well_known.dart
@@ -79,17 +79,16 @@
   //     }
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    AnyMixin any = message as AnyMixin;
-    BuilderInfo info = typeRegistry.lookup(_typeNameFromUrl(any.typeUrl));
+    var any = message as AnyMixin;
+    var info = typeRegistry.lookup(_typeNameFromUrl(any.typeUrl));
     if (info == null) {
       throw ArgumentError(
           'The type of the Any message (${any.typeUrl}) is not in the given typeRegistry.');
     }
-    GeneratedMessage unpacked = info.createEmptyInstance()
-      ..mergeFromBuffer(any.value);
-    Object proto3Json = unpacked.toProto3Json();
+    var unpacked = info.createEmptyInstance()..mergeFromBuffer(any.value);
+    var proto3Json = unpacked.toProto3Json();
     if (info.toProto3Json == null) {
-      Map<String, dynamic> map = proto3Json as Map<String, dynamic>;
+      var map = proto3Json as Map<String, dynamic>;
       map['@type'] = any.typeUrl;
       return map;
     } else {
@@ -107,8 +106,8 @@
     final typeUrl = object['@type'];
 
     if (typeUrl is String) {
-      AnyMixin any = message as AnyMixin;
-      BuilderInfo info = typeRegistry.lookup(_typeNameFromUrl(typeUrl));
+      var any = message as AnyMixin;
+      var info = typeRegistry.lookup(_typeNameFromUrl(typeUrl));
       if (info == null) {
         throw context.parseException(
             'Decoding Any of type ${typeUrl} not in TypeRegistry $typeRegistry',
@@ -120,7 +119,7 @@
           ? (Map<String, dynamic>.from(object)..remove('@type'))
           : object['value'];
       // TODO(sigurdm): We lose [context.path].
-      GeneratedMessage packedMessage = info.createEmptyInstance()
+      var packedMessage = info.createEmptyInstance()
         ..mergeFromProto3Json(subJson,
             typeRegistry: typeRegistry,
             supportNamesWithUnderscores: context.supportNamesWithUnderscores,
@@ -136,7 +135,7 @@
 }
 
 String _typeNameFromUrl(String typeUrl) {
-  int index = typeUrl.lastIndexOf('/');
+  var index = typeUrl.lastIndexOf('/');
   return index < 0 ? '' : typeUrl.substring(index + 1);
 }
 
@@ -161,14 +160,14 @@
   ///
   /// Time zone information will not be preserved.
   static void setFromDateTime(TimestampMixin target, DateTime dateTime) {
-    int micros = dateTime.microsecondsSinceEpoch;
+    var micros = dateTime.microsecondsSinceEpoch;
     target.seconds = Int64(micros ~/ Duration.microsecondsPerSecond);
     target.nanos = (micros % Duration.microsecondsPerSecond).toInt() * 1000;
   }
 
   static String _twoDigits(int n) {
-    if (n >= 10) return "${n}";
-    return "0${n}";
+    if (n >= 10) return '${n}';
+    return '0${n}';
   }
 
   static final DateTime _minTimestamp = DateTime.utc(1);
@@ -192,8 +191,8 @@
   // 01:30 UTC on January 15, 2017.
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    TimestampMixin timestamp = message as TimestampMixin;
-    DateTime dateTime = timestamp.toDateTime();
+    var timestamp = message as TimestampMixin;
+    var dateTime = timestamp.toDateTime();
 
     if (timestamp.nanos < 0) {
       throw ArgumentError(
@@ -210,31 +209,31 @@
 
     // Because [DateTime] doesn't have nano-second precision, we cannot use
     // dateTime.toIso8601String().
-    String y = '${dateTime.year}'.padLeft(4, '0');
-    String m = _twoDigits(dateTime.month);
-    String d = _twoDigits(dateTime.day);
-    String h = _twoDigits(dateTime.hour);
-    String min = _twoDigits(dateTime.minute);
-    String sec = _twoDigits(dateTime.second);
-    String secFrac = "";
+    var y = '${dateTime.year}'.padLeft(4, '0');
+    var m = _twoDigits(dateTime.month);
+    var d = _twoDigits(dateTime.day);
+    var h = _twoDigits(dateTime.hour);
+    var min = _twoDigits(dateTime.minute);
+    var sec = _twoDigits(dateTime.second);
+    var secFrac = '';
     if (timestamp.nanos > 0) {
-      secFrac = "." +
+      secFrac = '.' +
           timestamp.nanos
               .toString()
-              .padLeft(9, "0")
+              .padLeft(9, '0')
               .replaceFirst(finalGroupsOfThreeZeroes, '');
     }
-    return "$y-$m-${d}T$h:$min:$sec${secFrac}Z";
+    return '$y-$m-${d}T$h:$min:$sec${secFrac}Z';
   }
 
   static void fromProto3JsonHelper(GeneratedMessage message, Object json,
       TypeRegistry typeRegistry, JsonParsingContext context) {
     if (json is String) {
-      String jsonWithoutFracSec = json;
-      int nanos = 0;
+      var jsonWithoutFracSec = json;
+      var nanos = 0;
       Match fracSecsMatch = RegExp(r'\.(\d+)').firstMatch(json);
       if (fracSecsMatch != null) {
-        String fracSecs = fracSecsMatch[1];
+        var fracSecs = fracSecsMatch[1];
         if (fracSecs.length > 9) {
           throw context.parseException(
               'Timestamp can have at most than 9 decimal digits', json);
@@ -243,12 +242,12 @@
         jsonWithoutFracSec =
             json.replaceRange(fracSecsMatch.start, fracSecsMatch.end, '');
       }
-      DateTime dateTimeWithoutFractionalSeconds =
+      var dateTimeWithoutFractionalSeconds =
           DateTime.tryParse(jsonWithoutFracSec) ??
               (throw context.parseException(
                   'Timestamp not well formatted. ', json));
 
-      TimestampMixin timestamp = message as TimestampMixin;
+      var timestamp = message as TimestampMixin;
       setFromDateTime(timestamp, dateTimeWithoutFractionalSeconds);
       timestamp.nanos = nanos;
     } else {
@@ -269,33 +268,33 @@
 
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    DurationMixin duration = message as DurationMixin;
-    String secFrac = duration.nanos
+    var duration = message as DurationMixin;
+    var secFrac = duration.nanos
         // nanos and seconds should always have the same sign.
         .abs()
         .toString()
         .padLeft(9, '0')
         .replaceFirst(finalZeroes, '');
-    String secPart = secFrac == '' ? '' : '.$secFrac';
-    return "${duration.seconds}${secPart}s";
+    var secPart = secFrac == '' ? '' : '.$secFrac';
+    return '${duration.seconds}${secPart}s';
   }
 
   static final RegExp durationPattern = RegExp(r'(-?\d*)(?:\.(\d*))?s$');
 
   static void fromProto3JsonHelper(GeneratedMessage message, Object json,
       TypeRegistry typeRegistry, JsonParsingContext context) {
-    DurationMixin duration = message as DurationMixin;
+    var duration = message as DurationMixin;
     if (json is String) {
-      Match match = durationPattern.matchAsPrefix(json);
+      var match = durationPattern.matchAsPrefix(json);
       if (match == null) {
         throw context.parseException(
             'Expected a String of the form `<seconds>.<nanos>s`', json);
       } else {
-        String secondsString = match[1];
-        Int64 seconds =
+        var secondsString = match[1];
+        var seconds =
             secondsString == '' ? Int64.ZERO : Int64.parseInt(secondsString);
         duration.seconds = seconds;
-        int nanos = int.parse((match[2] ?? '').padRight(9, '0'));
+        var nanos = int.parse((match[2] ?? '').padRight(9, '0'));
         duration.nanos = seconds < 0 ? -nanos : nanos;
       }
     } else {
@@ -313,7 +312,7 @@
   // The JSON representation for `Struct` is JSON object.
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    StructMixin struct = message as StructMixin;
+    var struct = message as StructMixin;
     return struct.fields.map((key, value) =>
         MapEntry(key, ValueMixin.toProto3JsonHelper(value, typeRegistry)));
   }
@@ -324,8 +323,8 @@
       // Check for emptiness to avoid setting `.fields` if there are no
       // values.
       if (json.isNotEmpty) {
-        Map<String, ValueMixin> fields = (message as StructMixin).fields;
-        GeneratedMessage Function() valueCreator =
+        var fields = (message as StructMixin).fields;
+        var valueCreator =
             (message.info_.fieldInfo[_fieldsFieldTagNumber] as MapFieldInfo)
                 .valueCreator;
 
@@ -371,7 +370,7 @@
   // The JSON representation for `Value` is JSON value
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    ValueMixin value = message as ValueMixin;
+    var value = message as ValueMixin;
     // This would ideally be a switch, but we cannot import the enum we are
     // switching over.
     if (value.hasNullValue()) {
@@ -393,7 +392,7 @@
 
   static void fromProto3JsonHelper(GeneratedMessage message, Object json,
       TypeRegistry typeRegistry, JsonParsingContext context) {
-    ValueMixin value = message as ValueMixin;
+    var value = message as ValueMixin;
     if (json == null) {
       // Rely on the getter retrieving the default to provide an instance.
       value.nullValue = value.nullValue;
@@ -430,7 +429,7 @@
   // The JSON representation for `ListValue` is JSON array.
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    ListValueMixin list = message as ListValueMixin;
+    var list = message as ListValueMixin;
     return list.values
         .map((value) => ValueMixin.toProto3JsonHelper(value, typeRegistry))
         .toList();
@@ -440,11 +439,10 @@
 
   static void fromProto3JsonHelper(GeneratedMessage message, Object json,
       TypeRegistry typeRegistry, JsonParsingContext context) {
-    ListValueMixin list = message as ListValueMixin;
+    var list = message as ListValueMixin;
     if (json is List) {
-      CreateBuilderFunc subBuilder =
-          message.info_.subBuilder(_valueFieldTagNumber);
-      for (int i = 0; i < json.length; i++) {
+      var subBuilder = message.info_.subBuilder(_valueFieldTagNumber);
+      for (var i = 0; i < json.length; i++) {
         Object element = json[i];
         ValueMixin v = subBuilder();
         context.addListIndex(i);
@@ -469,8 +467,8 @@
   // to/from lower-camel naming conventions.
   static Object toProto3JsonHelper(
       GeneratedMessage message, TypeRegistry typeRegistry) {
-    FieldMaskMixin fieldMask = message as FieldMaskMixin;
-    for (String path in fieldMask.paths) {
+    var fieldMask = message as FieldMaskMixin;
+    for (var path in fieldMask.paths) {
       if (path.contains(RegExp('[A-Z]|_[^a-z]'))) {
         throw ArgumentError(
             'Bad fieldmask $path. Does not round-trip to json.');
diff --git a/protobuf/lib/src/protobuf/pb_list.dart b/protobuf/lib/src/protobuf/pb_list.dart
index fcd0569..bc26f1b 100644
--- a/protobuf/lib/src/protobuf/pb_list.dart
+++ b/protobuf/lib/src/protobuf/pb_list.dart
@@ -4,7 +4,7 @@
 
 part of protobuf;
 
-typedef void CheckFunc<E>(E x);
+typedef CheckFunc<E> = void Function(E x);
 
 class FrozenPbList<E> extends PbListBase<E> {
   FrozenPbList._(List<E> wrappedList) : super._(wrappedList);
@@ -13,39 +13,58 @@
       FrozenPbList._(other._wrappedList);
 
   UnsupportedError _unsupported(String method) =>
-      UnsupportedError("Cannot call $method on an unmodifiable list");
+      UnsupportedError('Cannot call $method on an unmodifiable list');
 
-  void operator []=(int index, E value) => throw _unsupported("set");
-  set length(int newLength) => throw _unsupported("set length");
-  void setAll(int at, Iterable<E> iterable) => throw _unsupported("setAll");
-  void add(E value) => throw _unsupported("add");
-  void addAll(Iterable<E> iterable) => throw _unsupported("addAll");
-  void insert(int index, E element) => throw _unsupported("insert");
+  @override
+  void operator []=(int index, E value) => throw _unsupported('set');
+  @override
+  set length(int newLength) => throw _unsupported('set length');
+  @override
+  void setAll(int at, Iterable<E> iterable) => throw _unsupported('setAll');
+  @override
+  void add(E value) => throw _unsupported('add');
+  @override
+  void addAll(Iterable<E> iterable) => throw _unsupported('addAll');
+  @override
+  void insert(int index, E element) => throw _unsupported('insert');
+  @override
   void insertAll(int at, Iterable<E> iterable) =>
-      throw _unsupported("insertAll");
-  bool remove(Object element) => throw _unsupported("remove");
-  void removeWhere(bool test(E element)) => throw _unsupported("removeWhere");
-  void retainWhere(bool test(E element)) => throw _unsupported("retainWhere");
-  void sort([Comparator<E> compare]) => throw _unsupported("sort");
-  void shuffle([math.Random random]) => throw _unsupported("shuffle");
-  void clear() => throw _unsupported("clear");
-  E removeAt(int index) => throw _unsupported("removeAt");
-  E removeLast() => throw _unsupported("removeLast");
+      throw _unsupported('insertAll');
+  @override
+  bool remove(Object element) => throw _unsupported('remove');
+  @override
+  void removeWhere(bool Function(E element) test) =>
+      throw _unsupported('removeWhere');
+  @override
+  void retainWhere(bool Function(E element) test) =>
+      throw _unsupported('retainWhere');
+  @override
+  void sort([Comparator<E> compare]) => throw _unsupported('sort');
+  @override
+  void shuffle([math.Random random]) => throw _unsupported('shuffle');
+  @override
+  void clear() => throw _unsupported('clear');
+  @override
+  E removeAt(int index) => throw _unsupported('removeAt');
+  @override
+  E removeLast() => throw _unsupported('removeLast');
+  @override
   void setRange(int start, int end, Iterable<E> iterable,
           [int skipCount = 0]) =>
-      throw _unsupported("setRange");
-  void removeRange(int start, int end) => throw _unsupported("removeRange");
+      throw _unsupported('setRange');
+  @override
+  void removeRange(int start, int end) => throw _unsupported('removeRange');
+  @override
   void replaceRange(int start, int end, Iterable<E> iterable) =>
-      throw _unsupported("replaceRange");
+      throw _unsupported('replaceRange');
+  @override
   void fillRange(int start, int end, [E fillValue]) =>
-      throw _unsupported("fillRange");
+      throw _unsupported('fillRange');
 }
 
 class PbList<E> extends PbListBase<E> {
   PbList({check = _checkNotNull}) : super._noList(check: check);
 
-  PbList._(List<E> wrappedList) : super._(wrappedList);
-
   PbList.from(List from) : super._from(from);
 
   @Deprecated('Instead use the default constructor with a check function.'
@@ -58,6 +77,7 @@
 
   /// Adds [value] at the end of the list, extending the length by one.
   /// Throws an [UnsupportedError] if the list is not extendable.
+  @override
   void add(E value) {
     check(value);
     _wrappedList.add(value);
@@ -66,26 +86,32 @@
   /// Appends all elements of the [collection] to the end of list.
   /// Extends the length of the list by the length of [collection].
   /// Throws an [UnsupportedError] if the list is not extendable.
+  @override
   void addAll(Iterable<E> collection) {
     collection.forEach(check);
     _wrappedList.addAll(collection);
   }
 
   /// Returns an [Iterable] of the objects in this list in reverse order.
+  @override
   Iterable<E> get reversed => _wrappedList.reversed;
 
   /// Sorts this list according to the order specified by the [compare]
   /// function.
-  void sort([int compare(E a, E b)]) => _wrappedList.sort(compare);
+  @override
+  void sort([int Function(E a, E b) compare]) => _wrappedList.sort(compare);
 
   /// Shuffles the elements of this list randomly.
+  @override
   void shuffle([math.Random random]) => _wrappedList.shuffle(random);
 
   /// Removes all objects from this list; the length of the list becomes zero.
+  @override
   void clear() => _wrappedList.clear();
 
   /// Inserts a new element in the list.
   /// The element must be valid (and not nullable) for the PbList type.
+  @override
   void insert(int index, E element) {
     check(element);
     _wrappedList.insert(index, element);
@@ -94,6 +120,7 @@
   /// Inserts all elements of [iterable] at position [index] in the list.
   ///
   /// Elements in [iterable] must be valid and not nullable for the PbList type.
+  @override
   void insertAll(int index, Iterable<E> iterable) {
     iterable.forEach(check);
     _wrappedList.insertAll(index, iterable);
@@ -103,29 +130,38 @@
   /// position [index] in the list.
   ///
   /// Elements in [iterable] must be valid and not nullable for the PbList type.
+  @override
   void setAll(int index, Iterable<E> iterable) {
     iterable.forEach(check);
     _wrappedList.setAll(index, iterable);
   }
 
   /// Removes the first occurrence of [value] from this list.
+  @override
   bool remove(Object value) => _wrappedList.remove(value);
 
   /// Removes the object at position [index] from this list.
+  @override
   E removeAt(int index) => _wrappedList.removeAt(index);
 
   /// Pops and returns the last object in this list.
+  @override
   E removeLast() => _wrappedList.removeLast();
 
   /// Removes all objects from this list that satisfy [test].
-  void removeWhere(bool test(E element)) => _wrappedList.removeWhere(test);
+  @override
+  void removeWhere(bool Function(E element) test) =>
+      _wrappedList.removeWhere(test);
 
   /// Removes all objects from this list that fail to satisfy [test].
-  void retainWhere(bool test(E element)) => _wrappedList.retainWhere(test);
+  @override
+  void retainWhere(bool Function(E element) test) =>
+      _wrappedList.retainWhere(test);
 
   /// Copies [:end - start:] elements of the [from] array, starting from
   /// [skipCount], into [:this:], starting at [start].
   /// Throws an [UnsupportedError] if the list is not extendable.
+  @override
   void setRange(int start, int end, Iterable<E> from, [int skipCount = 0]) {
     // NOTE: In case `take()` returns less than `end - start` elements, the
     // _wrappedList will fail with a `StateError`.
@@ -134,10 +170,12 @@
   }
 
   /// Removes the objects in the range [start] inclusive to [end] exclusive.
+  @override
   void removeRange(int start, int end) => _wrappedList.removeRange(start, end);
 
   /// Sets the objects in the range [start] inclusive to [end] exclusive to the
   /// given [fillValue].
+  @override
   void fillRange(int start, int end, [E fillValue]) {
     check(fillValue);
     _wrappedList.fillRange(start, end, fillValue);
@@ -145,6 +183,7 @@
 
   /// Removes the objects in the range [start] inclusive to [end] exclusive and
   /// inserts the contents of [replacement] in its place.
+  @override
   void replaceRange(int start, int end, Iterable<E> replacement) {
     final values = replacement.toList();
     replacement.forEach(check);
@@ -175,86 +214,114 @@
   int get hashCode => _HashUtils._hashObjects(_wrappedList);
 
   /// Returns an [Iterator] for the list.
+  @override
   Iterator<E> get iterator => _wrappedList.iterator;
 
   /// Returns a new lazy [Iterable] with elements that are created by calling
   /// `f` on each element of this `PbListBase` in iteration order.
-  Iterable<T> map<T>(T f(E e)) => _wrappedList.map<T>(f);
+  @override
+  Iterable<T> map<T>(T Function(E e) f) => _wrappedList.map<T>(f);
 
   /// Returns a new lazy [Iterable] with all elements that satisfy the predicate
   /// [test].
-  Iterable<E> where(bool test(E element)) => _wrappedList.where(test);
+  @override
+  Iterable<E> where(bool Function(E element) test) => _wrappedList.where(test);
 
   /// Expands each element of this [Iterable] into zero or more elements.
-  Iterable<T> expand<T>(Iterable<T> f(E element)) => _wrappedList.expand(f);
+  @override
+  Iterable<T> expand<T>(Iterable<T> Function(E element) f) =>
+      _wrappedList.expand(f);
 
   /// Returns true if the collection contains an element equal to [element].
+  @override
   bool contains(Object element) => _wrappedList.contains(element);
 
   /// Applies the function [f] to each element of this list in iteration order.
-  void forEach(void f(E element)) {
+  @override
+  void forEach(void Function(E element) f) {
     _wrappedList.forEach(f);
   }
 
   /// Reduces a collection to a single value by iteratively combining elements
   /// of the collection using the provided function.
-  E reduce(E combine(E value, E element)) => _wrappedList.reduce(combine);
+  @override
+  E reduce(E Function(E value, E element) combine) =>
+      _wrappedList.reduce(combine);
 
   /// Reduces a collection to a single value by iteratively combining each
   /// element of the collection with an existing value.
-  T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
+  @override
+  T fold<T>(T initialValue, T Function(T previousValue, E element) combine) =>
       _wrappedList.fold(initialValue, combine);
 
   /// Checks whether every element of this iterable satisfies [test].
-  bool every(bool test(E element)) => _wrappedList.every(test);
+  @override
+  bool every(bool Function(E element) test) => _wrappedList.every(test);
 
   /// Converts each element to a [String] and concatenates the strings.
-  String join([String separator = ""]) => _wrappedList.join(separator);
+  @override
+  String join([String separator = '']) => _wrappedList.join(separator);
 
   /// Checks whether any element of this iterable satisfies [test].
-  bool any(bool test(E element)) => _wrappedList.any(test);
+  @override
+  bool any(bool Function(E element) test) => _wrappedList.any(test);
 
   /// Creates a [List] containing the elements of this [Iterable].
+  @override
   List<E> toList({bool growable = true}) =>
       _wrappedList.toList(growable: growable);
 
   /// Creates a [Set] containing the same elements as this iterable.
+  @override
   Set<E> toSet() => _wrappedList.toSet();
 
   /// Returns `true` if there are no elements in this collection.
+  @override
   bool get isEmpty => _wrappedList.isEmpty;
 
   /// Returns `true` if there is at least one element in this collection.
+  @override
   bool get isNotEmpty => _wrappedList.isNotEmpty;
 
   /// Returns a lazy iterable of the [count] first elements of this iterable.
+  @override
   Iterable<E> take(int count) => _wrappedList.take(count);
 
   /// Returns a lazy iterable of the leading elements satisfying [test].
-  Iterable<E> takeWhile(bool test(E value)) => _wrappedList.takeWhile(test);
+  @override
+  Iterable<E> takeWhile(bool Function(E value) test) =>
+      _wrappedList.takeWhile(test);
 
   /// Returns an [Iterable] that provides all but the first [count] elements.
+  @override
   Iterable<E> skip(int count) => _wrappedList.skip(count);
 
   /// Returns an `Iterable` that skips leading elements while [test] is
   /// satisfied.
-  Iterable<E> skipWhile(bool test(E value)) => _wrappedList.skipWhile(test);
+  @override
+  Iterable<E> skipWhile(bool Function(E value) test) =>
+      _wrappedList.skipWhile(test);
 
   /// Returns the first element.
+  @override
   E get first => _wrappedList.first;
 
   /// Returns the last element.
+  @override
   E get last => _wrappedList.last;
 
   /// Checks that this iterable has only one element, and returns that element.
+  @override
   E get single => _wrappedList.single;
 
   /// Returns the first element that satisfies the given predicate [test].
-  E firstWhere(bool test(E element), {E orElse()}) =>
+  @override
+  E firstWhere(bool Function(E element) test, {E Function() orElse}) =>
       _wrappedList.firstWhere(test, orElse: orElse);
 
   /// Returns the last element that satisfies the given predicate [test].
-  E lastWhere(bool test(E element), {E orElse()}) =>
+  @override
+  E lastWhere(bool Function(E element) test, {E Function() orElse}) =>
       _wrappedList.lastWhere(test, orElse: orElse);
 
   /// Returns the single element that satisfies [test].
@@ -263,9 +330,11 @@
   //    _wrappedList.singleWhere(test, orElse: orElse);
 
   /// Returns the [index]th element.
+  @override
   E elementAt(int index) => _wrappedList.elementAt(index);
 
   /// Returns a string representation of (some of) the elements of `this`.
+  @override
   String toString() => _wrappedList.toString();
 
   /// Returns the element at the given [index] in the list or throws an
@@ -274,27 +343,33 @@
   E operator [](int index) => _wrappedList[index];
 
   /// Returns the number of elements in this collection.
+  @override
   int get length => _wrappedList.length;
 
   // TODO(jakobr): E instead of Object once dart-lang/sdk#31311 is fixed.
   /// Returns the first index of [element] in this list.
+  @override
   int indexOf(Object element, [int start = 0]) =>
       _wrappedList.indexOf(element, start);
 
   // TODO(jakobr): E instead of Object once dart-lang/sdk#31311 is fixed.
   /// Returns the last index of [element] in this list.
+  @override
   int lastIndexOf(Object element, [int start]) =>
       _wrappedList.lastIndexOf(element, start);
 
   /// Returns a new list containing the objects from [start] inclusive to [end]
   /// exclusive.
+  @override
   List<E> sublist(int start, [int end]) => _wrappedList.sublist(start, end);
 
   /// Returns an [Iterable] that iterates over the objects in the range [start]
   /// inclusive to [end] exclusive.
+  @override
   Iterable<E> getRange(int start, int end) => _wrappedList.getRange(start, end);
 
   /// Returns an unmodifiable [Map] view of `this`.
+  @override
   Map<int, E> asMap() => _wrappedList.asMap();
 
   /// Sets the entry at the given [index] in the list to [value].
@@ -310,6 +385,7 @@
   /// Changes the length of the list. If [newLength] is greater than the current
   /// [length], entries are initialized to [:null:]. Throws an
   /// [UnsupportedError] if the list is not extendable.
+  @override
   set length(int newLength) {
     if (newLength > length) {
       throw UnsupportedError('Extending protobuf lists is not supported');
diff --git a/protobuf/lib/src/protobuf/pb_map.dart b/protobuf/lib/src/protobuf/pb_map.dart
index e7b02ee..a89713a 100644
--- a/protobuf/lib/src/protobuf/pb_map.dart
+++ b/protobuf/lib/src/protobuf/pb_map.dart
@@ -93,22 +93,22 @@
     return _wrappedMap.remove(key);
   }
 
-  @Deprecated("This function was not intended to be public. "
-      "It will be removed from the public api in next major version. ")
+  @Deprecated('This function was not intended to be public. '
+      'It will be removed from the public api in next major version. ')
   void add(CodedBufferReader input, [ExtensionRegistry registry]) {
     _mergeEntry(input, registry);
   }
 
   void _mergeEntry(CodedBufferReader input, [ExtensionRegistry registry]) {
-    int length = input.readInt32();
-    int oldLimit = input._currentLimit;
+    var length = input.readInt32();
+    var oldLimit = input._currentLimit;
     input._currentLimit = input._bufferPos + length;
-    _FieldSet entryFieldSet = _entryFieldSet();
+    var entryFieldSet = _entryFieldSet();
     _mergeFromCodedBufferReader(entryFieldSet, input, registry);
     input.checkLastTagWas(0);
     input._currentLimit = oldLimit;
-    K key = entryFieldSet._$get(0, null);
-    V value = entryFieldSet._$get(1, null);
+    var key = entryFieldSet._$get<K>(0, null);
+    var value = entryFieldSet._$get<V>(1, null);
     _wrappedMap[key] = value;
   }
 
diff --git a/protobuf/lib/src/protobuf/permissive_compare.dart b/protobuf/lib/src/protobuf/permissive_compare.dart
index e31103a..7b197ec 100644
--- a/protobuf/lib/src/protobuf/permissive_compare.dart
+++ b/protobuf/lib/src/protobuf/permissive_compare.dart
@@ -11,8 +11,8 @@
   const dash = 45;
   const underscore = 95;
 
-  int i = 0;
-  int j = 0;
+  var i = 0;
+  var j = 0;
 
   while (true) {
     int ca, cb;
diff --git a/protobuf/lib/src/protobuf/proto3_json.dart b/protobuf/lib/src/protobuf/proto3_json.dart
index bf76d56..f0a03b2 100644
--- a/protobuf/lib/src/protobuf/proto3_json.dart
+++ b/protobuf/lib/src/protobuf/proto3_json.dart
@@ -6,7 +6,7 @@
 
 Object _writeToProto3Json(_FieldSet fs, TypeRegistry typeRegistry) {
   String convertToMapKey(dynamic key, int keyType) {
-    int baseType = PbFieldType._baseType(keyType);
+    var baseType = PbFieldType._baseType(keyType);
 
     assert(!_isRepeated(keyType));
 
@@ -41,7 +41,7 @@
     } else if (_isEnum(fieldType)) {
       return (fieldValue as ProtobufEnum).name;
     } else {
-      int baseType = PbFieldType._baseType(fieldType);
+      var baseType = PbFieldType._baseType(fieldType);
       switch (baseType) {
         case PbFieldType._BOOL_BIT:
           return fieldValue ? true : false;
@@ -85,8 +85,8 @@
     return fs._meta.toProto3Json(fs._message, typeRegistry);
   }
 
-  Map<String, dynamic> result = <String, dynamic>{};
-  for (FieldInfo fieldInfo in fs._infosSortedByTag) {
+  var result = <String, dynamic>{};
+  for (var fieldInfo in fs._infosSortedByTag) {
     var value = fs._values[fieldInfo.index];
     if (value == null || (value is List && value.isEmpty)) {
       continue; // It's missing, repeated, or an empty byte array.
@@ -94,7 +94,7 @@
     dynamic jsonValue;
     if (fieldInfo.isMapField) {
       jsonValue = (value as PbMap).map((key, entryValue) {
-        MapFieldInfo mapEntryInfo = fieldInfo as MapFieldInfo;
+        var mapEntryInfo = fieldInfo as MapFieldInfo;
         return MapEntry(convertToMapKey(key, mapEntryInfo.keyFieldType),
             valueToProto3Json(entryValue, mapEntryInfo.valueFieldType));
       });
@@ -118,7 +118,7 @@
     bool ignoreUnknownFields,
     bool supportNamesWithUnderscores,
     bool permissiveEnums) {
-  JsonParsingContext context = JsonParsingContext(
+  var context = JsonParsingContext(
       ignoreUnknownFields, supportNamesWithUnderscores, permissiveEnums);
 
   void recursionHelper(Object json, _FieldSet fieldSet) {
@@ -155,7 +155,7 @@
       if (value == null) {
         return fieldInfo.makeDefault();
       }
-      int fieldType = fieldInfo.type;
+      var fieldType = fieldInfo.type;
       switch (PbFieldType._baseType(fieldType)) {
         case PbFieldType._BOOL_BIT:
           if (value is bool) {
@@ -266,7 +266,7 @@
               'Expected int or stringified int', value);
         case PbFieldType._GROUP_BIT:
         case PbFieldType._MESSAGE_BIT:
-          GeneratedMessage subMessage = fieldInfo.subBuilder();
+          var subMessage = fieldInfo.subBuilder();
           recursionHelper(value, subMessage._fieldSet);
           return subMessage;
         default:
@@ -316,14 +316,14 @@
       return;
     }
 
-    BuilderInfo info = fieldSet._meta;
+    var info = fieldSet._meta;
 
     final wellKnownConverter = info.fromProto3Json;
     if (wellKnownConverter != null) {
       wellKnownConverter(fieldSet._message, json, typeRegistry, context);
     } else {
       if (json is Map) {
-        Map<String, FieldInfo> byName = info.byName;
+        var byName = info.byName;
 
         json.forEach((key, value) {
           if (key is! String) {
@@ -331,7 +331,7 @@
           }
           context.addMapIndex(key);
 
-          FieldInfo fieldInfo = byName[key];
+          var fieldInfo = byName[key];
           if (fieldInfo == null && supportNamesWithUnderscores) {
             // We don't optimize for field names with underscores, instead do a
             // linear search for the index.
@@ -371,8 +371,8 @@
               // `null` is accepted as the empty list [].
               fieldSet._ensureRepeatedField(fieldInfo);
             } else if (value is List) {
-              List values = fieldSet._ensureRepeatedField(fieldInfo);
-              for (int i = 0; i < value.length; i++) {
+              var values = fieldSet._ensureRepeatedField(fieldInfo);
+              for (var i = 0; i < value.length; i++) {
                 final entry = value[i];
                 context.addListIndex(i);
                 values.add(convertProto3JsonValue(entry, fieldInfo));
diff --git a/protobuf/lib/src/protobuf/protobuf_enum.dart b/protobuf/lib/src/protobuf/protobuf_enum.dart
index b020595..8b1b19d 100644
--- a/protobuf/lib/src/protobuf/protobuf_enum.dart
+++ b/protobuf/lib/src/protobuf/protobuf_enum.dart
@@ -38,8 +38,8 @@
   /// Returns a Map for all of the [ProtobufEnum]s in [byIndex], mapping each
   /// [ProtobufEnum]'s [value] to the [ProtobufEnum].
   static Map<int, T> initByValue<T extends ProtobufEnum>(List<T> byIndex) {
-    var byValue = Map<int, T>();
-    for (T v in byIndex) {
+    var byValue = <int, T>{};
+    for (var v in byIndex) {
       byValue[v.value] = v;
     }
     return byValue;
@@ -48,10 +48,13 @@
   // Subclasses will typically have a private constructor and a fixed set of
   // instances, so `Object.operator==()` will work, and does not need to
   // be overridden explicitly.
+  @override
   bool operator ==(Object o);
 
+  @override
   int get hashCode => value;
 
   /// Returns this enum's [name].
+  @override
   String toString() => name;
 }
diff --git a/protobuf/lib/src/protobuf/readonly_message.dart b/protobuf/lib/src/protobuf/readonly_message.dart
index d78ccd6..794f762 100644
--- a/protobuf/lib/src/protobuf/readonly_message.dart
+++ b/protobuf/lib/src/protobuf/readonly_message.dart
@@ -9,49 +9,49 @@
   BuilderInfo get info_;
 
   void addExtension(Extension extension, var value) =>
-      _readonly("addExtension");
+      _readonly('addExtension');
 
-  void clear() => _readonly("clear");
+  void clear() => _readonly('clear');
 
-  void clearExtension(Extension extension) => _readonly("clearExtension");
+  void clearExtension(Extension extension) => _readonly('clearExtension');
 
-  void clearField(int tagNumber) => _readonly("clearField");
+  void clearField(int tagNumber) => _readonly('clearField');
 
   List<T> createRepeatedField<T>(int tagNumber, FieldInfo<T> fi) {
-    _readonly("createRepeatedField");
+    _readonly('createRepeatedField');
     return null; // not reached
   }
 
   void mergeFromBuffer(List<int> input,
           [ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY]) =>
-      _readonly("mergeFromBuffer");
+      _readonly('mergeFromBuffer');
 
   void mergeFromCodedBufferReader(CodedBufferReader input,
           [ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY]) =>
-      _readonly("mergeFromCodedBufferReader");
+      _readonly('mergeFromCodedBufferReader');
 
   void mergeFromJson(String data,
           [ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY]) =>
-      _readonly("mergeFromJson");
+      _readonly('mergeFromJson');
 
   void mergeFromJsonMap(Map<String, dynamic> json,
           [ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY]) =>
-      _readonly("mergeFromJsonMap");
+      _readonly('mergeFromJsonMap');
 
   void mergeFromMessage(GeneratedMessage other) =>
-      _readonly("mergeFromMessage");
+      _readonly('mergeFromMessage');
 
   void mergeUnknownFields(UnknownFieldSet unknownFieldSet) =>
-      _readonly("mergeUnknownFields");
+      _readonly('mergeUnknownFields');
 
   void setExtension(Extension extension, var value) =>
-      _readonly("setExtension");
+      _readonly('setExtension');
 
   void setField(int tagNumber, var value, [int fieldType]) =>
-      _readonly("setField");
+      _readonly('setField');
 
   void _readonly(String methodName) {
-    String messageType = info_.qualifiedMessageName;
+    var messageType = info_.qualifiedMessageName;
     frozenMessageModificationHandler(messageType, methodName);
   }
 }
diff --git a/protobuf/lib/src/protobuf/unknown_field_set.dart b/protobuf/lib/src/protobuf/unknown_field_set.dart
index a136f36..92ffdf4 100644
--- a/protobuf/lib/src/protobuf/unknown_field_set.dart
+++ b/protobuf/lib/src/protobuf/unknown_field_set.dart
@@ -7,8 +7,7 @@
 class UnknownFieldSet {
   static final UnknownFieldSet emptyUnknownFieldSet = UnknownFieldSet()
     .._markReadOnly();
-  final Map<int, UnknownFieldSetField> _fields =
-      Map<int, UnknownFieldSetField>();
+  final Map<int, UnknownFieldSetField> _fields = <int, UnknownFieldSetField>{};
 
   UnknownFieldSet();
 
@@ -51,7 +50,7 @@
 
   bool mergeFieldFromBuffer(int tag, CodedBufferReader input) {
     _ensureWritable('mergeFieldFromBuffer');
-    int number = getTagFieldNumber(tag);
+    var number = getTagFieldNumber(tag);
     switch (getTagWireType(tag)) {
       case WIRETYPE_VARINT:
         mergeVarintField(number, input.readInt64());
@@ -63,7 +62,7 @@
         mergeLengthDelimitedField(number, input.readBytes());
         return true;
       case WIRETYPE_START_GROUP:
-        UnknownFieldSet subGroup = input.readUnknownFieldSetGroup(number);
+        var subGroup = input.readUnknownFieldSetGroup(number);
         mergeGroupField(number, subGroup);
         return true;
       case WIRETYPE_END_GROUP:
@@ -79,7 +78,7 @@
   void mergeFromCodedBufferReader(CodedBufferReader input) {
     _ensureWritable('mergeFromCodedBufferReader');
     while (true) {
-      int tag = input.readTag();
+      var tag = input.readTag();
       if (tag == 0 || !mergeFieldFromBuffer(tag, input)) {
         break;
       }
@@ -88,12 +87,12 @@
 
   void mergeFromUnknownFieldSet(UnknownFieldSet other) {
     _ensureWritable('mergeFromUnknownFieldSet');
-    for (int key in other._fields.keys) {
+    for (var key in other._fields.keys) {
       mergeField(key, other._fields[key]);
     }
   }
 
-  _checkFieldNumber(int number) {
+  void _checkFieldNumber(int number) {
     if (number == 0) {
       throw ArgumentError('Zero is not a valid field number.');
     }
@@ -130,6 +129,7 @@
     return _fields.putIfAbsent(number, () => UnknownFieldSetField());
   }
 
+  @override
   bool operator ==(other) {
     if (other is! UnknownFieldSet) return false;
 
@@ -137,8 +137,9 @@
     return _areMapsEqual(o._fields, _fields);
   }
 
+  @override
   int get hashCode {
-    int hash = 0;
+    var hash = 0;
     _fields.forEach((int number, Object value) {
       hash = 0x1fffffff & ((37 * hash) + number);
       hash = 0x1fffffff & ((53 * hash) + value.hashCode);
@@ -146,12 +147,13 @@
     return hash;
   }
 
+  @override
   String toString() => _toString('');
 
   String _toString(String indent) {
     var stringBuffer = StringBuffer();
 
-    for (int tag in _sorted(_fields.keys)) {
+    for (var tag in _sorted(_fields.keys)) {
       var field = _fields[tag];
       for (var value in field.values) {
         if (value is UnknownFieldSet) {
@@ -173,7 +175,7 @@
   }
 
   void writeToCodedBufferWriter(CodedBufferWriter output) {
-    for (int key in _fields.keys) {
+    for (var key in _fields.keys) {
       _fields[key].writeTo(key, output);
     }
   }
@@ -216,12 +218,13 @@
     _groups = List.unmodifiable(_groups);
   }
 
+  @override
   bool operator ==(other) {
     if (other is! UnknownFieldSetField) return false;
 
     UnknownFieldSetField o = other;
     if (lengthDelimited.length != o.lengthDelimited.length) return false;
-    for (int i = 0; i < lengthDelimited.length; i++) {
+    for (var i = 0; i < lengthDelimited.length; i++) {
       if (!_areListsEqual(o.lengthDelimited[i], lengthDelimited[i])) {
         return false;
       }
@@ -234,10 +237,11 @@
     return true;
   }
 
+  @override
   int get hashCode {
-    int hash = 0;
+    var hash = 0;
     for (final value in lengthDelimited) {
-      for (int i = 0; i < value.length; i++) {
+      for (var i = 0; i < value.length; i++) {
         hash = 0x1fffffff & (hash + value[i]);
         hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
         hash = hash ^ (hash >> 6);
@@ -269,7 +273,7 @@
     ..addAll(groups);
 
   void writeTo(int fieldNumber, CodedBufferWriter output) {
-    write(type, value) {
+    void write(type, value) {
       output.writeField(fieldNumber, type, value);
     }
 
diff --git a/protobuf/lib/src/protobuf/unpack.dart b/protobuf/lib/src/protobuf/unpack.dart
index 6ff9292..3ddbaa5 100644
--- a/protobuf/lib/src/protobuf/unpack.dart
+++ b/protobuf/lib/src/protobuf/unpack.dart
@@ -21,7 +21,7 @@
   //   in the type URL, for example "foo.bar.com/x/y.z" will yield type
   //   name "y.z".
   if (!canUnpackIntoHelper(instance, typeUrl)) {
-    String typeName = instance.info_.qualifiedMessageName;
+    var typeName = instance.info_.qualifiedMessageName;
     throw InvalidProtocolBufferException.wrongAnyMessage(
         _typeNameFromUrl(typeUrl), typeName);
   }
@@ -37,6 +37,6 @@
 }
 
 String _typeNameFromUrl(String typeUrl) {
-  int index = typeUrl.lastIndexOf('/');
+  var index = typeUrl.lastIndexOf('/');
   return index == -1 ? '' : typeUrl.substring(index + 1);
 }
diff --git a/protobuf/lib/src/protobuf/utils.dart b/protobuf/lib/src/protobuf/utils.dart
index d2af1fb..0c7e4e5 100644
--- a/protobuf/lib/src/protobuf/utils.dart
+++ b/protobuf/lib/src/protobuf/utils.dart
@@ -31,12 +31,13 @@
 }
 
 bool _areByteDataEqual(ByteData lhs, ByteData rhs) {
-  asBytes(d) => Uint8List.view(d.buffer, d.offsetInBytes, d.lengthInBytes);
+  Uint8List asBytes(d) =>
+      Uint8List.view(d.buffer, d.offsetInBytes, d.lengthInBytes);
   return _areListsEqual(asBytes(lhs), asBytes(rhs));
 }
 
-@Deprecated("This function was not intended to be public. "
-    "It will be removed from the public api in next major version. ")
+@Deprecated('This function was not intended to be public. '
+    'It will be removed from the public api in next major version. ')
 List<T> sorted<T>(Iterable<T> list) => List.from(list)..sort();
 
 List<T> _sorted<T>(Iterable<T> list) => List.from(list)..sort();
diff --git a/protobuf/test/builder_info_test.dart b/protobuf/test/builder_info_test.dart
index 0d722b5..d3356cb 100644
--- a/protobuf/test/builder_info_test.dart
+++ b/protobuf/test/builder_info_test.dart
@@ -5,7 +5,7 @@
 import 'package:protobuf/protobuf.dart';
 import 'package:test/test.dart';
 
-main() {
+void main() {
   group('className', () {
     final qualifiedmessageName = 'proto.test.TestMessage';
     final expectedMessageName = 'TestMessage';
diff --git a/protobuf/test/codec_test.dart b/protobuf/test/codec_test.dart
index 5b71aff..65d108e 100755
--- a/protobuf/test/codec_test.dart
+++ b/protobuf/test/codec_test.dart
@@ -12,18 +12,19 @@
 
 import 'test_util.dart';
 
-typedef void RoundtripTester<T>(T value, List<int> bytes);
+typedef RoundtripTester<T> = void Function(T value, List<int> bytes);
 
 void main() {
   ByteData makeData(Uint8List bytes) => ByteData.view(bytes.buffer);
 
-  convertToBytes(fieldType) => (value) {
+  Uint8List Function(dynamic) convertToBytes(fieldType) => (value) {
         var writer = CodedBufferWriter()..writeField(0, fieldType, value);
         return writer.toBuffer().sublist(1);
       };
 
   RoundtripTester<T> roundtripTester<T>(
-      {T fromBytes(CodedBufferReader bytes), List<int> toBytes(T value)}) {
+      {T Function(CodedBufferReader bytes) fromBytes,
+      List<int> Function(T value) toBytes}) {
     return (T value, List<int> bytes) {
       expect(fromBytes(CodedBufferReader(bytes)), equals(value));
       expect(toBytes(value), bytes);
@@ -120,7 +121,7 @@
   });
 
   test('testBool', () {
-    readBool(List<int> bytes) => CodedBufferReader(bytes).readBool();
+    bool readBool(List<int> bytes) => CodedBufferReader(bytes).readBool();
 
     expect(readBool([0x00]), isFalse);
     expect(readBool([0x01]), isTrue);
@@ -129,17 +130,17 @@
 
   // Compare two doubles, where NaNs and same-sign inifinities compare equal.
   // For normal values, use equals.
-  doubleEquals(expected) => expected.isNaN
+  Matcher doubleEquals(expected) => expected.isNaN
       ? predicate((x) => x.isNaN, 'NaN expected')
       : equals(expected);
 
   List<int> dataToBytes(ByteData byteData) => Uint8List.view(byteData.buffer);
   final floatToBytes = convertToBytes(PbFieldType.OF);
-  floatToBits(double value) =>
+  int floatToBits(double value) =>
       makeData(floatToBytes(value)).getUint32(0, Endian.little);
 
   void _test32(int bits, double value) {
-    readFloat(int bits) {
+    double readFloat(int bits) {
       var bytes = dataToBytes(ByteData(4)..setUint32(0, bits, Endian.little));
       return CodedBufferReader(bytes).readFloat();
     }
@@ -152,7 +153,7 @@
 
   void _test64(List<int> hilo, double value) {
     // Encode a double to its wire format.
-    ByteData data = makeData(doubleToBytes(value));
+    var data = makeData(doubleToBytes(value));
     var actualHilo = [
       data.getUint32(4, Endian.little),
       data.getUint32(0, Endian.little)
@@ -161,8 +162,8 @@
     expect(actualHilo, hilo);
 
     // Decode it again (round trip).
-    List<int> bytes = dataToBytes(data);
-    double reencoded = CodedBufferReader(bytes).readDouble();
+    var bytes = dataToBytes(data);
+    var reencoded = CodedBufferReader(bytes).readDouble();
     expect(reencoded, doubleEquals(value));
   }
 
diff --git a/protobuf/test/coded_buffer_reader_test.dart b/protobuf/test/coded_buffer_reader_test.dart
index 9cee2f5..2bc9994 100755
--- a/protobuf/test/coded_buffer_reader_test.dart
+++ b/protobuf/test/coded_buffer_reader_test.dart
@@ -39,7 +39,7 @@
       0x65, 0x73 // 115 bytes 14 optional_bytes
     ]);
 
-    testWithList(List<int> inputBuffer) {
+    void testWithList(List<int> inputBuffer) {
       final cis = CodedBufferReader(inputBuffer);
 
       expect(cis.readTag(), makeTag(103, WIRETYPE_VARINT));
@@ -103,9 +103,9 @@
   });
 
   test('testReadMaliciouslyLargeBlob', () {
-    CodedBufferWriter output = CodedBufferWriter();
+    var output = CodedBufferWriter();
 
-    int tag = makeTag(1, WIRETYPE_LENGTH_DELIMITED);
+    var tag = makeTag(1, WIRETYPE_LENGTH_DELIMITED);
     output.writeInt32NoTag(tag);
     output.writeInt32NoTag(0x7FFFFFFF);
     // Pad with a few random bytes.
@@ -113,7 +113,7 @@
     output.writeInt32NoTag(32);
     output.writeInt32NoTag(47);
 
-    CodedBufferReader input = CodedBufferReader(output.toBuffer());
+    var input = CodedBufferReader(output.toBuffer());
     expect(input.readTag(), tag);
 
     expect(() {
@@ -125,15 +125,15 @@
   /// is thrown. Instead, the invalid bytes are replaced with the Unicode
   /// 'replacement character' U+FFFD.
   test('testReadInvalidUtf8', () {
-    CodedBufferReader input = CodedBufferReader([1, 0x80]);
-    String text = input.readString();
+    var input = CodedBufferReader([1, 0x80]);
+    var text = input.readString();
     expect(text.codeUnitAt(0), 0xfffd);
   });
 
   test('testInvalidTag', () {
     // Any tag number which corresponds to field number zero is invalid and
     // should throw InvalidProtocolBufferException.
-    for (int i = 0; i < 8; i++) {
+    for (var i = 0; i < 8; i++) {
       expect(() {
         CodedBufferReader([i]).readTag();
       }, throwsInvalidProtocolBufferException);
diff --git a/protobuf/test/dummy_field_test.dart b/protobuf/test/dummy_field_test.dart
index cc142fa..3612d87 100644
--- a/protobuf/test/dummy_field_test.dart
+++ b/protobuf/test/dummy_field_test.dart
@@ -6,16 +6,18 @@
 import 'package:test/test.dart';
 
 class Message extends GeneratedMessage {
-  get info_ => _i;
-  static final _i = BuilderInfo("Message")
+  @override
+  BuilderInfo get info_ => _i;
+  static final _i = BuilderInfo('Message')
     ..add(0, null, null, null, null, null, null);
+  @override
   Message createEmptyInstance() => Message();
 
   @override
   GeneratedMessage clone() => throw UnimplementedError();
 }
 
-main() {
+void main() {
   test('Has no known fields', () {
     expect(Message().info_.fieldInfo, isEmpty);
   });
diff --git a/protobuf/test/event_test.dart b/protobuf/test/event_test.dart
index 6216418..77c4886 100644
--- a/protobuf/test/event_test.dart
+++ b/protobuf/test/event_test.dart
@@ -5,10 +5,9 @@
 /// Tests event delivery using PbEventMixin.
 library event_test;
 
-import 'dart:typed_data' show Uint8List;
-
 import 'package:protobuf/protobuf.dart'
     show GeneratedMessage, Extension, ExtensionRegistry, PbFieldType;
+import 'package:protobuf/protobuf.dart';
 import 'package:protobuf/src/protobuf/mixins/event_mixin.dart'
     show PbEventMixin, PbFieldChange;
 import 'package:test/test.dart' show test, expect;
@@ -16,14 +15,16 @@
 import 'mock_util.dart' show MockMessage, mockInfo;
 
 class Rec extends MockMessage with PbEventMixin {
-  get info_ => _info;
-  static final _info = mockInfo("Rec", () => Rec());
+  @override
+  BuilderInfo get info_ => _info;
+  static final _info = mockInfo('Rec', () => Rec());
+  @override
   Rec createEmptyInstance() => Rec();
 }
 
-Extension comment = Extension("Rec", "comment", 6, PbFieldType.OS);
+Extension comment = Extension('Rec', 'comment', 6, PbFieldType.OS);
 
-main() {
+void main() {
   test('Events are sent when setting and clearing a non-repeated field', () {
     var log = makeLog();
     var r = Rec();
@@ -84,7 +85,7 @@
     var log = makeLog();
     var r = Rec()
       ..val = 123
-      ..str = "hello"
+      ..str = 'hello'
       ..child = Rec()
       ..int32s.add(456);
 
@@ -99,8 +100,8 @@
     checkLog(log, [
       [
         [1, 123, 42],
-        [2, "hello", ''],
-        [3, "<msg>", "<msg>"],
+        [2, 'hello', ''],
+        [3, '<msg>', '<msg>'],
         [
           4,
           [456],
@@ -114,7 +115,7 @@
     var log = makeLog();
     var src = Rec()
       ..val = 123
-      ..str = "hello"
+      ..str = 'hello'
       ..child = Rec()
       ..int32s.add(456);
 
@@ -129,8 +130,8 @@
     checkLog(log, [
       [
         [1, 42, 123],
-        [2, '', "hello"],
-        [3, "<msg>", "<msg>"],
+        [2, '', 'hello'],
+        [3, '<msg>', '<msg>'],
         [
           4,
           [],
@@ -155,8 +156,8 @@
     checkLog(log, [
       [
         [1, 42, 123],
-        [2, '', "hello"],
-        [3, "<msg>", "<msg>"],
+        [2, '', 'hello'],
+        [3, '<msg>', '<msg>'],
         [
           4,
           [],
@@ -169,9 +170,9 @@
   test('Events are sent when merging binary', () {
     var log = makeLog();
 
-    Uint8List bytes = (Rec()
+    var bytes = (Rec()
           ..val = 123
-          ..str = "hello"
+          ..str = 'hello'
           ..child = Rec()
           ..int32s.add(456))
         .writeToBuffer();
@@ -189,8 +190,8 @@
     checkLog(log, [
       [
         [1, 42, 123],
-        [2, '', "hello"],
-        [3, "<msg>", "<msg>"],
+        [2, '', 'hello'],
+        [3, '<msg>', '<msg>'],
         [
           4,
           [],
@@ -208,58 +209,58 @@
     });
 
     final tag = comment.tagNumber;
-    setComment(String value) {
+    void setComment(String value) {
       r.setExtension(comment, value);
       expect(r.getExtension(comment), value);
       r.deliverChanges();
-      checkLogOnce(log, [tag, "", value]);
+      checkLogOnce(log, [tag, '', value]);
     }
 
-    clear(String expected) {
+    void clear(String expected) {
       r.clear();
       r.deliverChanges();
-      checkLogOnce(log, [tag, expected, ""]);
+      checkLogOnce(log, [tag, expected, '']);
     }
 
-    setComment("hello");
-    clear("hello");
+    setComment('hello');
+    clear('hello');
 
-    setComment("hello");
-    r.setField(6, "hi");
+    setComment('hello');
+    r.setField(6, 'hi');
     r.deliverChanges();
-    checkLogOnce(log, [tag, "hello", "hi"]);
-    clear("hi");
+    checkLogOnce(log, [tag, 'hello', 'hi']);
+    clear('hi');
 
-    setComment("hello");
+    setComment('hello');
     r.clearExtension(comment);
     r.deliverChanges();
-    checkLogOnce(log, [tag, "hello", ""]);
+    checkLogOnce(log, [tag, 'hello', '']);
 
-    setComment("hello");
+    setComment('hello');
     r.clearField(comment.tagNumber);
     r.deliverChanges();
-    checkLogOnce(log, [tag, "hello", ""]);
+    checkLogOnce(log, [tag, 'hello', '']);
 
     var registry = ExtensionRegistry()..add(comment);
     r.mergeFromJson('{"$tag": "hello"}', registry);
-    expect(r.getExtension(comment), "hello");
+    expect(r.getExtension(comment), 'hello');
     r.deliverChanges();
-    checkLogOnce(log, [tag, "", "hello"]);
-    clear("hello");
+    checkLogOnce(log, [tag, '', 'hello']);
+    clear('hello');
 
-    var src = Rec()..setExtension(comment, "hello");
+    var src = Rec()..setExtension(comment, 'hello');
     r.mergeFromMessage(src);
-    expect(r.getExtension(comment), "hello");
+    expect(r.getExtension(comment), 'hello');
     r.deliverChanges();
-    checkLogOnce(log, [tag, "", "hello"]);
-    clear("hello");
+    checkLogOnce(log, [tag, '', 'hello']);
+    clear('hello');
 
-    Uint8List bytes = src.writeToBuffer();
+    var bytes = src.writeToBuffer();
     r.mergeFromBuffer(bytes, registry);
-    expect(r.getExtension(comment), "hello");
+    expect(r.getExtension(comment), 'hello');
     r.deliverChanges();
-    checkLogOnce(log, [tag, "", "hello"]);
-    clear("hello");
+    checkLogOnce(log, [tag, '', 'hello']);
+    clear('hello');
   });
 }
 
@@ -291,9 +292,9 @@
 }
 
 List toTuple(PbFieldChange fc) {
-  fixValue(v) {
+  dynamic fixValue(v) {
     if (v is GeneratedMessage) {
-      return "<msg>";
+      return '<msg>';
     }
     return v;
   }
diff --git a/protobuf/test/json_test.dart b/protobuf/test/json_test.dart
index 2ec2d42..ce2f792 100644
--- a/protobuf/test/json_test.dart
+++ b/protobuf/test/json_test.dart
@@ -9,14 +9,14 @@
 
 import 'mock_util.dart' show T;
 
-main() {
-  T example = T()
+void main() {
+  var example = T()
     ..val = 123
-    ..str = "hello"
+    ..str = 'hello'
     ..int32s.addAll(<int>[1, 2, 3]);
 
   test('testWriteToJson', () {
-    String json = example.writeToJson();
+    var json = example.writeToJson();
     checkJsonMap(jsonDecode(json));
   });
 
@@ -39,7 +39,7 @@
 
   test('testMergeFromJsonMap', () {
     var t = T();
-    t.mergeFromJsonMap({"1": 123, "2": "hello"});
+    t.mergeFromJsonMap({'1': 123, '2': 'hello'});
     checkMessage(t);
   });
 
@@ -47,7 +47,7 @@
     final value = Int64.parseInt('1234567890123456789');
     final t = T()..int64 = value;
     final encoded = t.writeToJsonMap();
-    expect(encoded["5"], "$value");
+    expect(encoded['5'], '$value');
     final decoded = T()..mergeFromJsonMap(encoded);
     expect(decoded.int64, value);
   });
@@ -58,20 +58,20 @@
       ..int64 = value
       ..freeze();
     final encoded = frozen.writeToJsonMap();
-    expect(encoded["5"], "$value");
+    expect(encoded['5'], '$value');
     final decoded = T()..mergeFromJsonMap(encoded);
     expect(decoded.int64, value);
   });
 }
 
-checkJsonMap(Map m) {
+void checkJsonMap(Map m) {
   expect(m.length, 3);
-  expect(m["1"], 123);
-  expect(m["2"], "hello");
-  expect(m["4"], [1, 2, 3]);
+  expect(m['1'], 123);
+  expect(m['2'], 'hello');
+  expect(m['4'], [1, 2, 3]);
 }
 
-checkMessage(T t) {
+void checkMessage(T t) {
   expect(t.val, 123);
-  expect(t.str, "hello");
+  expect(t.str, 'hello');
 }
diff --git a/protobuf/test/json_vm_test.dart b/protobuf/test/json_vm_test.dart
index 6f3c8ae..7c539c5 100644
--- a/protobuf/test/json_vm_test.dart
+++ b/protobuf/test/json_vm_test.dart
@@ -9,12 +9,12 @@
 
 import 'mock_util.dart' show T;
 
-main() {
+void main() {
   test('testInt64JsonEncoding', () {
     final value = Int64(1234567890123456789);
     final t = T()..int64 = value;
     final encoded = t.writeToJsonMap();
-    expect(encoded["5"], "$value");
+    expect(encoded['5'], '$value');
     final decoded = T()..mergeFromJsonMap(encoded);
     expect(decoded.int64, value);
   });
diff --git a/protobuf/test/list_test.dart b/protobuf/test/list_test.dart
index bced431..aa324cc 100755
--- a/protobuf/test/list_test.dart
+++ b/protobuf/test/list_test.dart
@@ -15,11 +15,11 @@
 final badArgument = throwsA(invalidArgumentException);
 
 // Suppress an analyzer warning for a deliberate type mismatch.
-cast(x) => x;
+T cast<T>(x) => x;
 
 void main() {
   test('testPbList handles basic operations', () {
-    PbList<int> lb1 = PbList();
+    var lb1 = PbList<int>();
     expect(lb1, []);
 
     lb1.add(1);
@@ -45,14 +45,14 @@
     expect(last, 99);
     expect(lb1.last, 6);
 
-    int count = 0;
+    var count = 0;
     lb1.forEach((int i) {
       count += i;
     });
     expect(count, 108);
 
     bool isEven(int i) => i % 2 == 0;
-    List<int> evens = List<int>.from(lb1.where(isEven));
+    var evens = List<int>.from(lb1.where(isEven));
     expect(evens, [0, 2, 6]);
 
     expect(lb1.any(isEven), isTrue);
@@ -65,7 +65,7 @@
   });
 
   test('PbList handles range operations', () {
-    PbList<int> lb2 = PbList();
+    var lb2 = PbList<int>();
 
     lb2.addAll([1, 2, 3, 4, 5, 6, 7, 8, 9]);
     expect(lb2.sublist(3, 7), [4, 5, 6, 7]);
diff --git a/protobuf/test/map_mixin_test.dart b/protobuf/test/map_mixin_test.dart
index 7200517..ec60cbb 100644
--- a/protobuf/test/map_mixin_test.dart
+++ b/protobuf/test/map_mixin_test.dart
@@ -9,6 +9,7 @@
 
 import 'dart:collection' show MapMixin;
 
+import 'package:protobuf/protobuf.dart';
 import 'package:protobuf/src/protobuf/mixins/map_mixin.dart';
 import 'package:test/test.dart' show expect, same, test, throwsArgumentError;
 
@@ -16,32 +17,34 @@
 
 // A minimal protobuf implementation compatible with PbMapMixin.
 class Rec extends MockMessage with MapMixin, PbMapMixin {
-  get info_ => _info;
-  static final _info = mockInfo("Rec", () => Rec());
+  @override
+  BuilderInfo get info_ => _info;
+  static final _info = mockInfo('Rec', () => Rec());
+  @override
   Rec createEmptyInstance() => Rec();
 
   @override
-  String toString() => "Rec(${val}, \"${str}\")";
+  String toString() => 'Rec(${val}, "${str}")';
 }
 
-main() {
+void main() {
   test('PbMapMixin methods return default field values', () {
     var r = Rec();
 
     expect(r.isEmpty, false);
     expect(r.isNotEmpty, true);
-    expect(r.keys, ["val", "str", "child", "int32s", "int64"]);
+    expect(r.keys, ['val', 'str', 'child', 'int32s', 'int64']);
 
-    expect(r["val"], 42);
-    expect(r["str"], "");
-    expect(r["child"].runtimeType, Rec);
-    expect(r["child"].toString(), 'Rec(42, "")');
-    expect(r["int32s"], []);
+    expect(r['val'], 42);
+    expect(r['str'], '');
+    expect(r['child'].runtimeType, Rec);
+    expect(r['child'].toString(), 'Rec(42, "")');
+    expect(r['int32s'], []);
 
     var v = r.values;
     expect(v.length, 5);
     expect(v.first, 42);
-    expect(v.toList()[1], "");
+    expect(v.toList()[1], '');
     expect(v.toList()[3].toString(), '[]');
     expect(v.last, 0);
   });
@@ -49,23 +52,23 @@
   test('operator []= sets record fields', () {
     var r = Rec();
 
-    r["val"] = 123;
+    r['val'] = 123;
     expect(r.val, 123);
-    expect(r["val"], 123);
+    expect(r['val'], 123);
 
-    r["str"] = "hello";
-    expect(r.str, "hello");
-    expect(r["str"], "hello");
+    r['str'] = 'hello';
+    expect(r.str, 'hello');
+    expect(r['str'], 'hello');
 
     var child = Rec();
-    r["child"] = child;
+    r['child'] = child;
     expect(r.child, same(child));
-    expect(r["child"], same(child));
+    expect(r['child'], same(child));
 
-    expect(() => r["int32s"] = 123, throwsArgumentError);
-    r["int32s"].add(123);
-    expect(r["int32s"], [123]);
-    expect(r["int32s"], same(r["int32s"]));
+    expect(() => r['int32s'] = 123, throwsArgumentError);
+    r['int32s'].add(123);
+    expect(r['int32s'], [123]);
+    expect(r['int32s'], same(r['int32s']));
   });
 
   test('operator== and hashCode work for Map mixin', () {
@@ -75,7 +78,7 @@
     expect({} == a, false);
 
     var b = Rec();
-    expect(a.info_ == b.info_, true, reason: "BuilderInfo should be the same");
+    expect(a.info_ == b.info_, true, reason: 'BuilderInfo should be the same');
     expect(a == b, true);
     expect(a.hashCode, b.hashCode);
 
diff --git a/protobuf/test/message_test.dart b/protobuf/test/message_test.dart
index 19276ad..bce8289 100644
--- a/protobuf/test/message_test.dart
+++ b/protobuf/test/message_test.dart
@@ -5,36 +5,40 @@
 /// Tests for GeneratedMessage methods.
 library message_test;
 
+import 'package:matcher/src/interfaces.dart';
+import 'package:protobuf/protobuf.dart';
 import 'package:test/test.dart' show test, expect, predicate, throwsA;
 
 import 'mock_util.dart' show MockMessage, mockInfo;
 
 class Rec extends MockMessage {
-  get info_ => _info;
-  static final _info = mockInfo("Rec", () => Rec());
+  @override
+  BuilderInfo get info_ => _info;
+  static final _info = mockInfo('Rec', () => Rec());
+  @override
   Rec createEmptyInstance() => Rec();
 }
 
-throwsError(Type expectedType, String expectedMessage) =>
+Matcher throwsError(Type expectedType, String expectedMessage) =>
     throwsA(predicate((x) {
       expect(x.runtimeType, expectedType);
       expect(x.message, expectedMessage);
       return true;
     }));
 
-main() {
+void main() {
   test('getField with invalid tag throws exception', () {
     var r = Rec();
     expect(() {
       r.getField(123);
-    }, throwsError(ArgumentError, "tag 123 not defined in Rec"));
+    }, throwsError(ArgumentError, 'tag 123 not defined in Rec'));
   });
 
   test('getDefaultForField with invalid tag throws exception', () {
     var r = Rec();
     expect(() {
       r.getDefaultForField(123);
-    }, throwsError(ArgumentError, "tag 123 not defined in Rec"));
+    }, throwsError(ArgumentError, 'tag 123 not defined in Rec'));
   });
 
   test('operator== and hashCode works for frozen message', () {
@@ -69,7 +73,7 @@
     expect(a == a, true);
 
     var b = Rec();
-    expect(a.info_ == b.info_, true, reason: "BuilderInfo should be the same");
+    expect(a.info_ == b.info_, true, reason: 'BuilderInfo should be the same');
     expect(a == b, true);
     expect(a.hashCode, b.hashCode);
 
diff --git a/protobuf/test/mock_util.dart b/protobuf/test/mock_util.dart
index 8b4025a..2153dfc 100644
--- a/protobuf/test/mock_util.dart
+++ b/protobuf/test/mock_util.dart
@@ -10,22 +10,23 @@
 
 BuilderInfo mockInfo(String className, CreateBuilderFunc create) {
   return BuilderInfo(className)
-    ..a(1, "val", PbFieldType.O3, defaultOrMaker: 42)
-    ..a(2, "str", PbFieldType.OS)
-    ..a(3, "child", PbFieldType.OM, defaultOrMaker: create, subBuilder: create)
-    ..p<int>(4, "int32s", PbFieldType.P3)
-    ..a(5, "int64", PbFieldType.O6);
+    ..a(1, 'val', PbFieldType.O3, defaultOrMaker: 42)
+    ..a(2, 'str', PbFieldType.OS)
+    ..a(3, 'child', PbFieldType.OM, defaultOrMaker: create, subBuilder: create)
+    ..p<int>(4, 'int32s', PbFieldType.P3)
+    ..a(5, 'int64', PbFieldType.O6);
 }
 
 /// A minimal protobuf implementation for testing.
 abstract class MockMessage extends GeneratedMessage {
   // subclasses must provide these
+  @override
   BuilderInfo get info_;
 
   int get val => $_get(0, 42);
   set val(x) => setField(1, x);
 
-  String get str => $_getS(1, "");
+  String get str => $_getS(1, '');
   set str(x) => $_setString(1, x);
 
   MockMessage get child => $_getN(2);
@@ -36,14 +37,17 @@
   Int64 get int64 => $_get(4, Int64(0));
   set int64(x) => setField(5, x);
 
-  clone() {
-    CreateBuilderFunc create = info_.byName["child"].subBuilder;
+  @override
+  GeneratedMessage clone() {
+    var create = info_.byName['child'].subBuilder;
     return create()..mergeFromMessage(this);
   }
 }
 
 class T extends MockMessage {
-  get info_ => _info;
-  static final _info = mockInfo("T", () => T());
+  @override
+  BuilderInfo get info_ => _info;
+  static final _info = mockInfo('T', () => T());
+  @override
   T createEmptyInstance() => T();
 }
diff --git a/protobuf/test/readonly_message_test.dart b/protobuf/test/readonly_message_test.dart
index b6fab67..92203ec 100644
--- a/protobuf/test/readonly_message_test.dart
+++ b/protobuf/test/readonly_message_test.dart
@@ -16,7 +16,7 @@
         frozenMessageModificationHandler,
         defaultFrozenMessageModificationHandler;
 
-throwsError(Type expectedType, Matcher expectedMessage) =>
+Matcher throwsError(Type expectedType, Matcher expectedMessage) =>
     throwsA(predicate((x) {
       expect(x.runtimeType, expectedType);
       expect(x.message, expectedMessage);
@@ -26,6 +26,7 @@
 class Rec extends GeneratedMessage {
   static Rec getDefault() => Rec()..freeze();
   static Rec create() => Rec();
+  @override
   Rec createEmptyInstance() => Rec();
 
   @override
@@ -48,14 +49,15 @@
   @override
   Rec clone() => Rec()..mergeFromMessage(this);
 
+  @override
   Rec copyWith(void Function(Rec) updates) =>
       super.copyWith((message) => updates(message as Rec));
 }
 
-main() {
+void main() {
   test('can write a read-only message', () {
     expect(Rec.getDefault().writeToBuffer(), []);
-    expect(Rec.getDefault().writeToJson(), "{}");
+    expect(Rec.getDefault().writeToJson(), '{}');
   });
 
   test("can't merge to a read-only message", () {
@@ -75,7 +77,7 @@
   test('can set a field on a read-only message with a custom read-only handler',
       () {
     try {
-      int called = 0;
+      var called = 0;
 
       frozenMessageModificationHandler =
           (String messageName, [String methodName]) {
@@ -168,10 +170,10 @@
         throwsError(
             UnsupportedError,
             equals(
-                "Attempted to call clear on a read-only message (UnknownFieldSet)")));
+                'Attempted to call clear on a read-only message (UnknownFieldSet)')));
   });
 
-  test("can rebuild a frozen message with merge", () {
+  test('can rebuild a frozen message with merge', () {
     final orig = Rec.create()
       ..value = 10
       ..freeze();
@@ -181,7 +183,7 @@
     expect(rebuilt.value, 7);
   });
 
-  test("can set a field while rebuilding a frozen message", () {
+  test('can set a field while rebuilding a frozen message', () {
     final orig = Rec.create()
       ..value = 10
       ..freeze();
@@ -191,7 +193,7 @@
     expect(rebuilt.value, 7);
   });
 
-  test("can clear while rebuilding a frozen message", () {
+  test('can clear while rebuilding a frozen message', () {
     final orig = Rec.create()
       ..value = 10
       ..freeze();
@@ -202,7 +204,7 @@
     expect(rebuilt.hasValue(), false);
   });
 
-  test("can clear a field while rebuilding a frozen message", () {
+  test('can clear a field while rebuilding a frozen message', () {
     final orig = Rec.create()
       ..value = 10
       ..freeze();
@@ -213,7 +215,7 @@
     expect(rebuilt.hasValue(), false);
   });
 
-  test("can modify repeated fields while rebuilding a frozen message", () {
+  test('can modify repeated fields while rebuilding a frozen message', () {
     var orig = Rec.create()
       ..ints.add(10)
       ..freeze();
@@ -238,7 +240,7 @@
     expect(rebuilt.sub.length, 2);
   });
 
-  test("cannot modify sub-messages while rebuilding a frozen message", () {
+  test('cannot modify sub-messages while rebuilding a frozen message', () {
     final subMessage = Rec.create()..value = 1;
     final orig = Rec.create()
       ..sub.add(Rec.create()..sub.add(subMessage))
@@ -262,7 +264,7 @@
     expect(rebuilt.sub[0].sub[0].value, 2);
   });
 
-  test("can modify unknown fields while rebuilding a frozen message", () {
+  test('can modify unknown fields while rebuilding a frozen message', () {
     final orig = Rec.create()
       ..unknownFields.addField(20, UnknownFieldSetField()..fixed32s.add(1));
     final rebuilt = orig.copyWith((m) => m.unknownFields.clear());
diff --git a/protobuf/test/test_util.dart b/protobuf/test/test_util.dart
index 0d53917..c01aff5 100644
--- a/protobuf/test/test_util.dart
+++ b/protobuf/test/test_util.dart
@@ -8,11 +8,11 @@
 import 'package:test/test.dart';
 
 Int64 make64(int lo, [int hi]) {
-  if (hi == null) hi = lo < 0 ? -1 : 0;
+  hi ??= lo < 0 ? -1 : 0;
   return Int64.fromInts(hi, lo);
 }
 
-expect64(int lo, [int hi]) {
-  final Int64 expected = make64(lo, hi);
+Matcher expect64(int lo, [int hi]) {
+  final expected = make64(lo, hi);
   return predicate((Int64 actual) => actual == expected);
 }
