[kernel] Add annotate_overrides lint

Change-Id: I1fffd60eeb14ecd6d5ba30cd584a75ddd4a8acfc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212005
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/kernel/analysis_options.yaml b/pkg/kernel/analysis_options.yaml
index 68fdd50..d9d722e 100644
--- a/pkg/kernel/analysis_options.yaml
+++ b/pkg/kernel/analysis_options.yaml
@@ -16,4 +16,5 @@
     - package_api_docs
     - lines_longer_than_80_chars
     - unrelated_type_equality_checks
+    - annotate_overrides
     # - always_specify_types
diff --git a/pkg/kernel/bin/count_breakdown.dart b/pkg/kernel/bin/count_breakdown.dart
index 839ab42..b704879 100755
--- a/pkg/kernel/bin/count_breakdown.dart
+++ b/pkg/kernel/bin/count_breakdown.dart
@@ -28,6 +28,8 @@
 
 class TypeCounter extends RecursiveVisitor {
   Map<String, int> _typeCounts = <String, int>{};
+
+  @override
   defaultNode(Node node) {
     String key = node.runtimeType.toString();
     _typeCounts[key] = (_typeCounts[key] ??= 0) + 1;
diff --git a/pkg/kernel/bin/size_breakdown.dart b/pkg/kernel/bin/size_breakdown.dart
index af98f8a..a5faac2 100755
--- a/pkg/kernel/bin/size_breakdown.dart
+++ b/pkg/kernel/bin/size_breakdown.dart
@@ -43,6 +43,7 @@
   int constantTableSize = 0;
   Map<Uri, int> librarySizes = {};
 
+  @override
   int readOffset() {
     offsetsSize -= byteOffset;
     int result = super.readOffset();
@@ -50,18 +51,21 @@
     return result;
   }
 
+  @override
   void readStringTable() {
     stringTableSize -= byteOffset;
     super.readStringTable();
     stringTableSize += byteOffset;
   }
 
+  @override
   void readLinkTable(CanonicalName linkRoot) {
     linkTableSize -= byteOffset;
     super.readLinkTable(linkRoot);
     linkTableSize += byteOffset;
   }
 
+  @override
   Map<Uri, Source> readUriToSource({required bool readCoverage}) {
     uriToSourceSize -= byteOffset;
     Map<Uri, Source> result = super.readUriToSource(readCoverage: readCoverage);
@@ -69,12 +73,14 @@
     return result;
   }
 
+  @override
   void readConstantTable() {
     constantTableSize -= byteOffset;
     super.readConstantTable();
     constantTableSize += byteOffset;
   }
 
+  @override
   Library readLibrary(Component component, int endOffset) {
     int size = -byteOffset;
     var result = super.readLibrary(component, endOffset);
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7edd205..99992d8 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -101,6 +101,7 @@
   ///
   /// The data is generally bare-bones, but can easily be updated for your
   /// specific debugging needs.
+  @override
   String toString();
 
   /// Returns the textual representation of this node for use in debugging.
@@ -138,6 +139,7 @@
 /// This is anything other than [Name] and [DartType] nodes.
 abstract class TreeNode extends Node {
   static int _hashCounter = 0;
+  @override
   final int hashCode = _hashCounter = (_hashCounter + 1) & 0x3fffffff;
   static const int noOffset = -1;
 
@@ -149,8 +151,11 @@
   /// not available (this is the default if none is specifically set).
   int fileOffset = noOffset;
 
+  @override
   R accept<R>(TreeVisitor<R> v);
+  @override
   R accept1<R, A>(TreeVisitor1<R, A> v, A arg);
+  @override
   void visitChildren(Visitor v);
   void transformChildren(Transformer v);
   void transformOrRemoveChildren(RemovingTransformer v);
@@ -608,10 +613,12 @@
     printer.write(libraryNameToString(this));
   }
 
+  @override
   Location? _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
 
+  @override
   String leakingDebugToString() => astToText.debugLibraryToString(this);
 }
 
@@ -1510,6 +1517,7 @@
   String name;
 
   /// The URI of the source file this class was loaded from.
+  @override
   Uri fileUri;
 
   /// Type parameters declared on the extension.
@@ -2262,6 +2270,7 @@
   /// The `FunctionNode.body` is `null` or a synthesized [ConstructorInvocation]
   /// of the [targetReference] constructor using the [typeArguments] and
   /// [VariableGet] of the parameters.
+  @override
   FunctionNode function;
 
   RedirectingFactory(this.targetReference,
@@ -5051,6 +5060,7 @@
   static const int FlagBoundsSafe = 1 << 1;
 
   final InstanceAccessKind kind;
+  @override
   Expression receiver;
 
   @override
@@ -5224,6 +5234,7 @@
   static const int FlagBoundsSafe = 1 << 1;
 
   final InstanceAccessKind kind;
+  @override
   Expression receiver;
 
   @override
@@ -6820,6 +6831,7 @@
 class FileUriExpression extends Expression implements FileUriNode {
   /// The URI of the source file in which the subexpression is located.
   /// Can be different from the file containing the [FileUriExpression].
+  @override
   Uri fileUri;
 
   Expression expression;
@@ -6905,6 +6917,7 @@
         : (flags & ~FlagForNonNullableByDefault);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -7322,6 +7335,7 @@
   @override
   Object? get value => null;
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -7434,6 +7448,7 @@
 }
 
 class ThisExpression extends Expression {
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -7827,12 +7842,14 @@
     return "MapEntry(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     toTextInternal(printer);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer) {
     printer.writeExpression(key);
     printer.write(': ');
@@ -10365,6 +10382,7 @@
   @override
   R accept<R>(DartTypeVisitor<R> v);
 
+  @override
   R accept1<R, A>(DartTypeVisitor1<R, A> v, A arg);
 
   @override
@@ -11020,6 +11038,7 @@
 ///
 /// The underlying type can be extracted using [unalias].
 class TypedefType extends DartType {
+  @override
   final Nullability declaredNullability;
   final Reference typedefReference;
   final List<DartType> typeArguments;
@@ -11124,6 +11143,7 @@
 class FutureOrType extends DartType {
   final DartType typeArgument;
 
+  @override
   final Nullability declaredNullability;
 
   FutureOrType(this.typeArgument, this.declaredNullability);
@@ -11356,12 +11376,14 @@
     return "NamedType(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     printer.writeNamedType(this);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer) {
     if (isRequired) {
       printer.write("required ");
@@ -12100,11 +12122,13 @@
 
   Class get classNode => className.asClass;
 
+  @override
   R accept<R>(Visitor<R> v) => v.visitSupertype(this);
 
   @override
   R accept1<R, A>(Visitor1<R, A> v, A arg) => v.visitSupertype(this, arg);
 
+  @override
   visitChildren(Visitor v) {
     classNode.acceptReference(v);
     visitList(typeArguments, v);
@@ -12114,6 +12138,7 @@
     return new InterfaceType(classNode, Nullability.legacy, typeArguments);
   }
 
+  @override
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
     if (other is Supertype) {
@@ -12128,6 +12153,7 @@
     }
   }
 
+  @override
   int get hashCode {
     int hash = 0x3fffffff & className.hashCode;
     for (int i = 0; i < typeArguments.length; ++i) {
@@ -12663,6 +12689,7 @@
 
   Class get classNode => classReference.asClass;
 
+  @override
   visitChildren(Visitor v) {
     classReference.asClass.acceptReference(v);
     visitList(typeArguments, v);
@@ -12674,6 +12701,7 @@
     }
   }
 
+  @override
   R accept<R>(ConstantVisitor<R> v) => v.visitInstanceConstant(this);
 
   @override
@@ -12894,13 +12922,16 @@
   @override
   String toString() => 'ConstructorTearOffConstant(${toStringInternal()})';
 
+  @override
   int get hashCode => targetReference.hashCode;
 
+  @override
   bool operator ==(Object other) {
     return other is ConstructorTearOffConstant &&
         other.targetReference == targetReference;
   }
 
+  @override
   FunctionType getType(StaticTypeContext context) {
     return function.computeFunctionType(context.nonNullable);
   }
@@ -12953,13 +12984,16 @@
   String toString() =>
       'RedirectingFactoryTearOffConstant(${toStringInternal()})';
 
+  @override
   int get hashCode => targetReference.hashCode;
 
+  @override
   bool operator ==(Object other) {
     return other is RedirectingFactoryTearOffConstant &&
         other.targetReference == targetReference;
   }
 
+  @override
   FunctionType getType(StaticTypeContext context) {
     return function.computeFunctionType(context.nonNullable);
   }
@@ -12970,6 +13004,7 @@
   final TearOffConstant tearOffConstant;
   final List<DartType> types;
 
+  @override
   late final int hashCode = _computeHashCode();
 
   TypedefTearOffConstant(this.parameters, this.tearOffConstant, this.types);
@@ -13006,6 +13041,7 @@
   @override
   String toString() => 'TypedefTearOffConstant(${toStringInternal()})';
 
+  @override
   bool operator ==(Object other) {
     if (other is! TypedefTearOffConstant) return false;
     if (other.tearOffConstant != tearOffConstant) return false;
@@ -13044,6 +13080,7 @@
     return hash;
   }
 
+  @override
   DartType getType(StaticTypeContext context) {
     FunctionType type = tearOffConstant.getType(context) as FunctionType;
     FreshTypeParameters freshTypeParameters =
@@ -13101,6 +13138,7 @@
     return other is TypeLiteralConstant && other.type == type;
   }
 
+  @override
   DartType getType(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.typeRawType(context.nonNullable);
 }
@@ -13132,6 +13170,7 @@
   R acceptReference1<R, A>(Visitor1<R, A> v, A arg) =>
       v.visitUnevaluatedConstantReference(this, arg);
 
+  @override
   DartType getType(StaticTypeContext context) =>
       expression.getStaticType(context);
 
@@ -13339,6 +13378,7 @@
     // TODO(johnniwinther): Implement this.
   }
 
+  @override
   String leakingDebugToString() => astToText.debugComponentToString(this);
 }
 
@@ -13351,6 +13391,7 @@
 
   Location(this.file, this.line, this.column);
 
+  @override
   String toString() => '$file:$line:$column';
 }
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 5cc6168..87e536d 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -21,6 +21,7 @@
   ParseError(this.message,
       {required this.filename, required this.byteIndex, required this.path});
 
+  @override
   String toString() => '$filename:$byteIndex: $message at $path';
 }
 
@@ -30,6 +31,7 @@
 
   InvalidKernelVersionError(this.filename, this.version);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write('Unexpected Kernel Format Version ${version} '
@@ -46,6 +48,7 @@
 
   InvalidKernelSdkVersionError(this.version);
 
+  @override
   String toString() {
     return 'Unexpected Kernel SDK Version ${version} '
         '(expected ${expectedSdkHash}).';
@@ -57,6 +60,7 @@
 
   CompilationModeError(this.message);
 
+  @override
   String toString() => "CompilationModeError[$message]";
 }
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 35857eb..c8df796 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -83,15 +83,18 @@
     return index!;
   }
 
+  @override
   void writeByte(int byte) {
     assert((byte & 0xFF) == byte);
     _sink.addByte(byte);
   }
 
+  @override
   void writeBytes(List<int> bytes) {
     _sink.addBytes(bytes);
   }
 
+  @override
   @pragma("vm:prefer-inline")
   void writeUInt30(int value) {
     assert(value >= 0 && value >> 30 == 0);
@@ -105,16 +108,19 @@
     }
   }
 
+  @override
   void writeUInt32(int value) {
     _sink.addByte4((value >> 24) & 0xFF, (value >> 16) & 0xFF,
         (value >> 8) & 0xFF, value & 0xFF);
   }
 
+  @override
   void writeByteList(List<int> bytes) {
     writeUInt30(bytes.length);
     writeBytes(bytes);
   }
 
+  @override
   int getBufferOffset() {
     return _sink.offset;
   }
@@ -166,6 +172,7 @@
     }
   }
 
+  @override
   void writeStringReference(String string) {
     writeUInt30(stringIndexer.put(string));
   }
@@ -174,6 +181,7 @@
     writeList(strings, writeStringReference);
   }
 
+  @override
   void writeConstantReference(Constant constant) {
     writeUInt30(_constantIndexer.put(constant));
   }
@@ -296,6 +304,7 @@
     _typeParameterIndexer = oldTypeParameterIndexer;
   }
 
+  @override
   void writeDartType(DartType type) {
     type.accept(this);
   }
@@ -413,6 +422,7 @@
     }
   }
 
+  @override
   void writeNode(Node node) {
     if (_metadataSubsections != null) {
       _writeNodeMetadata(node);
@@ -951,6 +961,7 @@
     _canonicalNameList.add(node);
   }
 
+  @override
   void writeNullAllowedCanonicalNameReference(CanonicalName? name) {
     if (name == null) {
       writeUInt30(0);
@@ -999,6 +1010,7 @@
     writeNonNullCanonicalNameReference(getCanonicalNameOfClass(class_));
   }
 
+  @override
   void writeName(Name node) {
     if (_metadataSubsections != null) {
       _writeNodeMetadata(node);
@@ -1119,6 +1131,7 @@
     writeNodeList(node.combinators);
   }
 
+  @override
   void visitCombinator(Combinator node) {
     writeByte(node.isShow ? 1 : 0);
     writeStringReferenceList(node.names);
@@ -1140,6 +1153,7 @@
     writeStringReference(node.partUri);
   }
 
+  @override
   void visitTypedef(Typedef node) {
     enterScope(memberScope: true);
     writeNonNullCanonicalNameReference(getCanonicalNameOfTypedef(node));
@@ -2843,6 +2857,7 @@
     return index[constant] = newIndex;
   }
 
+  @override
   defaultConstantReference(Constant node) {
     put(node);
   }
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 6d7bd11..bd151c1 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -263,6 +263,7 @@
     }
   }
 
+  @override
   String toString() => _parent == null ? 'root' : '$parent::$name';
   String toStringInternal() {
     if (isRoot) return "";
@@ -438,6 +439,7 @@
     _node = node;
   }
 
+  @override
   String toString() {
     return "Reference to ${toStringInternal()}";
   }
@@ -597,12 +599,14 @@
 
   CanonicalNameError(this.message);
 
+  @override
   String toString() => 'CanonicalNameError: $message';
 }
 
 class CanonicalNameSdkError extends CanonicalNameError {
   CanonicalNameSdkError(String message) : super(message);
 
+  @override
   String toString() => 'CanonicalNameSdkError: $message';
 }
 
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index f66182a..43368ec 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -454,11 +454,13 @@
 
 /// Implementation of [ClassHierarchy] for closed world.
 class ClosedWorldClassHierarchy implements ClassHierarchy {
+  @override
   CoreTypes coreTypes;
   late HandleAmbiguousSupertypes _onAmbiguousSupertypes;
   late HandleAmbiguousSupertypes _onAmbiguousSupertypesNotWrapped;
   MixinInferrer? mixinInferrer;
 
+  @override
   void set onAmbiguousSupertypes(
       HandleAmbiguousSupertypes onAmbiguousSupertypes) {
     _onAmbiguousSupertypesNotWrapped = onAmbiguousSupertypes;
@@ -512,6 +514,7 @@
     allBetsOff = false;
   }
 
+  @override
   final Set<Library> knownLibraries = new Set<Library>();
   bool allBetsOff = false;
 
@@ -1702,6 +1705,7 @@
   final Set<Class> _classes;
   ClassSet(this._classes);
 
+  @override
   bool contains(Object? class_) {
     return _classes.contains(class_);
   }
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 4cc9711..257a3ed 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -57,30 +57,37 @@
     return _variables[variable] = clone;
   }
 
+  @override
   TreeNode visitLibrary(Library node) {
     throw 'Cloning of libraries is not implemented';
   }
 
+  @override
   TreeNode visitClass(Class node) {
     throw 'Cloning of classes is not implemented';
   }
 
+  @override
   TreeNode visitExtension(Extension node) {
     throw 'Cloning of extensions is not implemented';
   }
 
+  @override
   TreeNode visitConstructor(Constructor node) {
     throw 'Cloning of constructors is not implemented here';
   }
 
+  @override
   TreeNode visitProcedure(Procedure node) {
     throw 'Cloning of procedures is not implemented here';
   }
 
+  @override
   TreeNode visitField(Field node) {
     throw 'Cloning of fields is not implemented here';
   }
 
+  @override
   TreeNode visitRedirectingFactory(RedirectingFactory node) {
     throw 'Cloning of redirecting factory constructors is not implemented here';
   }
@@ -151,92 +158,111 @@
     return type == null ? null : substitute(type, typeSubstitution);
   }
 
+  @override
   visitInvalidExpression(InvalidExpression node) {
     return new InvalidExpression(
         node.message, node.expression != null ? clone(node.expression!) : null);
   }
 
+  @override
   visitVariableGet(VariableGet node) {
     return new VariableGet(
         getVariableClone(node.variable)!, visitOptionalType(node.promotedType));
   }
 
+  @override
   visitVariableSet(VariableSet node) {
     return new VariableSet(getVariableClone(node.variable)!, clone(node.value));
   }
 
+  @override
   visitSuperPropertyGet(SuperPropertyGet node) {
     return new SuperPropertyGet.byReference(
         node.name, node.interfaceTargetReference);
   }
 
+  @override
   visitSuperPropertySet(SuperPropertySet node) {
     return new SuperPropertySet.byReference(
         node.name, clone(node.value), node.interfaceTargetReference);
   }
 
+  @override
   visitStaticGet(StaticGet node) {
     return new StaticGet.byReference(node.targetReference);
   }
 
+  @override
   visitStaticSet(StaticSet node) {
     return new StaticSet.byReference(node.targetReference, clone(node.value));
   }
 
+  @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
     return new SuperMethodInvocation.byReference(
         node.name, clone(node.arguments), node.interfaceTargetReference);
   }
 
+  @override
   visitStaticInvocation(StaticInvocation node) {
     return new StaticInvocation.byReference(
         node.targetReference, clone(node.arguments),
         isConst: node.isConst);
   }
 
+  @override
   visitConstructorInvocation(ConstructorInvocation node) {
     return new ConstructorInvocation.byReference(
         node.targetReference, clone(node.arguments),
         isConst: node.isConst);
   }
 
+  @override
   visitNot(Not node) {
     return new Not(clone(node.operand));
   }
 
+  @override
   visitNullCheck(NullCheck node) {
     return new NullCheck(clone(node.operand));
   }
 
+  @override
   visitLogicalExpression(LogicalExpression node) {
     return new LogicalExpression(
         clone(node.left), node.operatorEnum, clone(node.right));
   }
 
+  @override
   visitConditionalExpression(ConditionalExpression node) {
     return new ConditionalExpression(clone(node.condition), clone(node.then),
         clone(node.otherwise), visitType(node.staticType));
   }
 
+  @override
   visitStringConcatenation(StringConcatenation node) {
     return new StringConcatenation(node.expressions.map(clone).toList());
   }
 
+  @override
   visitListConcatenation(ListConcatenation node) {
     return new ListConcatenation(node.lists.map(clone).toList(),
         typeArgument: visitType(node.typeArgument));
   }
 
+  @override
   visitSetConcatenation(SetConcatenation node) {
     return new SetConcatenation(node.sets.map(clone).toList(),
         typeArgument: visitType(node.typeArgument));
   }
 
+  @override
   visitMapConcatenation(MapConcatenation node) {
     return new MapConcatenation(node.maps.map(clone).toList(),
         keyType: visitType(node.keyType), valueType: visitType(node.valueType));
   }
 
+  @override
   visitInstanceCreation(InstanceCreation node) {
     final Map<Reference, Expression> fieldValues = <Reference, Expression>{};
     node.fieldValues.forEach((Reference fieldRef, Expression value) {
@@ -250,50 +276,61 @@
         node.unusedArguments.map(clone).toList());
   }
 
+  @override
   visitFileUriExpression(FileUriExpression node) {
     return new FileUriExpression(clone(node.expression), _activeFileUri!);
   }
 
+  @override
   visitIsExpression(IsExpression node) {
     return new IsExpression(clone(node.operand), visitType(node.type))
       ..flags = node.flags;
   }
 
+  @override
   visitAsExpression(AsExpression node) {
     return new AsExpression(clone(node.operand), visitType(node.type))
       ..flags = node.flags;
   }
 
+  @override
   visitSymbolLiteral(SymbolLiteral node) {
     return new SymbolLiteral(node.value);
   }
 
+  @override
   visitTypeLiteral(TypeLiteral node) {
     return new TypeLiteral(visitType(node.type));
   }
 
+  @override
   visitThisExpression(ThisExpression node) {
     return new ThisExpression();
   }
 
+  @override
   visitRethrow(Rethrow node) {
     return new Rethrow();
   }
 
+  @override
   visitThrow(Throw node) {
     return new Throw(clone(node.expression));
   }
 
+  @override
   visitListLiteral(ListLiteral node) {
     return new ListLiteral(node.expressions.map(clone).toList(),
         typeArgument: visitType(node.typeArgument), isConst: node.isConst);
   }
 
+  @override
   visitSetLiteral(SetLiteral node) {
     return new SetLiteral(node.expressions.map(clone).toList(),
         typeArgument: visitType(node.typeArgument), isConst: node.isConst);
   }
 
+  @override
   visitMapLiteral(MapLiteral node) {
     return new MapLiteral(node.entries.map(clone).toList(),
         keyType: visitType(node.keyType),
@@ -301,69 +338,85 @@
         isConst: node.isConst);
   }
 
+  @override
   visitMapLiteralEntry(MapLiteralEntry node) {
     return new MapLiteralEntry(clone(node.key), clone(node.value));
   }
 
+  @override
   visitAwaitExpression(AwaitExpression node) {
     return new AwaitExpression(clone(node.operand));
   }
 
+  @override
   visitFunctionExpression(FunctionExpression node) {
     return new FunctionExpression(clone(node.function));
   }
 
+  @override
   visitConstantExpression(ConstantExpression node) {
     return new ConstantExpression(
         visitConstant(node.constant), visitType(node.type));
   }
 
+  @override
   visitStringLiteral(StringLiteral node) {
     return new StringLiteral(node.value);
   }
 
+  @override
   visitIntLiteral(IntLiteral node) {
     return new IntLiteral(node.value);
   }
 
+  @override
   visitDoubleLiteral(DoubleLiteral node) {
     return new DoubleLiteral(node.value);
   }
 
+  @override
   visitBoolLiteral(BoolLiteral node) {
     return new BoolLiteral(node.value);
   }
 
+  @override
   visitNullLiteral(NullLiteral node) {
     return new NullLiteral();
   }
 
+  @override
   visitLet(Let node) {
     VariableDeclaration newVariable = clone(node.variable);
     return new Let(newVariable, clone(node.body));
   }
 
+  @override
   visitBlockExpression(BlockExpression node) {
     return new BlockExpression(clone(node.body), clone(node.value));
   }
 
+  @override
   visitExpressionStatement(ExpressionStatement node) {
     return new ExpressionStatement(clone(node.expression));
   }
 
+  @override
   visitBlock(Block node) {
     return new Block(node.statements.map(clone).toList())
       ..fileEndOffset = _cloneFileOffset(node.fileEndOffset);
   }
 
+  @override
   visitAssertBlock(AssertBlock node) {
     return new AssertBlock(node.statements.map(clone).toList());
   }
 
+  @override
   visitEmptyStatement(EmptyStatement node) {
     return new EmptyStatement();
   }
 
+  @override
   visitAssertStatement(AssertStatement node) {
     return new AssertStatement(clone(node.condition),
         conditionStartOffset: node.conditionStartOffset,
@@ -371,6 +424,7 @@
         message: cloneOptional(node.message));
   }
 
+  @override
   visitLabeledStatement(LabeledStatement node) {
     LabeledStatement newNode = new LabeledStatement(null);
     labels[node] = newNode;
@@ -378,24 +432,29 @@
     return newNode;
   }
 
+  @override
   visitBreakStatement(BreakStatement node) {
     return new BreakStatement(labels[node.target]!);
   }
 
+  @override
   visitWhileStatement(WhileStatement node) {
     return new WhileStatement(clone(node.condition), clone(node.body));
   }
 
+  @override
   visitDoStatement(DoStatement node) {
     return new DoStatement(clone(node.body), clone(node.condition));
   }
 
+  @override
   visitForStatement(ForStatement node) {
     List<VariableDeclaration> variables = node.variables.map(clone).toList();
     return new ForStatement(variables, cloneOptional(node.condition),
         node.updates.map(clone).toList(), clone(node.body));
   }
 
+  @override
   visitForInStatement(ForInStatement node) {
     VariableDeclaration newVariable = clone(node.variable);
     return new ForInStatement(
@@ -404,6 +463,7 @@
       ..bodyOffset = node.bodyOffset;
   }
 
+  @override
   visitSwitchStatement(SwitchStatement node) {
     for (SwitchCase switchCase in node.cases) {
       switchCases[switchCase] = new SwitchCase(
@@ -416,30 +476,36 @@
         clone(node.expression), node.cases.map(clone).toList());
   }
 
+  @override
   visitSwitchCase(SwitchCase node) {
     SwitchCase switchCase = switchCases[node]!;
     switchCase.body = clone(node.body)..parent = switchCase;
     return switchCase;
   }
 
+  @override
   visitContinueSwitchStatement(ContinueSwitchStatement node) {
     return new ContinueSwitchStatement(switchCases[node.target]!);
   }
 
+  @override
   visitIfStatement(IfStatement node) {
     return new IfStatement(
         clone(node.condition), clone(node.then), cloneOptional(node.otherwise));
   }
 
+  @override
   visitReturnStatement(ReturnStatement node) {
     return new ReturnStatement(cloneOptional(node.expression));
   }
 
+  @override
   visitTryCatch(TryCatch node) {
     return new TryCatch(clone(node.body), node.catches.map(clone).toList(),
         isSynthetic: node.isSynthetic);
   }
 
+  @override
   visitCatch(Catch node) {
     VariableDeclaration? newException = cloneOptional(node.exception);
     VariableDeclaration? newStackTrace = cloneOptional(node.stackTrace);
@@ -447,14 +513,17 @@
         stackTrace: newStackTrace, guard: visitType(node.guard));
   }
 
+  @override
   visitTryFinally(TryFinally node) {
     return new TryFinally(clone(node.body), clone(node.finalizer));
   }
 
+  @override
   visitYieldStatement(YieldStatement node) {
     return new YieldStatement(clone(node.expression))..flags = node.flags;
   }
 
+  @override
   visitVariableDeclaration(VariableDeclaration node) {
     return setVariableClone(
         node,
@@ -468,6 +537,7 @@
           ..fileEqualsOffset = _cloneFileOffset(node.fileEqualsOffset));
   }
 
+  @override
   visitFunctionDeclaration(FunctionDeclaration node) {
     VariableDeclaration newVariable = clone(node.variable);
     // Create the declaration before cloning the body to support recursive
@@ -491,6 +561,7 @@
     }
   }
 
+  @override
   TypeParameter visitTypeParameter(TypeParameter node) {
     TypeParameter newNode = typeParams[node]!;
     newNode.bound = visitType(node.bound);
@@ -515,6 +586,7 @@
     }
   }
 
+  @override
   visitFunctionNode(FunctionNode node) {
     prepareTypeParameters(node.typeParameters);
     List<TypeParameter> typeParameters =
@@ -533,97 +605,119 @@
       ..fileEndOffset = _cloneFileOffset(node.fileEndOffset);
   }
 
+  @override
   visitArguments(Arguments node) {
     return new Arguments(node.positional.map(clone).toList(),
         types: node.types.map(visitType).toList(),
         named: node.named.map(clone).toList());
   }
 
+  @override
   visitNamedExpression(NamedExpression node) {
     return new NamedExpression(node.name, clone(node.value));
   }
 
+  @override
   defaultBasicLiteral(BasicLiteral node) {
     return defaultExpression(node);
   }
 
+  @override
   defaultExpression(Expression node) {
     throw 'Unimplemented clone for Kernel expression: $node';
   }
 
+  @override
   defaultInitializer(Initializer node) {
     throw 'Unimplemented clone for Kernel initializer: $node';
   }
 
+  @override
   defaultMember(Member node) {
     throw 'Unimplemented clone for Kernel member: $node';
   }
 
+  @override
   defaultStatement(Statement node) {
     throw 'Unimplemented clone for Kernel statement: $node';
   }
 
+  @override
   defaultTreeNode(TreeNode node) {
     throw 'Cloning Kernel non-members is not supported.  '
         'Tried cloning $node';
   }
 
+  @override
   visitAssertInitializer(AssertInitializer node) {
     return new AssertInitializer(clone(node.statement));
   }
 
+  @override
   visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
     return new CheckLibraryIsLoaded(node.import);
   }
 
+  @override
   visitCombinator(Combinator node) {
     return defaultTreeNode(node);
   }
 
+  @override
   visitFieldInitializer(FieldInitializer node) {
     return new FieldInitializer.byReference(
         node.fieldReference, clone(node.value));
   }
 
+  @override
   visitInstantiation(Instantiation node) {
     return new Instantiation(
         clone(node.expression), node.typeArguments.map(visitType).toList());
   }
 
+  @override
   visitInvalidInitializer(InvalidInitializer node) {
     return new InvalidInitializer();
   }
 
+  @override
   visitLibraryDependency(LibraryDependency node) {
     return defaultTreeNode(node);
   }
 
+  @override
   visitLibraryPart(LibraryPart node) {
     return defaultTreeNode(node);
   }
 
+  @override
   visitLoadLibrary(LoadLibrary node) {
     return new LoadLibrary(node.import);
   }
 
+  @override
   visitLocalInitializer(LocalInitializer node) {
     return new LocalInitializer(clone(node.variable));
   }
 
+  @override
   visitComponent(Component node) {
     return defaultTreeNode(node);
   }
 
+  @override
   visitRedirectingInitializer(RedirectingInitializer node) {
     return new RedirectingInitializer.byReference(
         node.targetReference, clone(node.arguments));
   }
 
+  @override
   visitSuperInitializer(SuperInitializer node) {
     return new SuperInitializer.byReference(
         node.targetReference, clone(node.arguments));
   }
 
+  @override
   visitTypedef(Typedef node) {
     return defaultTreeNode(node);
   }
@@ -756,6 +850,7 @@
             typeParams: typeParams,
             cloneAnnotations: cloneAnnotations);
 
+  @override
   @Deprecated("When cloning with members one should use the specific cloneX")
   T clone<T extends TreeNode>(T node) {
     return super.clone(node);
diff --git a/pkg/kernel/lib/import_table.dart b/pkg/kernel/lib/import_table.dart
index bf9f7d5..deffa5d 100644
--- a/pkg/kernel/lib/import_table.dart
+++ b/pkg/kernel/lib/import_table.dart
@@ -19,6 +19,7 @@
     }
   }
 
+  @override
   int getImportIndex(Library library) => _libraryIndex[library] ?? -1;
 }
 
@@ -51,6 +52,7 @@
   }
 
   /// Returns the index of the given import, or -1 if not found.
+  @override
   int getImportIndex(Library library) {
     return _libraryIndex[library] ?? -1;
   }
@@ -103,10 +105,12 @@
     }
   }
 
+  @override
   visitClassReference(Class node) {
     addLibraryImport(node.enclosingLibrary);
   }
 
+  @override
   visitLibrary(Library node) {
     super.visitLibrary(node);
     for (Reference exportedReference in node.additionalExports) {
@@ -114,10 +118,12 @@
     }
   }
 
+  @override
   defaultMemberReference(Member node) {
     addLibraryImport(node.enclosingLibrary);
   }
 
+  @override
   visitName(Name name) {
     if (name.library != null) {
       addLibraryImport(name.library);
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index 0e83da3..1c93f7c 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -79,6 +79,7 @@
   final Map<String, IndexedClass> _indexedClasses =
       new Map<String, IndexedClass>();
   final Map<String, Extension> _extensions = new Map<String, Extension>();
+  @override
   final Library library;
 
   IndexedLibrary(this.library) {
@@ -112,6 +113,7 @@
 class IndexedClass extends IndexedContainer {
   final Class cls;
   final Map<Name, Member> _constructors = new Map<Name, Member>();
+  @override
   final Library library;
 
   IndexedClass._(this.cls, this.library) {
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 68ad9bb..31bdf1c 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -15,6 +15,7 @@
 import 'legacy_erasure.dart';
 
 class TypeVariableGraph extends Graph<int> {
+  @override
   late List<int> vertices;
   List<TypeParameter> typeParameters;
   List<DartType> bounds;
@@ -50,6 +51,7 @@
     }
   }
 
+  @override
   Iterable<int> neighborsOf(int index) {
     return edges[index];
   }
@@ -67,22 +69,28 @@
     node.type.accept(this);
   }
 
+  @override
   void visitInvalidType(InvalidType node);
+  @override
   void visitDynamicType(DynamicType node);
+  @override
   void visitVoidType(VoidType node);
 
+  @override
   void visitInterfaceType(InterfaceType node) {
     for (DartType argument in node.typeArguments) {
       argument.accept(this);
     }
   }
 
+  @override
   void visitTypedefType(TypedefType node) {
     for (DartType argument in node.typeArguments) {
       argument.accept(this);
     }
   }
 
+  @override
   void visitFunctionType(FunctionType node) {
     for (TypeParameter typeParameter in node.typeParameters) {
       typeParameter.bound.accept(this);
@@ -97,6 +105,7 @@
     node.returnType.accept(this);
   }
 
+  @override
   void visitTypeParameterType(TypeParameterType node) {
     if (typeParameters.contains(node.parameter)) {
       occurred.add(node.parameter);
@@ -249,6 +258,7 @@
       this.index, this.argument, this.typeParameter, this.enclosingType,
       {this.invertedType, this.isGenericTypeAsArgumentIssue = false});
 
+  @override
   int get hashCode {
     int hash = 0x3fffffff & index;
     hash = 0x3fffffff & (hash * 31 + (hash ^ argument.hashCode));
@@ -257,6 +267,7 @@
     return hash;
   }
 
+  @override
   bool operator ==(Object other) {
     assert(other is TypeArgumentIssue);
     return other is TypeArgumentIssue &&
@@ -266,6 +277,7 @@
         enclosingType == other.enclosingType;
   }
 
+  @override
   String toString() {
     return "TypeArgumentIssue(index=${index}, argument=${argument}, "
         "typeParameter=${typeParameter}, enclosingType=${enclosingType}";
diff --git a/pkg/kernel/lib/src/equivalence_helpers.dart b/pkg/kernel/lib/src/equivalence_helpers.dart
index 29f6e00..a36ee07 100644
--- a/pkg/kernel/lib/src/equivalence_helpers.dart
+++ b/pkg/kernel/lib/src/equivalence_helpers.dart
@@ -13,6 +13,7 @@
 
 /// State for visiting two AST nodes in [EquivalenceVisitor].
 class NodeState extends State {
+  @override
   final State? parent;
   final Node a;
   final Node b;
@@ -22,6 +23,7 @@
 
 /// State for visiting an AST property in [EquivalenceVisitor]
 class PropertyState extends State {
+  @override
   final State? parent;
   final String name;
 
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index 58186dd..65894ac 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -13,6 +13,7 @@
 import '../type_environment.dart' show TypeEnvironment;
 
 class HierarchyBasedTypeEnvironment extends TypeEnvironment {
+  @override
   final ClassHierarchyBase hierarchy;
 
   HierarchyBasedTypeEnvironment(CoreTypes coreTypes, this.hierarchy)
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index 316a701..a17f78b 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -51,6 +51,7 @@
 class _LegacyErasure extends ReplacementVisitor {
   const _LegacyErasure();
 
+  @override
   Nullability? visitNullability(DartType node) {
     if (node.declaredNullability != Nullability.legacy) {
       return Nullability.legacy;
diff --git a/pkg/kernel/lib/src/tool/find_referenced_libraries.dart b/pkg/kernel/lib/src/tool/find_referenced_libraries.dart
index 9846b9b..dca5f78 100644
--- a/pkg/kernel/lib/src/tool/find_referenced_libraries.dart
+++ b/pkg/kernel/lib/src/tool/find_referenced_libraries.dart
@@ -23,6 +23,7 @@
 class _LibraryCollector extends RecursiveVisitor {
   Set<Library> allSeenLibraries = {};
 
+  @override
   void defaultNode(Node node) {
     if (node is NamedNode) {
       // Named nodes can be linked to.
@@ -35,6 +36,7 @@
     super.defaultNode(node);
   }
 
+  @override
   void defaultMemberReference(Member node) {
     seen(node);
     super.defaultMemberReference(node);
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index abb2a35..b78578c 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -24,6 +24,7 @@
   @override
   CoreTypes get coreTypes => hierarchy.coreTypes;
 
+  @override
   bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
     IsSubtypeOf result = performNullabilityAwareMutualSubtypesCheck(s, t);
     switch (mode) {
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 55a69cd..c4062b0 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -31,6 +31,7 @@
           ConstructorTearOffLowering.none,
       this.enableNullSafety = false});
 
+  @override
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return other is TargetFlags &&
@@ -45,6 +46,7 @@
         enableNullSafety == other.enableNullSafety;
   }
 
+  @override
   int get hashCode {
     int hash = 485786;
     hash = 0x3fffffff & (hash * 31 + (hash ^ trackWidgetCreation.hashCode));
@@ -451,6 +453,7 @@
   // Configure environment defines in a target-specific way.
   Map<String, String> updateEnvironmentDefines(Map<String, String> map) => map;
 
+  @override
   String toString() => 'Target($name)';
 
   Class? concreteListLiteralClass(CoreTypes coreTypes) => null;
@@ -474,6 +477,7 @@
 }
 
 class NoneTarget extends Target {
+  @override
   final TargetFlags flags;
 
   NoneTarget(this.flags);
diff --git a/pkg/kernel/lib/testing/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
index f2522d3..f5d38ee 100644
--- a/pkg/kernel/lib/testing/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -51,6 +51,7 @@
 
   ParsedInterfaceType(this.name, this.arguments, this.parsedNullability);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write(name);
@@ -63,6 +64,7 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitInterfaceType(this, a);
   }
@@ -85,6 +87,7 @@
       this.interfaces, this.callableType)
       : super(name);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("class ");
@@ -112,6 +115,7 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitClass(this, a);
   }
@@ -123,6 +127,7 @@
 
   ParsedExtension(String name, this.typeVariables, this.onType) : super(name);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("extension ");
@@ -138,6 +143,7 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitExtension(this, a);
   }
@@ -150,6 +156,7 @@
 
   ParsedTypedef(String name, this.typeVariables, this.type) : super(name);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("typedef ");
@@ -164,6 +171,7 @@
     return "$sb;";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitTypedef(this, a);
   }
@@ -181,6 +189,7 @@
   ParsedFunctionType(this.typeVariables, this.returnType, this.arguments,
       this.parsedNullability);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     if (typeVariables.isNotEmpty) {
@@ -196,14 +205,17 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitFunctionType(this, a);
   }
 }
 
 class ParsedVoidType extends ParsedType {
+  @override
   String toString() => "void";
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitVoidType(this, a);
   }
@@ -216,6 +228,7 @@
 
   ParsedTypeVariable(this.name, this.bound);
 
+  @override
   String toString() {
     if (bound == null) return name;
     StringBuffer sb = new StringBuffer();
@@ -225,6 +238,7 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitTypeVariable(this, a);
   }
@@ -237,6 +251,7 @@
 
   ParsedIntersectionType(this.a, this.b);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write(a);
@@ -245,6 +260,7 @@
     return "$sb";
   }
 
+  @override
   R accept<R, A>(Visitor<R, A> visitor, A a) {
     return visitor.visitIntersectionType(this, a);
   }
@@ -258,6 +274,7 @@
   ParsedArguments(this.required, this.positional, this.named)
       : assert(positional.isEmpty || named.isEmpty);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("(");
@@ -291,6 +308,7 @@
 
   ParsedNamedArgument(this.isRequired, this.type, this.name);
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     if (isRequired) {
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index c9c0b12..6beaa67 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -243,6 +243,7 @@
         as InterfaceType?;
   }
 
+  @override
   DartType visitInterfaceType(
       ParsedInterfaceType node, TypeParserEnvironment environment) {
     String name = node.name;
@@ -338,6 +339,7 @@
     }
   }
 
+  @override
   Class visitClass(ParsedClass node, TypeParserEnvironment environment) {
     String name = node.name;
     Class cls = environment.lookupDeclaration(name) as Class;
@@ -373,6 +375,7 @@
     return cls;
   }
 
+  @override
   Extension visitExtension(
       ParsedExtension node, TypeParserEnvironment environment) {
     String name = node.name;
@@ -393,6 +396,7 @@
     return ext;
   }
 
+  @override
   Typedef visitTypedef(ParsedTypedef node, TypeParserEnvironment environment) {
     String name = node.name;
     Typedef def = environment._registerDeclaration(
@@ -423,6 +427,7 @@
     return def..type = type;
   }
 
+  @override
   FunctionType visitFunctionType(
       ParsedFunctionType node, TypeParserEnvironment environment) {
     ParameterEnvironment parameterEnvironment =
@@ -453,16 +458,19 @@
         typeParameters: parameterEnvironment.parameters);
   }
 
+  @override
   VoidType visitVoidType(
       ParsedVoidType node, TypeParserEnvironment environment) {
     return const VoidType();
   }
 
+  @override
   TypeParameter visitTypeVariable(
       ParsedTypeVariable node, TypeParserEnvironment environment) {
     throw "not implemented: $node";
   }
 
+  @override
   TypeParameterType visitIntersectionType(
       ParsedIntersectionType node, TypeParserEnvironment environment) {
     TypeParameterType type =
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index e2012c2..dc98fc7 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -21,16 +21,19 @@
 }
 
 class NormalNamer<T> extends Namer<T> {
+  @override
   final String prefix;
 
   NormalNamer(this.prefix);
 }
 
 class ConstantNamer extends RecursiveResultVisitor<Null> with Namer<Constant> {
+  @override
   final String prefix;
 
   ConstantNamer(this.prefix);
 
+  @override
   String getName(Constant constant) {
     if (!map.containsKey(constant)) {
       // When printing a non-fully linked kernel AST (i.e. some [Reference]s
@@ -61,10 +64,12 @@
     return super.getName(constant);
   }
 
+  @override
   defaultConstantReference(Constant constant) {
     getName(constant);
   }
 
+  @override
   defaultDartType(DartType type) {
     // No need to recurse into dart types, we only care about naming the
     // constants themselves.
@@ -702,6 +707,7 @@
     }
   }
 
+  @override
   visitSupertype(Supertype type) {
     // ignore: unnecessary_null_comparison
     if (type == null) {
@@ -716,6 +722,7 @@
     }
   }
 
+  @override
   visitTypedefType(TypedefType type) {
     writeTypedefReference(type.typedefNode);
     if (type.typeArguments.isNotEmpty) {
@@ -1107,8 +1114,10 @@
     }
   }
 
+  @override
   visitLibrary(Library node) {}
 
+  @override
   visitField(Field node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1153,6 +1162,7 @@
     endLine(';');
   }
 
+  @override
   visitProcedure(Procedure node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1220,6 +1230,7 @@
     }
   }
 
+  @override
   visitConstructor(Constructor node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1243,6 +1254,7 @@
         name: node.name, initializers: node.initializers);
   }
 
+  @override
   visitRedirectingFactory(RedirectingFactory node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1272,6 +1284,7 @@
     endLine(';');
   }
 
+  @override
   visitClass(Class node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1326,6 +1339,7 @@
     endLine('}');
   }
 
+  @override
   visitExtension(Extension node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1384,6 +1398,7 @@
     endLine('}');
   }
 
+  @override
   visitTypedef(Typedef node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1402,6 +1417,7 @@
     endLine(';');
   }
 
+  @override
   visitInvalidExpression(InvalidExpression node) {
     writeWord('invalid-expression');
     if (node.message != null) {
@@ -1430,6 +1446,7 @@
     }
   }
 
+  @override
   visitDynamicInvocation(DynamicInvocation node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     _writeDynamicAccessKind(node.kind);
@@ -1453,6 +1470,7 @@
     }
   }
 
+  @override
   visitFunctionInvocation(FunctionInvocation node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     _writeFunctionAccessKind(node.kind);
@@ -1487,6 +1505,7 @@
     }
   }
 
+  @override
   visitInstanceInvocation(InstanceInvocation node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
@@ -1508,6 +1527,7 @@
     writeSymbol('}');
   }
 
+  @override
   visitInstanceGetterInvocation(InstanceGetterInvocation node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
@@ -1521,6 +1541,7 @@
     }
   }
 
+  @override
   visitEqualsCall(EqualsCall node) {
     int precedence = Precedence.EQUALITY;
     writeExpression(node.left, precedence);
@@ -1534,6 +1555,7 @@
     writeExpression(node.right, precedence + 1);
   }
 
+  @override
   visitEqualsNull(EqualsNull node) {
     writeExpression(node.expression, Precedence.EQUALITY);
     writeSpace();
@@ -1542,6 +1564,7 @@
     writeSymbol('null');
   }
 
+  @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
     writeWord('super');
     writeSymbol('.');
@@ -1549,28 +1572,33 @@
     writeNode(node.arguments);
   }
 
+  @override
   visitStaticInvocation(StaticInvocation node) {
     writeModifier(node.isConst, 'const');
     writeMemberReferenceFromReference(node.targetReference);
     writeNode(node.arguments);
   }
 
+  @override
   visitConstructorInvocation(ConstructorInvocation node) {
     writeWord(node.isConst ? 'const' : 'new');
     writeMemberReferenceFromReference(node.targetReference);
     writeNode(node.arguments);
   }
 
+  @override
   visitNot(Not node) {
     writeSymbol('!');
     writeExpression(node.operand, Precedence.PREFIX);
   }
 
+  @override
   visitNullCheck(NullCheck node) {
     writeExpression(node.operand, Precedence.POSTFIX);
     writeSymbol('!');
   }
 
+  @override
   visitLogicalExpression(LogicalExpression node) {
     int precedence = Precedence.binaryPrecedence[
         logicalExpressionOperatorToString(node.operatorEnum)]!;
@@ -1579,6 +1607,7 @@
     writeExpression(node.right, precedence + 1);
   }
 
+  @override
   visitConditionalExpression(ConditionalExpression node) {
     writeExpression(node.condition, Precedence.LOGICAL_OR);
     ensureSpace();
@@ -1590,6 +1619,7 @@
     writeExpression(node.otherwise);
   }
 
+  @override
   visitStringConcatenation(StringConcatenation node) {
     if (state == WORD) {
       writeSpace();
@@ -1608,6 +1638,7 @@
     state = WORD;
   }
 
+  @override
   visitListConcatenation(ListConcatenation node) {
     bool first = true;
     for (Expression part in node.lists) {
@@ -1617,6 +1648,7 @@
     }
   }
 
+  @override
   visitSetConcatenation(SetConcatenation node) {
     bool first = true;
     for (Expression part in node.sets) {
@@ -1626,6 +1658,7 @@
     }
   }
 
+  @override
   visitMapConcatenation(MapConcatenation node) {
     bool first = true;
     for (Expression part in node.maps) {
@@ -1635,6 +1668,7 @@
     }
   }
 
+  @override
   visitInstanceCreation(InstanceCreation node) {
     writeClassReferenceFromReference(node.classReference);
     if (node.typeArguments.isNotEmpty) {
@@ -1677,10 +1711,12 @@
     writeSymbol('}');
   }
 
+  @override
   visitFileUriExpression(FileUriExpression node) {
     writeExpression(node.expression);
   }
 
+  @override
   visitIsExpression(IsExpression node) {
     writeExpression(node.operand, Precedence.BITWISE_OR);
     writeSpaced(
@@ -1688,6 +1724,7 @@
     writeType(node.type);
   }
 
+  @override
   visitAsExpression(AsExpression node) {
     writeExpression(node.operand, Precedence.BITWISE_OR);
     List<String> flags = <String>[];
@@ -1707,29 +1744,35 @@
     writeType(node.type);
   }
 
+  @override
   visitSymbolLiteral(SymbolLiteral node) {
     writeSymbol('#');
     writeWord(node.value);
   }
 
+  @override
   visitTypeLiteral(TypeLiteral node) {
     writeType(node.type);
   }
 
+  @override
   visitThisExpression(ThisExpression node) {
     writeWord('this');
   }
 
+  @override
   visitRethrow(Rethrow node) {
     writeWord('rethrow');
   }
 
+  @override
   visitThrow(Throw node) {
     writeWord('throw');
     writeSpace();
     writeExpression(node.expression);
   }
 
+  @override
   visitListLiteral(ListLiteral node) {
     if (node.isConst) {
       writeWord('const');
@@ -1746,6 +1789,7 @@
     writeSymbol(']');
   }
 
+  @override
   visitSetLiteral(SetLiteral node) {
     if (node.isConst) {
       writeWord('const');
@@ -1762,6 +1806,7 @@
     writeSymbol('}');
   }
 
+  @override
   visitMapLiteral(MapLiteral node) {
     if (node.isConst) {
       writeWord('const');
@@ -1778,41 +1823,50 @@
     writeSymbol('}');
   }
 
+  @override
   visitMapLiteralEntry(MapLiteralEntry node) {
     writeExpression(node.key);
     writeComma(':');
     writeExpression(node.value);
   }
 
+  @override
   visitAwaitExpression(AwaitExpression node) {
     writeWord('await');
     writeExpression(node.operand);
   }
 
+  @override
   visitFunctionExpression(FunctionExpression node) {
     writeFunction(node.function, terminateLine: false);
   }
 
+  @override
   visitStringLiteral(StringLiteral node) {
     writeWord('"${escapeString(node.value)}"');
   }
 
+  @override
   visitIntLiteral(IntLiteral node) {
     writeWord('${node.value}');
   }
 
+  @override
   visitDoubleLiteral(DoubleLiteral node) {
     writeWord('${node.value}');
   }
 
+  @override
   visitBoolLiteral(BoolLiteral node) {
     writeWord('${node.value}');
   }
 
+  @override
   visitNullLiteral(NullLiteral node) {
     writeWord('null');
   }
 
+  @override
   visitLet(Let node) {
     writeWord('let');
     writeVariableDeclaration(node.variable);
@@ -1820,6 +1874,7 @@
     writeExpression(node.body);
   }
 
+  @override
   visitBlockExpression(BlockExpression node) {
     writeSpaced('block');
     writeBlockBody(node.body.statements, asExpression: true);
@@ -1827,6 +1882,7 @@
     writeExpression(node.value);
   }
 
+  @override
   visitInstantiation(Instantiation node) {
     writeExpression(node.expression);
     writeSymbol('<');
@@ -1834,6 +1890,7 @@
     writeSymbol('>');
   }
 
+  @override
   visitLoadLibrary(LoadLibrary node) {
     writeWord('LoadLibrary');
     writeSymbol('(');
@@ -1842,6 +1899,7 @@
     state = WORD;
   }
 
+  @override
   visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
     writeWord('CheckLibraryIsLoaded');
     writeSymbol('(');
@@ -1850,6 +1908,7 @@
     state = WORD;
   }
 
+  @override
   visitLibraryPart(LibraryPart node) {
     writeAnnotationList(node.annotations);
     writeIndentation();
@@ -1858,6 +1917,7 @@
     endLine(";");
   }
 
+  @override
   visitLibraryDependency(LibraryDependency node) {
     writeIndentation();
     writeWord(node.isImport ? 'import' : 'export');
@@ -1900,10 +1960,12 @@
     endLine(';');
   }
 
+  @override
   defaultExpression(Expression node) {
     writeWord('${node.runtimeType}');
   }
 
+  @override
   visitVariableGet(VariableGet node) {
     writeVariableReference(node.variable);
     DartType? promotedType = node.promotedType;
@@ -1915,6 +1977,7 @@
     }
   }
 
+  @override
   visitVariableSet(VariableSet node) {
     writeVariableReference(node.variable);
     writeSpaced('=');
@@ -1940,18 +2003,21 @@
     }
   }
 
+  @override
   visitDynamicGet(DynamicGet node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     _writeDynamicAccessKind(node.kind);
     writeName(node.name);
   }
 
+  @override
   visitFunctionTearOff(FunctionTearOff node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
     writeSymbol('call');
   }
 
+  @override
   visitInstanceGet(InstanceGet node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
@@ -1962,6 +2028,7 @@
     writeSymbol('}');
   }
 
+  @override
   visitInstanceTearOff(InstanceTearOff node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
@@ -1972,6 +2039,7 @@
     writeSymbol('}');
   }
 
+  @override
   visitDynamicSet(DynamicSet node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     _writeDynamicAccessKind(node.kind);
@@ -1980,6 +2048,7 @@
     writeExpression(node.value);
   }
 
+  @override
   visitInstanceSet(InstanceSet node) {
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
@@ -1989,12 +2058,14 @@
     writeExpression(node.value);
   }
 
+  @override
   visitSuperPropertyGet(SuperPropertyGet node) {
     writeWord('super');
     writeSymbol('.');
     writeInterfaceTarget(node.name, node.interfaceTargetReference);
   }
 
+  @override
   visitSuperPropertySet(SuperPropertySet node) {
     writeWord('super');
     writeSymbol('.');
@@ -2003,28 +2074,34 @@
     writeExpression(node.value);
   }
 
+  @override
   visitStaticTearOff(StaticTearOff node) {
     writeMemberReferenceFromReference(node.targetReference);
   }
 
+  @override
   visitStaticGet(StaticGet node) {
     writeMemberReferenceFromReference(node.targetReference);
   }
 
+  @override
   visitStaticSet(StaticSet node) {
     writeMemberReferenceFromReference(node.targetReference);
     writeSpaced('=');
     writeExpression(node.value);
   }
 
+  @override
   visitConstructorTearOff(ConstructorTearOff node) {
     writeMemberReferenceFromReference(node.targetReference);
   }
 
+  @override
   visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node) {
     writeMemberReferenceFromReference(node.targetReference);
   }
 
+  @override
   visitTypedefTearOff(TypedefTearOff node) {
     writeTypeParameterList(node.typeParameters);
     state = SYMBOL;
@@ -2039,6 +2116,7 @@
     state = WORD;
   }
 
+  @override
   visitExpressionStatement(ExpressionStatement node) {
     writeIndentation();
     writeExpression(node.expression);
@@ -2058,22 +2136,26 @@
     asExpression ? writeSymbol('}') : endLine('}');
   }
 
+  @override
   visitBlock(Block node) {
     writeIndentation();
     writeBlockBody(node.statements);
   }
 
+  @override
   visitAssertBlock(AssertBlock node) {
     writeIndentation();
     writeSpaced('assert');
     writeBlockBody(node.statements);
   }
 
+  @override
   visitEmptyStatement(EmptyStatement node) {
     writeIndentation();
     endLine(';');
   }
 
+  @override
   visitAssertStatement(AssertStatement node, {bool asExpression = false}) {
     if (!asExpression) {
       writeIndentation();
@@ -2093,6 +2175,7 @@
     }
   }
 
+  @override
   visitLabeledStatement(LabeledStatement node) {
     writeIndentation();
     writeWord(syntheticNames.nameLabeledStatement(node));
@@ -2100,6 +2183,7 @@
     writeNode(node.body);
   }
 
+  @override
   visitBreakStatement(BreakStatement node) {
     writeIndentation();
     writeWord('break');
@@ -2107,6 +2191,7 @@
     endLine(';');
   }
 
+  @override
   visitWhileStatement(WhileStatement node) {
     writeIndentation();
     writeSpaced('while');
@@ -2116,6 +2201,7 @@
     writeBody(node.body);
   }
 
+  @override
   visitDoStatement(DoStatement node) {
     writeIndentation();
     writeWord('do');
@@ -2127,6 +2213,7 @@
     endLine(')');
   }
 
+  @override
   visitForStatement(ForStatement node) {
     writeIndentation();
     writeSpaced('for');
@@ -2143,6 +2230,7 @@
     writeBody(node.body);
   }
 
+  @override
   visitForInStatement(ForInStatement node) {
     writeIndentation();
     if (node.isAsync) {
@@ -2157,6 +2245,7 @@
     writeBody(node.body);
   }
 
+  @override
   visitSwitchStatement(SwitchStatement node) {
     writeIndentation();
     writeWord('switch');
@@ -2170,6 +2259,7 @@
     endLine('}');
   }
 
+  @override
   visitSwitchCase(SwitchCase node) {
     String label = syntheticNames.nameSwitchCase(node);
     writeIndentation();
@@ -2191,6 +2281,7 @@
     --indentation;
   }
 
+  @override
   visitContinueSwitchStatement(ContinueSwitchStatement node) {
     writeIndentation();
     writeWord('continue');
@@ -2198,6 +2289,7 @@
     endLine(';');
   }
 
+  @override
   visitIfStatement(IfStatement node) {
     writeIndentation();
     writeWord('if');
@@ -2213,6 +2305,7 @@
     }
   }
 
+  @override
   visitReturnStatement(ReturnStatement node) {
     writeIndentation();
     writeWord('return');
@@ -2224,6 +2317,7 @@
     endLine(';');
   }
 
+  @override
   visitTryCatch(TryCatch node) {
     writeIndentation();
     writeWord('try');
@@ -2231,6 +2325,7 @@
     node.catches.forEach(writeNode);
   }
 
+  @override
   visitCatch(Catch node) {
     writeIndentation();
     // ignore: unnecessary_null_comparison
@@ -2256,6 +2351,7 @@
     writeBody(node.body);
   }
 
+  @override
   visitTryFinally(TryFinally node) {
     writeIndentation();
     writeWord('try');
@@ -2265,6 +2361,7 @@
     writeBody(node.finalizer);
   }
 
+  @override
   visitYieldStatement(YieldStatement node) {
     writeIndentation();
     if (node.isYieldStar) {
@@ -2278,12 +2375,14 @@
     endLine(';');
   }
 
+  @override
   visitVariableDeclaration(VariableDeclaration node) {
     writeIndentation();
     writeVariableDeclaration(node, useVarKeyword: true);
     endLine(';');
   }
 
+  @override
   visitFunctionDeclaration(FunctionDeclaration node) {
     writeAnnotationList(node.variable.annotations);
     writeIndentation();
@@ -2325,6 +2424,7 @@
     }
   }
 
+  @override
   visitArguments(Arguments node) {
     if (node.types.isNotEmpty) {
       writeSymbol('<');
@@ -2338,47 +2438,56 @@
     writeSymbol(')');
   }
 
+  @override
   visitNamedExpression(NamedExpression node) {
     writeWord(node.name);
     writeComma(':');
     writeExpression(node.value);
   }
 
+  @override
   defaultStatement(Statement node) {
     writeIndentation();
     endLine('${node.runtimeType}');
   }
 
+  @override
   visitInvalidInitializer(InvalidInitializer node) {
     writeWord('invalid-initializer');
   }
 
+  @override
   visitFieldInitializer(FieldInitializer node) {
     writeMemberReferenceFromReference(node.fieldReference);
     writeSpaced('=');
     writeExpression(node.value);
   }
 
+  @override
   visitSuperInitializer(SuperInitializer node) {
     writeWord('super');
     writeMemberReferenceFromReference(node.targetReference);
     writeNode(node.arguments);
   }
 
+  @override
   visitRedirectingInitializer(RedirectingInitializer node) {
     writeWord('this');
     writeMemberReferenceFromReference(node.targetReference);
     writeNode(node.arguments);
   }
 
+  @override
   visitLocalInitializer(LocalInitializer node) {
     writeVariableDeclaration(node.variable);
   }
 
+  @override
   visitAssertInitializer(AssertInitializer node) {
     visitAssertStatement(node.statement, asExpression: true);
   }
 
+  @override
   defaultInitializer(Initializer node) {
     writeIndentation();
     endLine(': ${node.runtimeType}');
@@ -2420,27 +2529,33 @@
     }
   }
 
+  @override
   visitInvalidType(InvalidType node) {
     writeWord('invalid-type');
   }
 
+  @override
   visitDynamicType(DynamicType node) {
     writeWord('dynamic');
   }
 
+  @override
   visitVoidType(VoidType node) {
     writeWord('void');
   }
 
+  @override
   visitNeverType(NeverType node) {
     writeWord('Never');
     writeNullability(node.nullability);
   }
 
+  @override
   visitNullType(NullType node) {
     writeWord('Null');
   }
 
+  @override
   visitInterfaceType(InterfaceType node) {
     writeClassReferenceFromReference(node.className);
     if (node.typeArguments.isNotEmpty) {
@@ -2452,6 +2567,7 @@
     writeNullability(node.nullability);
   }
 
+  @override
   visitExtensionType(ExtensionType node) {
     writeExtensionReferenceFromReference(node.extensionReference);
     if (node.typeArguments.isNotEmpty) {
@@ -2463,6 +2579,7 @@
     writeNullability(node.declaredNullability);
   }
 
+  @override
   visitFutureOrType(FutureOrType node) {
     writeWord('FutureOr');
     writeSymbol('<');
@@ -2471,10 +2588,12 @@
     writeNullability(node.declaredNullability);
   }
 
+  @override
   visitFunctionType(FunctionType node) {
     writeFunctionType(node);
   }
 
+  @override
   visitNamedType(NamedType node) {
     writeModifier(node.isRequired, 'required');
     writeWord(node.name);
@@ -2483,6 +2602,7 @@
     writeType(node.type);
   }
 
+  @override
   visitTypeParameterType(TypeParameterType node) {
     writeTypeParameterReference(node.parameter);
     writeNullability(node.declaredNullability);
@@ -2501,6 +2621,7 @@
     }
   }
 
+  @override
   visitTypeParameter(TypeParameter node) {
     writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl');
     writeAnnotationList(node.annotations, separateLines: false);
@@ -2526,10 +2647,12 @@
     writeWord(syntheticNames.nameConstant(node));
   }
 
+  @override
   visitConstantExpression(ConstantExpression node) {
     writeConstantReference(node.constant);
   }
 
+  @override
   defaultConstant(Constant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2537,6 +2660,7 @@
     endLine('${node.runtimeType}');
   }
 
+  @override
   visitNullConstant(NullConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2544,6 +2668,7 @@
     endLine('${node.value}');
   }
 
+  @override
   visitBoolConstant(BoolConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2551,6 +2676,7 @@
     endLine('${node.value}');
   }
 
+  @override
   visitIntConstant(IntConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2558,6 +2684,7 @@
     endLine('${node.value}');
   }
 
+  @override
   visitDoubleConstant(DoubleConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2565,6 +2692,7 @@
     endLine('${node.value}');
   }
 
+  @override
   visitSymbolConstant(SymbolConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2576,6 +2704,7 @@
     endLine('${text}');
   }
 
+  @override
   visitListConstant(ListConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2587,6 +2716,7 @@
     endLine(']');
   }
 
+  @override
   visitSetConstant(SetConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2598,6 +2728,7 @@
     endLine('}');
   }
 
+  @override
   visitMapConstant(MapConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2613,6 +2744,7 @@
     endLine(')');
   }
 
+  @override
   visitTypeLiteralConstant(TypeLiteralConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2623,6 +2755,7 @@
     endLine(')');
   }
 
+  @override
   visitInstanceConstant(InstanceConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2647,6 +2780,7 @@
     endLine('}');
   }
 
+  @override
   visitInstantiationConstant(InstantiationConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2666,6 +2800,7 @@
     endLine();
   }
 
+  @override
   visitStringConstant(StringConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2673,6 +2808,7 @@
     endLine('"${escapeString(node.value)}"');
   }
 
+  @override
   visitStaticTearOffConstant(StaticTearOffConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2683,6 +2819,7 @@
     endLine();
   }
 
+  @override
   visitTypedefTearOffConstant(TypedefTearOffConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2703,6 +2840,7 @@
     endLine();
   }
 
+  @override
   visitUnevaluatedConstant(UnevaluatedConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2713,6 +2851,7 @@
     endLine();
   }
 
+  @override
   visitConstructorTearOffConstant(ConstructorTearOffConstant node) {
     writeIndentation();
     writeConstantReference(node);
@@ -2723,6 +2862,7 @@
     endLine();
   }
 
+  @override
   visitRedirectingFactoryTearOffConstant(
       RedirectingFactoryTearOffConstant node) {
     writeIndentation();
@@ -2734,6 +2874,7 @@
     endLine();
   }
 
+  @override
   defaultNode(Node node) {
     write('<${node.runtimeType}>');
   }
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
index aae9ea2..b187beb 100644
--- a/pkg/kernel/lib/text/serializer_combinators.dart
+++ b/pkg/kernel/lib/text/serializer_combinators.dart
@@ -136,16 +136,20 @@
 class Nothing extends TextSerializer<void> {
   const Nothing();
 
+  @override
   void readFrom(Iterator<Object?> stream, DeserializationState? _) {}
 
+  @override
   void writeTo(StringBuffer buffer, void ignored, SerializationState? _) {}
 
+  @override
   bool get isEmpty => true;
 }
 
 class DartString extends TextSerializer<String> {
   const DartString();
 
+  @override
   String readFrom(Iterator<Object?> stream, DeserializationState? _) {
     Object? current = stream.current;
     if (current is! String) {
@@ -156,6 +160,7 @@
     return result;
   }
 
+  @override
   void writeTo(StringBuffer buffer, String object, SerializationState? _) {
     buffer.write(json.encode(object));
   }
@@ -164,6 +169,7 @@
 class DartInt extends TextSerializer<int> {
   const DartInt();
 
+  @override
   int readFrom(Iterator<Object?> stream, DeserializationState? _) {
     Object? current = stream.current;
     if (current is! String) {
@@ -174,6 +180,7 @@
     return result;
   }
 
+  @override
   void writeTo(StringBuffer buffer, int object, SerializationState? _) {
     buffer.write(object);
   }
@@ -182,6 +189,7 @@
 class DartDouble extends TextSerializer<double> {
   const DartDouble();
 
+  @override
   double readFrom(Iterator<Object?> stream, DeserializationState? _) {
     Object? current = stream.current;
     if (current is! String) {
@@ -192,6 +200,7 @@
     return result;
   }
 
+  @override
   void writeTo(StringBuffer buffer, double object, SerializationState? _) {
     buffer.write(object);
   }
@@ -200,6 +209,7 @@
 class DartBool extends TextSerializer<bool> {
   const DartBool();
 
+  @override
   bool readFrom(Iterator<Object?> stream, DeserializationState? _) {
     Object? current = stream.current;
     if (current is! String) {
@@ -217,6 +227,7 @@
     return result;
   }
 
+  @override
   void writeTo(StringBuffer buffer, bool object, SerializationState? _) {
     buffer.write(object ? 'true' : 'false');
   }
@@ -225,11 +236,13 @@
 class UriSerializer extends TextSerializer<Uri> {
   const UriSerializer();
 
+  @override
   Uri readFrom(Iterator<Object?> stream, DeserializationState? state) {
     String uriAsString = const DartString().readFrom(stream, state);
     return Uri.parse(uriAsString);
   }
 
+  @override
   void writeTo(StringBuffer buffer, Uri object, SerializationState? state) {
     const DartString().writeTo(buffer, object.toString(), state);
   }
@@ -258,6 +271,7 @@
     _serializers.addAll(tagsAndSerializers.values);
   }
 
+  @override
   T readFrom(Iterator<Object?> stream, DeserializationState? state) {
     Object? iterator = stream.current;
     if (iterator is! Iterator<Object?>) {
@@ -284,6 +298,7 @@
     throw StateError("Unrecognized tag '${tag}'.");
   }
 
+  @override
   void writeTo(StringBuffer buffer, T object, SerializationState? state) {
     String tag = tagger.tag(object);
     for (int i = 0; i < _tags.length; ++i) {
@@ -310,14 +325,17 @@
 
   const Wrapped(this.unwrap, this.wrap, this.contents);
 
+  @override
   K readFrom(Iterator<Object?> stream, DeserializationState? state) {
     return wrap(contents.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, K object, SerializationState? state) {
     contents.writeTo(buffer, unwrap(object), state);
   }
 
+  @override
   bool get isEmpty => contents.isEmpty;
 }
 
@@ -326,6 +344,7 @@
 
   const ScopedUse();
 
+  @override
   T readFrom(Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
       throw StateError(
@@ -335,6 +354,7 @@
         as T;
   }
 
+  @override
   void writeTo(StringBuffer buffer, T object, SerializationState? state) {
     if (state == null) {
       throw StateError(
@@ -351,12 +371,14 @@
 
   const Tuple2Serializer(this.first, this.second);
 
+  @override
   Tuple2<T1, T2> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple2(
         first.readFrom(stream, state), second.readFrom(stream, state));
   }
 
+  @override
   void writeTo(
       StringBuffer buffer, Tuple2<T1, T2> object, SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -379,12 +401,14 @@
 
   const Tuple3Serializer(this.first, this.second, this.third);
 
+  @override
   Tuple3<T1, T2, T3> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple3(first.readFrom(stream, state),
         second.readFrom(stream, state), third.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple3<T1, T2, T3> object,
       SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -412,6 +436,7 @@
 
   const Tuple4Serializer(this.first, this.second, this.third, this.fourth);
 
+  @override
   Tuple4<T1, T2, T3, T4> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple4(
@@ -421,6 +446,7 @@
         fourth.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple4<T1, T2, T3, T4> object,
       SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -453,6 +479,7 @@
   const Tuple5Serializer(
       this.first, this.second, this.third, this.fourth, this.fifth);
 
+  @override
   Tuple5<T1, T2, T3, T4, T5> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple5(
@@ -463,6 +490,7 @@
         fifth.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple5<T1, T2, T3, T4, T5> object,
       SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -499,6 +527,7 @@
   const Tuple6Serializer(
       this.first, this.second, this.third, this.fourth, this.fifth, this.sixth);
 
+  @override
   Tuple6<T1, T2, T3, T4, T5, T6> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple6(
@@ -510,6 +539,7 @@
         sixth.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple6<T1, T2, T3, T4, T5, T6> object,
       SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -551,6 +581,7 @@
   const Tuple7Serializer(this.first, this.second, this.third, this.fourth,
       this.fifth, this.sixth, this.seventh);
 
+  @override
   Tuple7<T1, T2, T3, T4, T5, T6, T7> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple7(
@@ -563,6 +594,7 @@
         seventh.readFrom(stream, state));
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple7<T1, T2, T3, T4, T5, T6, T7> object,
       SerializationState? state) {
     first.writeTo(buffer, object.first, state);
@@ -608,6 +640,7 @@
   const Tuple8Serializer(this.first, this.second, this.third, this.fourth,
       this.fifth, this.sixth, this.seventh, this.eighth);
 
+  @override
   Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     return new Tuple8(
@@ -621,6 +654,7 @@
         eighth.readFrom(stream, state));
   }
 
+  @override
   void writeTo(
       StringBuffer buffer,
       Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> object,
@@ -663,6 +697,7 @@
 
   const ListSerializer(this.elements);
 
+  @override
   List<T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
     Object? iterator = stream.current;
     if (iterator is! Iterator<Object?>) {
@@ -677,6 +712,7 @@
     return result;
   }
 
+  @override
   void writeTo(StringBuffer buffer, List<T> object, SerializationState? state) {
     buffer.write('(');
     for (int i = 0; i < object.length; ++i) {
@@ -692,6 +728,7 @@
 
   const Optional(this.contents);
 
+  @override
   T? readFrom(Iterator<Object?> stream, DeserializationState? state) {
     if (stream.current == '_') {
       stream.moveNext();
@@ -700,6 +737,7 @@
     return contents.readFrom(stream, state);
   }
 
+  @override
   void writeTo(StringBuffer buffer, T? object, SerializationState? state) {
     if (object == null) {
       buffer.write('_');
@@ -720,6 +758,7 @@
   Binder(TextSerializer<T> contents)
       : namedContents = new Tuple2Serializer(const DartString(), contents);
 
+  @override
   Tuple2<String, T> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
@@ -733,6 +772,7 @@
     return new Tuple2(name, object);
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple2<String?, T> namedObject,
       SerializationState? state) {
     if (state == null) {
@@ -758,6 +798,7 @@
 
   const Bind(this.pattern, this.term);
 
+  @override
   Tuple2<P, T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
       throw StateError(
@@ -771,6 +812,7 @@
     return new Tuple2(first, second);
   }
 
+  @override
   void writeTo(
       StringBuffer buffer, Tuple2<P, T> tuple, SerializationState? state) {
     if (state == null) {
@@ -797,6 +839,7 @@
 
   const Rebind(this.pattern1, this.pattern2);
 
+  @override
   Tuple2<P, T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
       throw StateError(
@@ -813,6 +856,7 @@
     return new Tuple2(first, second);
   }
 
+  @override
   void writeTo(
       StringBuffer buffer, Tuple2<P, T> tuple, SerializationState? state) {
     if (state == null) {
@@ -837,6 +881,7 @@
 
   const Zip(this.lists, this.zip, this.unzip);
 
+  @override
   List<T> readFrom(Iterator<Object?> stream, DeserializationState? state) {
     Tuple2<List<T1>, List<T2>> toZip = lists.readFrom(stream, state);
     List<T1> firsts = toZip.first;
@@ -854,6 +899,7 @@
     return zipped;
   }
 
+  @override
   void writeTo(StringBuffer buffer, List<T> zipped, SerializationState? state) {
     List<T1> firsts;
     List<T2> seconds;
diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart
index dab2bc7..a8a0283 100644
--- a/pkg/kernel/lib/text/text_serialization_verifier.dart
+++ b/pkg/kernel/lib/text/text_serialization_verifier.dart
@@ -39,6 +39,7 @@
 
   String get nameForDebugging;
 
+  @override
   int compareTo(RoundTripStatus other) {
     Node thisNode = this.node;
     Node otherNode = other.node;
@@ -111,6 +112,7 @@
     }
   }
 
+  @override
   String toString() {
     StringBuffer sb = new StringBuffer();
     printOn(sb);
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 0a49543..0f6e9f5 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -15,6 +15,7 @@
 class NameTagger implements Tagger<Name> {
   const NameTagger();
 
+  @override
   String tag(Name name) => name.isPrivate ? "private" : "public";
 }
 
@@ -33,92 +34,153 @@
     implements Tagger<Expression> {
   const ExpressionTagger();
 
+  @override
   String tag(Expression expression) => expression.accept(this);
 
+  @override
   String visitStringLiteral(StringLiteral _) => "string";
+  @override
   String visitIntLiteral(IntLiteral _) => "int";
+  @override
   String visitDoubleLiteral(DoubleLiteral _) => "double";
+  @override
   String visitBoolLiteral(BoolLiteral _) => "bool";
+  @override
   String visitNullLiteral(NullLiteral _) => "null";
+  @override
   String visitInvalidExpression(InvalidExpression _) => "invalid";
+  @override
   String visitNot(Not _) => "not";
+  @override
   String visitLogicalExpression(LogicalExpression expression) {
     return logicalExpressionOperatorToString(expression.operatorEnum);
   }
 
+  @override
   String visitStringConcatenation(StringConcatenation _) => "concat";
+  @override
   String visitSymbolLiteral(SymbolLiteral _) => "symbol";
+  @override
   String visitThisExpression(ThisExpression _) => "this";
+  @override
   String visitRethrow(Rethrow _) => "rethrow";
+  @override
   String visitThrow(Throw _) => "throw";
+  @override
   String visitAwaitExpression(AwaitExpression _) => "await";
+  @override
   String visitConditionalExpression(ConditionalExpression _) => "cond";
+  @override
   String visitIsExpression(IsExpression _) => "is";
+  @override
   String visitAsExpression(AsExpression _) => "as";
+  @override
   String visitTypeLiteral(TypeLiteral _) => "type";
+  @override
   String visitListLiteral(ListLiteral expression) {
     return expression.isConst ? "const-list" : "list";
   }
 
+  @override
   String visitSetLiteral(SetLiteral expression) {
     return expression.isConst ? "const-set" : "set";
   }
 
+  @override
   String visitMapLiteral(MapLiteral expression) {
     return expression.isConst ? "const-map" : "map";
   }
 
+  @override
   String visitLet(Let _) => "let";
 
+  @override
   String visitInstanceGet(InstanceGet _) => "get-instance";
+  @override
   String visitInstanceSet(InstanceSet _) => "set-instance";
+  @override
   String visitDynamicGet(DynamicGet _) => "get-dynamic";
+  @override
   String visitDynamicSet(DynamicSet _) => "set-dynamic";
+  @override
   String visitInstanceTearOff(InstanceTearOff _) => "tearoff-instance";
+  @override
   String visitFunctionTearOff(FunctionTearOff _) => "tearoff-function";
+  @override
   String visitSuperPropertyGet(SuperPropertyGet _) => "get-super";
+  @override
   String visitSuperPropertySet(SuperPropertySet _) => "set-super";
+  @override
   String visitInstanceInvocation(InstanceInvocation _) => "invoke-instance";
+  @override
   String visitInstanceGetterInvocation(InstanceGetterInvocation _) =>
       "invoke-instance-getter";
+  @override
   String visitDynamicInvocation(DynamicInvocation _) => "invoke-dynamic";
+  @override
   String visitFunctionInvocation(FunctionInvocation _) => "invoke-function";
+  @override
   String visitLocalFunctionInvocation(LocalFunctionInvocation _) =>
       "invoke-local-function";
+  @override
   String visitEqualsNull(EqualsNull _) => "equals-null";
+  @override
   String visitEqualsCall(EqualsCall _) => "equals-call";
+  @override
   String visitSuperMethodInvocation(SuperMethodInvocation _) => "invoke-super";
 
+  @override
   String visitVariableGet(VariableGet _) => "get-var";
+  @override
   String visitVariableSet(VariableSet _) => "set-var";
+  @override
   String visitStaticGet(StaticGet _) => "get-static";
+  @override
   String visitStaticSet(StaticSet _) => "set-static";
+  @override
   String visitStaticTearOff(StaticTearOff _) => "tearoff-static";
+  @override
   String visitConstructorTearOff(ConstructorTearOff _) => "tearoff-constructor";
+  @override
   String visitRedirectingFactoryTearOff(RedirectingFactoryTearOff _) =>
       "tearoff-redirecting-factory";
+  @override
   String visitTypedefTearOff(TypedefTearOff _) => "tearoff-typedef";
+  @override
   String visitStaticInvocation(StaticInvocation expression) {
     return expression.isConst ? "invoke-const-static" : "invoke-static";
   }
 
+  @override
   String visitConstructorInvocation(ConstructorInvocation expression) {
     return expression.isConst
         ? "invoke-const-constructor"
         : "invoke-constructor";
   }
 
+  @override
   String visitFunctionExpression(FunctionExpression _) => "fun";
+  @override
   String visitListConcatenation(ListConcatenation _) => "lists";
+  @override
   String visitSetConcatenation(SetConcatenation _) => "sets";
+  @override
   String visitMapConcatenation(MapConcatenation _) => "maps";
+  @override
   String visitBlockExpression(BlockExpression _) => "let-block";
+  @override
   String visitInstantiation(Instantiation _) => "apply";
+  @override
   String visitNullCheck(NullCheck _) => "not-null";
+  @override
   String visitFileUriExpression(FileUriExpression _) => "with-uri";
+  @override
   String visitCheckLibraryIsLoaded(CheckLibraryIsLoaded _) => "is-loaded";
+  @override
   String visitLoadLibrary(LoadLibrary _) => "load";
+  @override
   String visitConstantExpression(ConstantExpression _) => "const";
+  @override
   String visitInstanceCreation(InstanceCreation _) => "object";
 
   @override
@@ -574,6 +636,7 @@
 class InstanceAccessKindTagger implements Tagger<InstanceAccessKind> {
   const InstanceAccessKindTagger();
 
+  @override
   String tag(InstanceAccessKind kind) {
     return instanceAccessKindToName[kind] ??
         (throw StateError("Unknown InstanceAccessKind flag value: ${kind}."));
@@ -665,6 +728,7 @@
 class DynamicAccessKindTagger implements Tagger<DynamicAccessKind> {
   const DynamicAccessKindTagger();
 
+  @override
   String tag(DynamicAccessKind kind) {
     return dynamicAccessKindToName[kind] ??
         (throw StateError("Unknown DynamicAccessKind flag value: ${kind}."));
@@ -704,6 +768,7 @@
 class FunctionAccessKindTagger implements Tagger<FunctionAccessKind> {
   const FunctionAccessKindTagger();
 
+  @override
   String tag(FunctionAccessKind kind) {
     return functionAccessKindToName[kind] ??
         (throw StateError("Unknown FunctionAccessKind flag value: ${kind}."));
@@ -849,6 +914,7 @@
     }
   }
 
+  @override
   CanonicalName readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
@@ -863,6 +929,7 @@
     return name;
   }
 
+  @override
   void writeTo(
       StringBuffer buffer, CanonicalName name, SerializationState? state) {
     StringBuffer sb = new StringBuffer();
@@ -1153,6 +1220,7 @@
 };
 
 class VariableDeclarationFlagTagger implements Tagger<int> {
+  @override
   String tag(int flag) {
     return variableDeclarationFlagToName[flag] ??
         (throw StateError("Unknown VariableDeclaration flag value: ${flag}."));
@@ -1226,17 +1294,28 @@
     implements Tagger<DartType> {
   const DartTypeTagger();
 
+  @override
   String tag(DartType type) => type.accept(this);
 
+  @override
   String visitInvalidType(InvalidType _) => "invalid";
+  @override
   String visitDynamicType(DynamicType _) => "dynamic";
+  @override
   String visitVoidType(VoidType _) => "void";
+  @override
   String visitFunctionType(FunctionType _) => "->";
+  @override
   String visitTypeParameterType(TypeParameterType _) => "par";
+  @override
   String visitInterfaceType(InterfaceType _) => "interface";
+  @override
   String visitNeverType(NeverType _) => "never";
+  @override
   String visitTypedefType(TypedefType _) => "typedef";
+  @override
   String visitFutureOrType(FutureOrType _) => "futureor";
+  @override
   String visitNullType(NullType _) => "null-type";
 
   @override
@@ -1390,37 +1469,58 @@
     implements Tagger<Statement> {
   const StatementTagger();
 
+  @override
   String tag(Statement statement) => statement.accept(this);
 
+  @override
   String visitExpressionStatement(ExpressionStatement _) => "expr";
+  @override
   String visitReturnStatement(ReturnStatement node) {
     return node.expression == null ? "ret-void" : "ret";
   }
 
+  @override
   String visitYieldStatement(YieldStatement _) => "yield";
+  @override
   String visitBlock(Block _) => "block";
+  @override
   String visitVariableDeclaration(VariableDeclaration _) => "local";
+  @override
   String visitIfStatement(IfStatement node) {
     return node.otherwise == null ? "if" : "if-else";
   }
 
+  @override
   String visitEmptyStatement(EmptyStatement node) => "skip";
+  @override
   String visitWhileStatement(WhileStatement node) => "while";
+  @override
   String visitDoStatement(DoStatement node) => "do-while";
+  @override
   String visitForStatement(ForStatement node) => "for";
+  @override
   String visitForInStatement(ForInStatement node) {
     return node.isAsync ? "await-for-in" : "for-in";
   }
 
+  @override
   String visitAssertStatement(AssertStatement node) => "assert";
+  @override
   String visitAssertBlock(AssertBlock node) => "assert-block";
+  @override
   String visitLabeledStatement(LabeledStatement node) => "label";
+  @override
   String visitBreakStatement(BreakStatement node) => "break";
+  @override
   String visitTryFinally(TryFinally node) => "try-finally";
+  @override
   String visitTryCatch(TryCatch node) => "try-catch";
+  @override
   String visitSwitchStatement(SwitchStatement node) => "switch";
+  @override
   String visitContinueSwitchStatement(ContinueSwitchStatement node) =>
       "continue";
+  @override
   String visitFunctionDeclaration(FunctionDeclaration node) => "local-fun";
 
   @override
@@ -1509,6 +1609,7 @@
     extends TextSerializer<Tuple2<List<Statement>, Expression?>> {
   const BlockSerializer();
 
+  @override
   Tuple2<List<Statement>, Expression?> readFrom(
       Iterator<Object?> stream, DeserializationState? state) {
     if (state == null) {
@@ -1535,6 +1636,7 @@
     return new Tuple2(statements, expression);
   }
 
+  @override
   void writeTo(StringBuffer buffer, Tuple2<List<Statement>, Expression?> tuple,
       SerializationState? state) {
     if (state == null) {
@@ -1727,6 +1829,7 @@
                 (SwitchCase z) => Tuple2(z, z.body))));
 
 class SwitchCaseTagger implements Tagger<SwitchCase> {
+  @override
   String tag(SwitchCase node) {
     return node.isDefault ? "default" : "case";
   }
@@ -1777,6 +1880,7 @@
 class AsyncMarkerTagger implements Tagger<AsyncMarker> {
   const AsyncMarkerTagger();
 
+  @override
   String tag(AsyncMarker node) {
     return asyncMarkerToName[node] ?? (throw new UnsupportedError("${node}"));
   }
@@ -1791,8 +1895,10 @@
     functionNodeWithInitializersSerializer = Wrapped<
             Tuple2<
                 AsyncMarker,
-                Tuple2< /**/
-                    Tuple2< /**/
+                Tuple2<
+                    /**/
+                    Tuple2<
+                        /**/
                         List<TypeParameter>,
                         Tuple3<
                             List<VariableDeclaration>,
@@ -1856,6 +1962,7 @@
 class ProcedureFlagTagger implements Tagger<int> {
   const ProcedureFlagTagger();
 
+  @override
   String tag(int flag) {
     return procedureFlagToName[flag] ??
         (throw StateError("Unknown Procedure flag value: ${flag}."));
@@ -1883,6 +1990,7 @@
 class FieldFlagTagger implements Tagger<int> {
   const FieldFlagTagger();
 
+  @override
   String tag(int flag) {
     return fieldFlagToName[flag] ??
         (throw StateError("Unknown Field flag value: ${flag}."));
@@ -1904,6 +2012,7 @@
 class ConstructorFlagTagger implements Tagger<int> {
   const ConstructorFlagTagger();
 
+  @override
   String tag(int flag) {
     return constructorFlagToName[flag] ??
         (throw StateError("Unknown Constructor flag value: ${flag}."));
@@ -1925,6 +2034,7 @@
 class RedirectingFactoryFlagTagger implements Tagger<int> {
   const RedirectingFactoryFlagTagger();
 
+  @override
   String tag(int flag) {
     return redirectingFactoryFlagToName[flag] ??
         (throw StateError("Unknown RedirectingFactory flag value: ${flag}."));
@@ -1943,6 +2053,7 @@
 class MemberTagger implements Tagger<Member> {
   const MemberTagger();
 
+  @override
   String tag(Member node) {
     if (node is Field) {
       return node.hasSetter ? "mutable-field" : "immutable-field";
@@ -2025,13 +2136,14 @@
         Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
             functionNodeSerializer, UriSerializer()));
 
-TextSerializer<Procedure> factorySerializer = Wrapped<
-        Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
-    (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
-    (u) => Procedure(u.first, ProcedureKind.Factory, u.third, fileUri: u.fourth)
-      ..flags = u.second,
-    Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
-        functionNodeSerializer, UriSerializer()));
+TextSerializer<Procedure> factorySerializer =
+    Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+        (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
+        (u) => Procedure(u.first, ProcedureKind.Factory, u.third,
+            fileUri: u.fourth)
+          ..flags = u.second,
+        Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+            functionNodeSerializer, UriSerializer()));
 
 TextSerializer<Constructor> constructorSerializer = Wrapped<
         Tuple4<Name, int, Tuple2<FunctionNode, List<Initializer>?>, Uri>,
@@ -2076,6 +2188,7 @@
 class LibraryTagger implements Tagger<Library> {
   const LibraryTagger();
 
+  @override
   String tag(Library node) {
     return node.isNonNullableByDefault ? "null-safe" : "legacy";
   }
@@ -2091,6 +2204,7 @@
 class LibraryFlagTagger implements Tagger<int> {
   const LibraryFlagTagger();
 
+  @override
   String tag(int flag) {
     return libraryFlagToName[flag] ??
         (throw StateError("Unknown Library flag value: ${flag}."));
@@ -2137,6 +2251,7 @@
         ListSerializer(librarySerializer));
 
 class ShowHideTagger implements Tagger<Combinator> {
+  @override
   String tag(Combinator node) => node.isShow ? "show" : "hide";
 }
 
@@ -2171,30 +2286,48 @@
     implements Tagger<Constant> {
   const ConstantTagger();
 
+  @override
   String tag(Constant node) => node.accept(this);
 
+  @override
   String visitBoolConstant(BoolConstant node) => "const-bool";
+  @override
   String visitDoubleConstant(DoubleConstant node) => "const-double";
+  @override
   String visitInstanceConstant(InstanceConstant node) => "const-object";
+  @override
   String visitIntConstant(IntConstant node) => "const-int";
+  @override
   String visitListConstant(ListConstant node) => "const-list";
+  @override
   String visitMapConstant(MapConstant node) => "const-map";
+  @override
   String visitNullConstant(NullConstant node) => "const-null";
+  @override
   String visitInstantiationConstant(InstantiationConstant node) =>
       "const-apply";
+  @override
   String visitSetConstant(SetConstant node) => "const-set";
+  @override
   String visitStringConstant(StringConstant node) => "const-string";
+  @override
   String visitSymbolConstant(SymbolConstant node) => "const-symbol";
+  @override
   String visitStaticTearOffConstant(StaticTearOffConstant node) =>
       "const-tearoff-static";
+  @override
   String visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
       "const-tearoff-constructor";
+  @override
   String visitRedirectingFactoryTearOffConstant(
           RedirectingFactoryTearOffConstant node) =>
       "const-tearoff-redirecting-factory";
+  @override
   String visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
       "const-tearoff-typedef";
+  @override
   String visitTypeLiteralConstant(TypeLiteralConstant node) => "const-type";
+  @override
   String visitUnevaluatedConstant(UnevaluatedConstant node) => "const-expr";
 
   @override
@@ -2335,6 +2468,7 @@
 class InitializerTagger implements Tagger<Initializer> {
   const InitializerTagger();
 
+  @override
   String tag(Initializer node) {
     if (node is AssertInitializer) {
       return "assert";
@@ -2406,6 +2540,7 @@
 class ClassFlagTagger implements Tagger<int> {
   const ClassFlagTagger();
 
+  @override
   String tag(int flag) {
     return classFlagToName[flag] ??
         (throw StateError("Unknown Class flag value: ${flag}."));
@@ -2482,6 +2617,7 @@
 class ExtensionMemberDescriptorFlagTagger implements Tagger<int> {
   const ExtensionMemberDescriptorFlagTagger();
 
+  @override
   String tag(int flag) {
     return extensionMemberDescriptorFlagToName[flag] ??
         (throw StateError(
@@ -2510,6 +2646,7 @@
 class ExtensionMemberKindTagger implements Tagger<ExtensionMemberKind> {
   const ExtensionMemberKindTagger();
 
+  @override
   String tag(ExtensionMemberKind kind) {
     return extensionMemberKindToName[kind] ??
         (throw StateError("Unknown ExtensionMemberKind flag value: ${kind}."));
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 848a1ce..2866e54 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -157,13 +157,21 @@
 
   // Simple literals.  These are pure expressions so they can be evaluated after
   // an await to their right.
+  @override
   TreeNode visitSymbolLiteral(SymbolLiteral expr) => expr;
+  @override
   TreeNode visitTypeLiteral(TypeLiteral expr) => expr;
+  @override
   TreeNode visitThisExpression(ThisExpression expr) => expr;
+  @override
   TreeNode visitStringLiteral(StringLiteral expr) => expr;
+  @override
   TreeNode visitIntLiteral(IntLiteral expr) => expr;
+  @override
   TreeNode visitDoubleLiteral(DoubleLiteral expr) => expr;
+  @override
   TreeNode visitBoolLiteral(BoolLiteral expr) => expr;
+  @override
   TreeNode visitNullLiteral(NullLiteral expr) => expr;
 
   // Nullary expressions with effects.
@@ -175,13 +183,18 @@
     return expr;
   }
 
+  @override
   TreeNode visitSuperPropertyGet(SuperPropertyGet expr) => nullary(expr);
+  @override
   TreeNode visitStaticGet(StaticGet expr) => nullary(expr);
+  @override
   TreeNode visitStaticTearOff(StaticTearOff expr) => nullary(expr);
+  @override
   TreeNode visitRethrow(Rethrow expr) => nullary(expr);
 
   // Getting a final or const variable is not an effect so it can be evaluated
   // after an await to its right.
+  @override
   TreeNode visitVariableGet(VariableGet expr) {
     Expression result = expr;
     if (seenAwait && !expr.variable.isFinal && !expr.variable.isConst) {
@@ -271,6 +284,7 @@
     });
   }
 
+  @override
   TreeNode visitArguments(Arguments args) {
     for (var named in args.named.reversed) {
       named.value = transform(named.value)..parent = named;
@@ -326,24 +340,28 @@
     });
   }
 
+  @override
   TreeNode visitSuperMethodInvocation(SuperMethodInvocation expr) {
     return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
+  @override
   TreeNode visitStaticInvocation(StaticInvocation expr) {
     return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
+  @override
   TreeNode visitConstructorInvocation(ConstructorInvocation expr) {
     return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
+  @override
   TreeNode visitStringConcatenation(StringConcatenation expr) {
     return transformTreeNode(expr, () {
       var expressions = expr.expressions;
@@ -353,6 +371,7 @@
     });
   }
 
+  @override
   TreeNode visitListLiteral(ListLiteral expr) {
     return transformTreeNode(expr, () {
       var expressions = expr.expressions;
@@ -362,6 +381,7 @@
     });
   }
 
+  @override
   TreeNode visitMapLiteral(MapLiteral expr) {
     return transformTreeNode(expr, () {
       for (var entry in expr.entries.reversed) {
@@ -372,6 +392,7 @@
   }
 
   // Control flow.
+  @override
   TreeNode visitLogicalExpression(LogicalExpression expr) {
     var shouldName = seenAwait;
 
@@ -437,6 +458,7 @@
     return unsafeCastVariableGet(result, type);
   }
 
+  @override
   TreeNode visitConditionalExpression(ConditionalExpression expr) {
     // Then and otherwise are delimited because they are conditionally
     // evaluated.
@@ -502,6 +524,7 @@
   }
 
   // Others.
+  @override
   TreeNode visitAwaitExpression(AwaitExpression expr) {
     final R = continuationRewriter;
     var shouldName = seenAwait;
@@ -558,11 +581,13 @@
     return result;
   }
 
+  @override
   TreeNode visitFunctionExpression(FunctionExpression expr) {
     expr.transformChildren(this);
     return expr;
   }
 
+  @override
   TreeNode visitLet(Let expr) {
     var body = transform(expr.body);
 
@@ -604,12 +629,14 @@
     }
   }
 
+  @override
   visitFunctionNode(FunctionNode node) {
     var nestedRewriter = new RecursiveContinuationRewriter(
         continuationRewriter.helper, _staticTypeContext);
     return nestedRewriter.transform(node);
   }
 
+  @override
   TreeNode visitBlockExpression(BlockExpression expr) {
     return transformTreeNode(expr, () {
       expr.value = transform(expr.value)..parent = expr;
@@ -648,6 +675,7 @@
     return null;
   }
 
+  @override
   TreeNode defaultStatement(Statement stmt) {
     throw new UnsupportedError(
         "Use _rewriteStatement to transform statement: ${stmt}");
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index fd8476f..3baab93 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -99,6 +99,7 @@
     return transform(node);
   }
 
+  @override
   visitField(Field node, TreeNode? removalSentinel) {
     staticTypeContext.enterMember(node);
     final result = super.visitField(node, removalSentinel);
@@ -106,6 +107,7 @@
     return result;
   }
 
+  @override
   visitConstructor(Constructor node, TreeNode? removalSentinel) {
     staticTypeContext.enterMember(node);
     final result = super.visitConstructor(node, removalSentinel);
@@ -283,6 +285,7 @@
     return new YieldStatement(value, isNative: true);
   }
 
+  @override
   TreeNode visitTryCatch(TryCatch node, TreeNode? removalSentinel) {
     // ignore: unnecessary_null_comparison
     if (node.body != null) {
@@ -298,6 +301,7 @@
     return node;
   }
 
+  @override
   TreeNode visitTryFinally(TryFinally node, TreeNode? removalSentinel) {
     // ignore: unnecessary_null_comparison
     if (node.body != null) {
@@ -492,6 +496,7 @@
     ]);
   }
 
+  @override
   visitYieldStatement(YieldStatement node, TreeNode? removalSentinel) {
     Expression transformedExpression = transform(node.expression);
 
@@ -517,6 +522,7 @@
     return new Block(statements);
   }
 
+  @override
   TreeNode visitReturnStatement(
       ReturnStatement node, TreeNode? removalSentinel) {
     // sync* functions cannot return a value.
@@ -655,6 +661,7 @@
 
   List<Statement> statements = <Statement>[];
 
+  @override
   TreeNode visitExpressionStatement(
       ExpressionStatement stmt, TreeNode? removalSentinel) {
     stmt.expression = expressionRewriter!.rewrite(stmt.expression, statements)
@@ -663,6 +670,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitBlock(Block stmt, TreeNode? removalSentinel) {
     var saved = statements;
     statements = <Statement>[];
@@ -674,11 +682,13 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitEmptyStatement(EmptyStatement stmt, TreeNode? removalSentinel) {
     statements.add(stmt);
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitAssertBlock(AssertBlock stmt, TreeNode? removalSentinel) {
     var saved = statements;
     statements = <Statement>[];
@@ -690,6 +700,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitAssertStatement(
       AssertStatement stmt, TreeNode? removalSentinel) {
     var condEffects = <Statement>[];
@@ -760,6 +771,7 @@
     return result;
   }
 
+  @override
   TreeNode visitLabeledStatement(
       LabeledStatement stmt, TreeNode? removalSentinel) {
     stmt.body = visitDelimited(stmt.body)..parent = stmt;
@@ -767,11 +779,13 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitBreakStatement(BreakStatement stmt, TreeNode? removalSentinel) {
     statements.add(stmt);
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitWhileStatement(WhileStatement stmt, TreeNode? removalSentinel) {
     Statement body = visitDelimited(stmt.body);
     List<Statement> effects = <Statement>[];
@@ -801,6 +815,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitDoStatement(DoStatement stmt, TreeNode? removalSentinel) {
     Statement body = visitDelimited(stmt.body);
     List<Statement> effects = <Statement>[];
@@ -820,6 +835,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitForStatement(ForStatement stmt, TreeNode? removalSentinel) {
     // Because of for-loop scoping and variable capture, it is tricky to deal
     // with await in the loop's variable initializers or update expressions.
@@ -832,7 +848,7 @@
       if (decl.initializer != null) {
         decl.initializer = expressionRewriter!
             .rewrite(decl.initializer!, statements)
-              ..parent = decl;
+          ..parent = decl;
       }
       isSimple = isSimple && statements.isEmpty;
       return statements;
@@ -963,6 +979,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitForInStatement(ForInStatement stmt, TreeNode? removalSentinel) {
     if (stmt.isAsync) {
       // Transform
@@ -1088,6 +1105,7 @@
     }
   }
 
+  @override
   TreeNode visitSwitchStatement(
       SwitchStatement stmt, TreeNode? removalSentinel) {
     stmt.expression = expressionRewriter!.rewrite(stmt.expression, statements)
@@ -1101,12 +1119,14 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitContinueSwitchStatement(
       ContinueSwitchStatement stmt, TreeNode? removalSentinel) {
     statements.add(stmt);
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitIfStatement(IfStatement stmt, TreeNode? removalSentinel) {
     stmt.condition = expressionRewriter!.rewrite(stmt.condition, statements)
       ..parent = stmt;
@@ -1118,6 +1138,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitTryCatch(TryCatch stmt, TreeNode? removalSentinel) {
     ++currentTryDepth;
     stmt.body = visitDelimited(stmt.body)..parent = stmt;
@@ -1132,6 +1153,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitTryFinally(TryFinally stmt, TreeNode? removalSentinel) {
     ++currentTryDepth;
     stmt.body = visitDelimited(stmt.body)..parent = stmt;
@@ -1143,6 +1165,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitYieldStatement(YieldStatement stmt, TreeNode? removalSentinel) {
     stmt.expression = expressionRewriter!.rewrite(stmt.expression, statements)
       ..parent = stmt;
@@ -1150,17 +1173,19 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitVariableDeclaration(
       VariableDeclaration stmt, TreeNode? removalSentinel) {
     if (stmt.initializer != null) {
       stmt.initializer = expressionRewriter!
           .rewrite(stmt.initializer!, statements)
-            ..parent = stmt;
+        ..parent = stmt;
     }
     statements.add(stmt);
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitFunctionDeclaration(
       FunctionDeclaration stmt, TreeNode? removalSentinel) {
     stmt.function = transform(stmt.function)..parent = stmt;
@@ -1168,6 +1193,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   defaultExpression(TreeNode node, TreeNode? removalSentinel) =>
       throw 'unreachable $node';
 }
@@ -1231,6 +1257,7 @@
     return enclosingFunction;
   }
 
+  @override
   Statement buildWrappedBody() {
     ++currentTryDepth;
     Statement body = super.buildWrappedBody();
@@ -1249,6 +1276,7 @@
     return tryFinally;
   }
 
+  @override
   Statement buildCatchBody(VariableDeclaration exceptionVariable,
       VariableDeclaration stackTraceVariable) {
     return new ExpressionStatement(new InstanceInvocation(
@@ -1264,6 +1292,7 @@
             as FunctionType));
   }
 
+  @override
   Statement buildReturn(Statement body) {
     // Async* functions cannot return a value.  The returns from the function
     // have been translated into breaks from the labeled body.
@@ -1273,6 +1302,7 @@
     ]);
   }
 
+  @override
   TreeNode visitYieldStatement(YieldStatement stmt, TreeNode? removalSentinel) {
     Expression expr = expressionRewriter!.rewrite(stmt.expression, statements);
 
@@ -1298,6 +1328,7 @@
     return removalSentinel ?? EmptyStatement();
   }
 
+  @override
   TreeNode visitReturnStatement(
       ReturnStatement node, TreeNode? removalSentinel) {
     // Async* functions cannot return a value.
@@ -1380,6 +1411,7 @@
   }
 
   // :async_op's try-catch catch body:
+  @override
   Statement buildCatchBody(exceptionVariable, stackTraceVariable) {
     // _completeOnAsyncError(_future, e, st, :is_sync)
     return ExpressionStatement(StaticInvocation(
@@ -1393,6 +1425,7 @@
   }
 
   // :async_op's try-catch try body:
+  @override
   Statement buildReturn(Statement body) {
     // Returns from the body have all been translated into assignments to the
     // return value variable followed by a break from the labeled body.
@@ -1413,6 +1446,7 @@
     ]);
   }
 
+  @override
   visitReturnStatement(ReturnStatement node, TreeNode? removalSentinel) {
     var expr = node.expression == null
         ? new NullLiteral()
diff --git a/pkg/kernel/lib/transformations/scanner.dart b/pkg/kernel/lib/transformations/scanner.dart
index 18c7814..ec75cbd 100644
--- a/pkg/kernel/lib/transformations/scanner.dart
+++ b/pkg/kernel/lib/transformations/scanner.dart
@@ -18,18 +18,22 @@
   Map<X, ScanResult<Y, TreeNode?>?> targets = new Map();
   Map<X, ScanError>? errors;
 
+  @override
   String toString() => 'ScanResult<$X,$Y>';
 }
 
 class ScanError {}
 
 abstract class ClassScanner<Y extends TreeNode?> implements Scanner<Class, Y> {
+  @override
   final Scanner<Y, TreeNode?>? next;
 
   ClassScanner(this.next);
 
+  @override
   bool predicate(Class node);
 
+  @override
   ScanResult<Class, Y> scan(TreeNode node) {
     ScanResult<Class, Y> result = new ScanResult<Class, Y>();
 
@@ -64,12 +68,15 @@
 }
 
 abstract class FieldScanner<Y extends TreeNode> implements Scanner<Field, Y> {
+  @override
   final Scanner<Y, TreeNode>? next;
 
   FieldScanner(this.next);
 
+  @override
   bool predicate(Field node);
 
+  @override
   ScanResult<Field, Y> scan(TreeNode node) {
     ScanResult<Field, Y> result = new ScanResult<Field, Y>();
 
@@ -115,12 +122,15 @@
 }
 
 abstract class MemberScanner<Y extends TreeNode> implements Scanner<Member, Y> {
+  @override
   final Scanner<Y, TreeNode?>? next;
 
   MemberScanner(this.next);
 
+  @override
   bool predicate(Member node);
 
+  @override
   ScanResult<Member, Y> scan(TreeNode node) {
     ScanResult<Member, Y> result = new ScanResult<Member, Y>();
 
@@ -167,12 +177,15 @@
 
 abstract class ProcedureScanner<Y extends TreeNode?>
     implements Scanner<Procedure, Y> {
+  @override
   final Scanner<Y, TreeNode>? next;
 
   ProcedureScanner(this.next);
 
+  @override
   bool predicate(Procedure node);
 
+  @override
   ScanResult<Procedure, Y> scan(TreeNode node) {
     ScanResult<Procedure, Y> result = new ScanResult<Procedure, Y>();
 
@@ -219,13 +232,16 @@
 
 abstract class ExpressionScanner<Y extends TreeNode>
     extends RecursiveResultVisitor<void> implements Scanner<Expression, Y> {
+  @override
   final Scanner<Y, TreeNode>? next;
   ScanResult<Expression, Y>? _result;
 
   ExpressionScanner(this.next);
 
+  @override
   bool predicate(Expression node);
 
+  @override
   ScanResult<Expression, Y> scan(TreeNode node) {
     ScanResult<Expression, Y> result =
         _result = new ScanResult<Expression, Y>();
@@ -245,13 +261,16 @@
 abstract class MethodInvocationScanner<Y extends TreeNode?>
     extends RecursiveVisitor
     implements Scanner<InstanceInvocationExpression, Y> {
+  @override
   final Scanner<Y, TreeNode>? next;
   ScanResult<InstanceInvocationExpression, Y>? _result;
 
   MethodInvocationScanner(this.next);
 
+  @override
   bool predicate(InstanceInvocationExpression node);
 
+  @override
   ScanResult<InstanceInvocationExpression, Y> scan(TreeNode node) {
     ScanResult<InstanceInvocationExpression, Y> result =
         _result = new ScanResult<InstanceInvocationExpression, Y>();
@@ -260,6 +279,7 @@
     return result;
   }
 
+  @override
   void visitInstanceInvocation(InstanceInvocation node) {
     if (predicate(node)) {
       _result!.targets[node] = next?.scan(node);
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index 61481e5..cbb27dc 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -15,12 +15,14 @@
 class ValueClassScanner extends ClassScanner<Null> {
   ValueClassScanner() : super(null);
 
+  @override
   bool predicate(Class node) => isValueClass(node);
 }
 
 class JenkinsClassScanner extends ClassScanner<Procedure> {
   JenkinsClassScanner(Scanner<Procedure, TreeNode?> next) : super(next);
 
+  @override
   bool predicate(Class node) {
     return node.name == "JenkinsSmiHash";
   }
@@ -29,6 +31,7 @@
 class HashCombineMethodsScanner extends ProcedureScanner<Null> {
   HashCombineMethodsScanner() : super(null);
 
+  @override
   bool predicate(Procedure node) {
     return node.name.text == "combine" || node.name.text == "finish";
   }
@@ -38,6 +41,7 @@
   AllMemberScanner(Scanner<InstanceInvocationExpression, TreeNode?> next)
       : super(next);
 
+  @override
   bool predicate(Member member) => true;
 }
 
@@ -50,6 +54,7 @@
   // @valueClass V {}
   // V v;
   // (v as dynamic).copyWith() as V
+  @override
   bool predicate(InstanceInvocationExpression node) {
     return node.name.text == "copyWith" &&
         _isValueClassAsConstruct(node.receiver);
@@ -346,8 +351,8 @@
       .map<VariableDeclaration>(
           (f) => VariableDeclaration(f.name, type: f.type))
       .toList()
-        ..addAll(cls.fields.map<VariableDeclaration>(
-            (f) => VariableDeclaration(f.name.text, type: f.type)));
+    ..addAll(cls.fields.map<VariableDeclaration>(
+        (f) => VariableDeclaration(f.name.text, type: f.type)));
 }
 
 void removeValueClassAnnotation(Class cls) {
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 9581107..f836d1e 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -298,6 +298,7 @@
 
   const _NullSubstitution();
 
+  @override
   DartType getSubstitute(TypeParameter parameter, bool upperBound) {
     return new TypeParameterType.forAlphaRenaming(parameter, parameter);
   }
@@ -318,6 +319,7 @@
 
   _MapSubstitution(this.upper, this.lower);
 
+  @override
   DartType? getSubstitute(TypeParameter parameter, bool upperBound) {
     return upperBound ? upper[parameter] : lower[parameter];
   }
@@ -335,10 +337,12 @@
     }
   }
 
+  @override
   DartType? lookup(TypeParameter parameter, bool upperBound) {
     return substitution.getSubstitute(parameter, upperBound);
   }
 
+  @override
   TypeParameter freshTypeParameter(TypeParameter node) {
     throw 'Create a fresh environment first';
   }
@@ -349,6 +353,7 @@
 
   _ClassBottomSubstitution(this.class_);
 
+  @override
   DartType? getSubstitute(TypeParameter parameter, bool upperBound) {
     if (parameter.parent == class_) {
       return upperBound ? const NeverType.nonNullable() : const DynamicType();
@@ -362,6 +367,7 @@
 
   _CombinedSubstitution(this.first, this.second);
 
+  @override
   DartType? getSubstitute(TypeParameter parameter, bool upperBound) {
     return first.getSubstitute(parameter, upperBound) ??
         second.getSubstitute(parameter, upperBound);
@@ -376,6 +382,7 @@
 
   _FilteredSubstitution(this.base, this.filterFn);
 
+  @override
   DartType? getSubstitute(TypeParameter parameter, bool upperBound) {
     return filterFn(parameter)
         ? base.getSubstitute(parameter, upperBound)
@@ -388,10 +395,12 @@
 
   _InnerTypeSubstitutor(_TypeSubstitutor? outer) : super(outer);
 
+  @override
   DartType? lookup(TypeParameter parameter, bool upperBound) {
     return substitution[parameter];
   }
 
+  @override
   TypeParameter freshTypeParameter(TypeParameter node) {
     TypeParameter fresh = new TypeParameter(node.name)..flags = node.flags;
     TypeParameterType typeParameterType = substitution[node] =
@@ -578,13 +587,20 @@
 
   DartType visit(DartType node) => node.accept(this);
 
+  @override
   DartType defaultDartType(DartType node) => node;
+  @override
   DartType visitInvalidType(InvalidType node) => node;
+  @override
   DartType visitDynamicType(DynamicType node) => node;
+  @override
   DartType visitVoidType(VoidType node) => node;
+  @override
   DartType visitNeverType(NeverType node) => node;
+  @override
   DartType visitNullType(NullType node) => node;
 
+  @override
   DartType visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) return node;
     int before = useCounter;
@@ -593,6 +609,7 @@
     return new InterfaceType(node.classNode, node.nullability, typeArguments);
   }
 
+  @override
   DartType visitFutureOrType(FutureOrType node) {
     int before = useCounter;
     DartType typeArgument = node.typeArgument.accept(this);
@@ -600,6 +617,7 @@
     return new FutureOrType(typeArgument, node.declaredNullability);
   }
 
+  @override
   DartType visitTypedefType(TypedefType node) {
     if (node.typeArguments.isEmpty) return node;
     int before = useCounter;
@@ -615,6 +633,7 @@
 
   TypeParameter freshTypeParameter(TypeParameter node);
 
+  @override
   DartType visitFunctionType(FunctionType node) {
     // This is a bit tricky because we have to generate fresh type parameters
     // in order to change the bounds.  At the same time, if the function type
@@ -682,6 +701,7 @@
     return null;
   }
 
+  @override
   DartType visitTypeParameterType(TypeParameterType node) {
     DartType? replacement = getSubstitute(node.parameter);
     if (replacement is InvalidType) return replacement;
@@ -749,6 +769,7 @@
     return visit(node.type);
   }
 
+  @override
   bool defaultDartType(DartType node) {
     if (unhandledTypeHandler == null) {
       throw new UnsupportedError("Unsupported type '${node.runtimeType}'.");
@@ -757,28 +778,38 @@
     }
   }
 
+  @override
   bool visitNeverType(NeverType node) => false;
+  @override
   bool visitNullType(NullType node) => false;
+  @override
   bool visitInvalidType(InvalidType node) => false;
+  @override
   bool visitDynamicType(DynamicType node) => false;
+  @override
   bool visitVoidType(VoidType node) => false;
 
+  @override
   bool visitInterfaceType(InterfaceType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitExtensionType(ExtensionType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFutureOrType(FutureOrType node) {
     return visit(node.typeArgument);
   }
 
+  @override
   bool visitTypedefType(TypedefType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFunctionType(FunctionType node) {
     return node.typeParameters.any(handleTypeParameter) ||
         node.positionalParameters.any(visit) ||
@@ -786,6 +817,7 @@
         visit(node.returnType);
   }
 
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return variables.contains(node.parameter);
   }
@@ -806,6 +838,7 @@
 
   bool visit(DartType node) => node.accept(this);
 
+  @override
   bool defaultDartType(DartType node) {
     throw new UnsupportedError("Unsupported type $node (${node.runtimeType}.");
   }
@@ -814,28 +847,38 @@
     return visit(node.type);
   }
 
+  @override
   bool visitNeverType(NeverType node) => false;
+  @override
   bool visitNullType(NullType node) => false;
+  @override
   bool visitInvalidType(InvalidType node) => false;
+  @override
   bool visitDynamicType(DynamicType node) => false;
+  @override
   bool visitVoidType(VoidType node) => false;
 
+  @override
   bool visitInterfaceType(InterfaceType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitExtensionType(ExtensionType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFutureOrType(FutureOrType node) {
     return visit(node.typeArgument);
   }
 
+  @override
   bool visitTypedefType(TypedefType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFunctionType(FunctionType node) {
     variables.addAll(node.typeParameters);
     bool result = node.typeParameters.any(handleTypeParameter) ||
@@ -846,6 +889,7 @@
     return result;
   }
 
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return node.parameter.parent == null && !variables.contains(node.parameter);
   }
@@ -866,6 +910,7 @@
 
   bool visit(DartType node) => node.accept(this);
 
+  @override
   bool defaultDartType(DartType node) {
     throw new UnsupportedError("Unsupported type $node (${node.runtimeType}.");
   }
@@ -874,28 +919,38 @@
     return visit(node.type);
   }
 
+  @override
   bool visitNeverType(NeverType node) => false;
+  @override
   bool visitNullType(NullType node) => false;
+  @override
   bool visitInvalidType(InvalidType node) => false;
+  @override
   bool visitDynamicType(DynamicType node) => false;
+  @override
   bool visitVoidType(VoidType node) => false;
 
+  @override
   bool visitInterfaceType(InterfaceType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitExtensionType(ExtensionType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFutureOrType(FutureOrType node) {
     return visit(node.typeArgument);
   }
 
+  @override
   bool visitTypedefType(TypedefType node) {
     return node.typeArguments.any(visit);
   }
 
+  @override
   bool visitFunctionType(FunctionType node) {
     variables.addAll(node.typeParameters);
     bool result = node.typeParameters.any(handleTypeParameter) ||
@@ -906,6 +961,7 @@
     return result;
   }
 
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return !variables.contains(node.parameter);
   }
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 8d9cacc..b321095 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -170,24 +170,30 @@
     node.accept(this);
   }
 
+  @override
   defaultMember(Member node) => throw 'Unused';
 
+  @override
   DartType defaultBasicLiteral(BasicLiteral node) {
     return defaultExpression(node);
   }
 
+  @override
   DartType defaultExpression(Expression node) {
     throw 'Unexpected expression ${node.runtimeType}';
   }
 
+  @override
   defaultStatement(Statement node) {
     throw 'Unexpected statement ${node.runtimeType}';
   }
 
+  @override
   defaultInitializer(Initializer node) {
     throw 'Unexpected initializer ${node.runtimeType}';
   }
 
+  @override
   visitField(Field node) {
     if (node.initializer != null) {
       node.initializer =
@@ -195,6 +201,7 @@
     }
   }
 
+  @override
   visitConstructor(Constructor node) {
     currentReturnType = null;
     currentYieldType = null;
@@ -202,12 +209,14 @@
     handleFunctionNode(node.function);
   }
 
+  @override
   visitProcedure(Procedure node) {
     currentReturnType = _getInternalReturnType(node.function);
     currentYieldType = _getYieldType(node.function);
     handleFunctionNode(node.function);
   }
 
+  @override
   visitRedirectingFactory(RedirectingFactory node) {
     currentReturnType = null;
     currentYieldType = null;
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index f0b4795..6b22016 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -16,6 +16,7 @@
 typedef void ErrorHandler(TreeNode node, String message);
 
 abstract class TypeEnvironment extends Types {
+  @override
   final CoreTypes coreTypes;
 
   TypeEnvironment.fromSubclass(this.coreTypes, ClassHierarchyBase base)
@@ -509,6 +510,7 @@
     return _value == _valueAlways;
   }
 
+  @override
   String toString() {
     switch (_value) {
       case _valueAlways:
@@ -540,15 +542,18 @@
   late Map<ForInStatement, DartType> _forInIteratorTypes = {};
   late Map<ForInStatement, DartType> _forInElementTypes = {};
 
+  @override
   DartType getExpressionType(Expression node, StaticTypeContext context) {
     return _expressionTypes[node] ??= node.getStaticTypeInternal(context);
   }
 
+  @override
   DartType getForInIteratorType(
       ForInStatement node, StaticTypeContext context) {
     return _forInIteratorTypes[node] ??= node.getIteratorTypeInternal(context);
   }
 
+  @override
   DartType getForInElementType(ForInStatement node, StaticTypeContext context) {
     return _forInElementTypes[node] ??= node.getElementTypeInternal(context);
   }
@@ -610,6 +615,7 @@
   /// The [TypeEnvironment] used for the static type computation.
   ///
   /// This provides access to the core types and the class hierarchy.
+  @override
   final TypeEnvironment typeEnvironment;
 
   /// The library in which the static type is computed.
@@ -619,6 +625,7 @@
   final Library _library;
 
   /// The static type of a `this` expression.
+  @override
   final InterfaceType? thisType;
 
   final StaticTypeCache? _cache;
@@ -642,21 +649,26 @@
   /// The [Nullability] used for non-nullable types.
   ///
   /// For opt out libraries this is [Nullability.legacy].
+  @override
   Nullability get nonNullable => _library.nonNullable;
 
   /// The [Nullability] used for nullable types.
   ///
   /// For opt out libraries this is [Nullability.legacy].
+  @override
   Nullability get nullable => _library.nullable;
 
   /// Return `true` if the current library is opted in to non-nullable by
   /// default.
+  @override
   bool get isNonNullableByDefault => _library.isNonNullableByDefault;
 
   /// Returns the mode under which the current library was compiled.
+  @override
   NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode =>
       _library.nonNullableByDefaultCompiledMode;
 
+  @override
   DartType getExpressionType(Expression node) {
     if (_cache != null) {
       return _cache!.getExpressionType(node, this);
@@ -665,6 +677,7 @@
     }
   }
 
+  @override
   DartType getForInIteratorType(ForInStatement node) {
     if (_cache != null) {
       return _cache!.getForInIteratorType(node, this);
@@ -673,6 +686,7 @@
     }
   }
 
+  @override
   DartType getForInElementType(ForInStatement node) {
     if (_cache != null) {
       return _cache!.getForInElementType(node, this);
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 9ef4115..7581e08 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -22,6 +22,7 @@
 
   VerificationError(this.context, this.node, this.details);
 
+  @override
   toString() {
     Location? location;
     try {
@@ -209,6 +210,7 @@
     }
   }
 
+  @override
   visitComponent(Component component) {
     try {
       for (Library library in component.libraries) {
@@ -239,12 +241,14 @@
     }
   }
 
+  @override
   void visitLibrary(Library node) {
     currentLibrary = node;
     super.visitLibrary(node);
     currentLibrary = null;
   }
 
+  @override
   visitExtension(Extension node) {
     currentExtension = node;
     declareTypeParameters(node.typeParameters);
@@ -276,12 +280,14 @@
     typedefState[node] = TypedefState.Done;
   }
 
+  @override
   visitTypedef(Typedef node) {
     checkTypedef(node);
     // Enter and exit the node to check the parent pointer on the typedef node.
     exitParent(enterParent(node));
   }
 
+  @override
   visitField(Field node) {
     currentMember = node;
     TreeNode? oldParent = enterParent(node);
@@ -324,6 +330,7 @@
     currentMember = null;
   }
 
+  @override
   visitProcedure(Procedure node) {
     currentMember = node;
     TreeNode? oldParent = enterParent(node);
@@ -374,6 +381,7 @@
     currentMember = null;
   }
 
+  @override
   visitConstructor(Constructor node) {
     currentMember = node;
     classTypeParametersAreInScope = true;
@@ -394,6 +402,7 @@
     currentMember = null;
   }
 
+  @override
   visitClass(Class node) {
     currentClass = node;
     declareTypeParameters(node.typeParameters);
@@ -410,6 +419,7 @@
     currentClass = null;
   }
 
+  @override
   visitFunctionNode(FunctionNode node) {
     declareTypeParameters(node.typeParameters);
     bool savedInCatchBlock = inCatchBlock;
@@ -429,6 +439,7 @@
     undeclareTypeParameters(node.typeParameters);
   }
 
+  @override
   visitFunctionType(FunctionType node) {
     for (int i = 1; i < node.namedParameters.length; ++i) {
       if (node.namedParameters[i - 1].compareTo(node.namedParameters[i]) >= 0) {
@@ -450,18 +461,22 @@
     undeclareTypeParameters(node.typeParameters);
   }
 
+  @override
   visitBlock(Block node) {
     visitWithLocalScope(node);
   }
 
+  @override
   visitForStatement(ForStatement node) {
     visitWithLocalScope(node);
   }
 
+  @override
   visitForInStatement(ForInStatement node) {
     visitWithLocalScope(node);
   }
 
+  @override
   visitLet(Let node) {
     if (_isCompileTimeErrorEncoding(node)) return;
     visitWithLocalScope(node);
@@ -472,6 +487,7 @@
     return;
   }
 
+  @override
   visitBlockExpression(BlockExpression node) {
     int stackHeight = enterLocalScope();
     // Do not visit the block directly because the value expression needs to
@@ -487,6 +503,7 @@
     exitLocalScope(stackHeight);
   }
 
+  @override
   visitCatch(Catch node) {
     bool savedInCatchBlock = inCatchBlock;
     inCatchBlock = true;
@@ -539,6 +556,7 @@
     }
   }
 
+  @override
   visitVariableDeclaration(VariableDeclaration node) {
     TreeNode? parent = node.parent;
     if (parent is! Block &&
@@ -567,6 +585,7 @@
     }
   }
 
+  @override
   visitVariableGet(VariableGet node) {
     checkVariableInScope(node.variable, node);
     visitChildren(node);
@@ -575,6 +594,7 @@
     }
   }
 
+  @override
   visitVariableSet(VariableSet node) {
     checkVariableInScope(node.variable, node);
     visitChildren(node);
@@ -999,6 +1019,7 @@
 
   CheckParentPointers([this.parent]);
 
+  @override
   defaultTreeNode(TreeNode node) {
     if (node.parent != parent) {
       throw new VerificationError(
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 5e5c959..cbd116e 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -186,109 +186,197 @@
   R defaultTreeNode(TreeNode node);
 
   // Expressions
+  @override
   R defaultExpression(Expression node) => defaultTreeNode(node);
+  @override
   R defaultBasicLiteral(BasicLiteral node) => defaultExpression(node);
+  @override
   R visitInvalidExpression(InvalidExpression node) => defaultExpression(node);
+  @override
   R visitVariableGet(VariableGet node) => defaultExpression(node);
+  @override
   R visitVariableSet(VariableSet node) => defaultExpression(node);
+  @override
   R visitDynamicGet(DynamicGet node) => defaultExpression(node);
+  @override
   R visitDynamicSet(DynamicSet node) => defaultExpression(node);
+  @override
   R visitFunctionTearOff(FunctionTearOff node) => defaultExpression(node);
+  @override
   R visitInstanceGet(InstanceGet node) => defaultExpression(node);
+  @override
   R visitInstanceSet(InstanceSet node) => defaultExpression(node);
+  @override
   R visitInstanceTearOff(InstanceTearOff node) => defaultExpression(node);
+  @override
   R visitSuperPropertyGet(SuperPropertyGet node) => defaultExpression(node);
+  @override
   R visitSuperPropertySet(SuperPropertySet node) => defaultExpression(node);
+  @override
   R visitStaticGet(StaticGet node) => defaultExpression(node);
+  @override
   R visitStaticSet(StaticSet node) => defaultExpression(node);
+  @override
   R visitStaticTearOff(StaticTearOff node) => defaultExpression(node);
+  @override
   R visitLocalFunctionInvocation(LocalFunctionInvocation node) =>
       defaultExpression(node);
+  @override
   R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
+  @override
   R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
+  @override
   R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
+  @override
   R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
       defaultExpression(node);
+  @override
   R visitEqualsNull(EqualsNull node) => defaultExpression(node);
+  @override
   R visitEqualsCall(EqualsCall node) => defaultExpression(node);
+  @override
   R visitSuperMethodInvocation(SuperMethodInvocation node) =>
       defaultExpression(node);
+  @override
   R visitStaticInvocation(StaticInvocation node) => defaultExpression(node);
+  @override
   R visitConstructorInvocation(ConstructorInvocation node) =>
       defaultExpression(node);
+  @override
   R visitNot(Not node) => defaultExpression(node);
+  @override
   R visitNullCheck(NullCheck node) => defaultExpression(node);
+  @override
   R visitLogicalExpression(LogicalExpression node) => defaultExpression(node);
+  @override
   R visitConditionalExpression(ConditionalExpression node) =>
       defaultExpression(node);
+  @override
   R visitStringConcatenation(StringConcatenation node) =>
       defaultExpression(node);
+  @override
   R visitListConcatenation(ListConcatenation node) => defaultExpression(node);
+  @override
   R visitSetConcatenation(SetConcatenation node) => defaultExpression(node);
+  @override
   R visitMapConcatenation(MapConcatenation node) => defaultExpression(node);
+  @override
   R visitInstanceCreation(InstanceCreation node) => defaultExpression(node);
+  @override
   R visitFileUriExpression(FileUriExpression node) => defaultExpression(node);
+  @override
   R visitIsExpression(IsExpression node) => defaultExpression(node);
+  @override
   R visitAsExpression(AsExpression node) => defaultExpression(node);
+  @override
   R visitSymbolLiteral(SymbolLiteral node) => defaultExpression(node);
+  @override
   R visitTypeLiteral(TypeLiteral node) => defaultExpression(node);
+  @override
   R visitThisExpression(ThisExpression node) => defaultExpression(node);
+  @override
   R visitRethrow(Rethrow node) => defaultExpression(node);
+  @override
   R visitThrow(Throw node) => defaultExpression(node);
+  @override
   R visitListLiteral(ListLiteral node) => defaultExpression(node);
+  @override
   R visitSetLiteral(SetLiteral node) => defaultExpression(node);
+  @override
   R visitMapLiteral(MapLiteral node) => defaultExpression(node);
+  @override
   R visitAwaitExpression(AwaitExpression node) => defaultExpression(node);
+  @override
   R visitFunctionExpression(FunctionExpression node) => defaultExpression(node);
+  @override
   R visitConstantExpression(ConstantExpression node) => defaultExpression(node);
+  @override
   R visitStringLiteral(StringLiteral node) => defaultBasicLiteral(node);
+  @override
   R visitIntLiteral(IntLiteral node) => defaultBasicLiteral(node);
+  @override
   R visitDoubleLiteral(DoubleLiteral node) => defaultBasicLiteral(node);
+  @override
   R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
+  @override
   R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
+  @override
   R visitLet(Let node) => defaultExpression(node);
+  @override
   R visitBlockExpression(BlockExpression node) => defaultExpression(node);
+  @override
   R visitInstantiation(Instantiation node) => defaultExpression(node);
+  @override
   R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
+  @override
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
       defaultExpression(node);
+  @override
   R visitConstructorTearOff(ConstructorTearOff node) => defaultExpression(node);
+  @override
   R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node) =>
       defaultExpression(node);
+  @override
   R visitTypedefTearOff(TypedefTearOff node) => defaultExpression(node);
 
   // Statements
+  @override
   R defaultStatement(Statement node) => defaultTreeNode(node);
+  @override
   R visitExpressionStatement(ExpressionStatement node) =>
       defaultStatement(node);
+  @override
   R visitBlock(Block node) => defaultStatement(node);
+  @override
   R visitAssertBlock(AssertBlock node) => defaultStatement(node);
+  @override
   R visitEmptyStatement(EmptyStatement node) => defaultStatement(node);
+  @override
   R visitAssertStatement(AssertStatement node) => defaultStatement(node);
+  @override
   R visitLabeledStatement(LabeledStatement node) => defaultStatement(node);
+  @override
   R visitBreakStatement(BreakStatement node) => defaultStatement(node);
+  @override
   R visitWhileStatement(WhileStatement node) => defaultStatement(node);
+  @override
   R visitDoStatement(DoStatement node) => defaultStatement(node);
+  @override
   R visitForStatement(ForStatement node) => defaultStatement(node);
+  @override
   R visitForInStatement(ForInStatement node) => defaultStatement(node);
+  @override
   R visitSwitchStatement(SwitchStatement node) => defaultStatement(node);
+  @override
   R visitContinueSwitchStatement(ContinueSwitchStatement node) =>
       defaultStatement(node);
+  @override
   R visitIfStatement(IfStatement node) => defaultStatement(node);
+  @override
   R visitReturnStatement(ReturnStatement node) => defaultStatement(node);
+  @override
   R visitTryCatch(TryCatch node) => defaultStatement(node);
+  @override
   R visitTryFinally(TryFinally node) => defaultStatement(node);
+  @override
   R visitYieldStatement(YieldStatement node) => defaultStatement(node);
+  @override
   R visitVariableDeclaration(VariableDeclaration node) =>
       defaultStatement(node);
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node) =>
       defaultStatement(node);
 
   // Members
+  @override
   R defaultMember(Member node) => defaultTreeNode(node);
+  @override
   R visitConstructor(Constructor node) => defaultMember(node);
+  @override
   R visitProcedure(Procedure node) => defaultMember(node);
+  @override
   R visitField(Field node) => defaultMember(node);
+  @override
   R visitRedirectingFactory(RedirectingFactory node) {
     return defaultMember(node);
   }
@@ -298,14 +386,21 @@
   R visitExtension(Extension node) => defaultTreeNode(node);
 
   // Initializers
+  @override
   R defaultInitializer(Initializer node) => defaultTreeNode(node);
+  @override
   R visitInvalidInitializer(InvalidInitializer node) =>
       defaultInitializer(node);
+  @override
   R visitFieldInitializer(FieldInitializer node) => defaultInitializer(node);
+  @override
   R visitSuperInitializer(SuperInitializer node) => defaultInitializer(node);
+  @override
   R visitRedirectingInitializer(RedirectingInitializer node) =>
       defaultInitializer(node);
+  @override
   R visitLocalInitializer(LocalInitializer node) => defaultInitializer(node);
+  @override
   R visitAssertInitializer(AssertInitializer node) => defaultInitializer(node);
 
   // Other tree nodes
@@ -335,146 +430,234 @@
   R defaultTreeNode(TreeNode node, A arg);
 
   // Expressions
+  @override
   R defaultExpression(Expression node, A arg) => defaultTreeNode(node, arg);
+  @override
   R defaultBasicLiteral(BasicLiteral node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInvalidExpression(InvalidExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitVariableGet(VariableGet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitVariableSet(VariableSet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitDynamicGet(DynamicGet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitDynamicSet(DynamicSet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitFunctionTearOff(FunctionTearOff node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInstanceGet(InstanceGet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitInstanceSet(InstanceSet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitInstanceTearOff(InstanceTearOff node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitSuperPropertyGet(SuperPropertyGet node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitSuperPropertySet(SuperPropertySet node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitStaticGet(StaticGet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitStaticSet(StaticSet node, A arg) => defaultExpression(node, arg);
+  @override
   R visitStaticTearOff(StaticTearOff node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitLocalFunctionInvocation(LocalFunctionInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitDynamicInvocation(DynamicInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitFunctionInvocation(FunctionInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInstanceInvocation(InstanceInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInstanceGetterInvocation(InstanceGetterInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
+  @override
   R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
+  @override
   R visitSuperMethodInvocation(SuperMethodInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitStaticInvocation(StaticInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitConstructorInvocation(ConstructorInvocation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitNot(Not node, A arg) => defaultExpression(node, arg);
+  @override
   R visitNullCheck(NullCheck node, A arg) => defaultExpression(node, arg);
+  @override
   R visitLogicalExpression(LogicalExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitConditionalExpression(ConditionalExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitStringConcatenation(StringConcatenation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitListConcatenation(ListConcatenation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitSetConcatenation(SetConcatenation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitMapConcatenation(MapConcatenation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInstanceCreation(InstanceCreation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitFileUriExpression(FileUriExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitIsExpression(IsExpression node, A arg) => defaultExpression(node, arg);
+  @override
   R visitAsExpression(AsExpression node, A arg) => defaultExpression(node, arg);
+  @override
   R visitSymbolLiteral(SymbolLiteral node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitTypeLiteral(TypeLiteral node, A arg) => defaultExpression(node, arg);
+  @override
   R visitThisExpression(ThisExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitRethrow(Rethrow node, A arg) => defaultExpression(node, arg);
+  @override
   R visitThrow(Throw node, A arg) => defaultExpression(node, arg);
+  @override
   R visitListLiteral(ListLiteral node, A arg) => defaultExpression(node, arg);
+  @override
   R visitSetLiteral(SetLiteral node, A arg) => defaultExpression(node, arg);
+  @override
   R visitMapLiteral(MapLiteral node, A arg) => defaultExpression(node, arg);
+  @override
   R visitAwaitExpression(AwaitExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitFunctionExpression(FunctionExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitConstantExpression(ConstantExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitStringLiteral(StringLiteral node, A arg) =>
       defaultBasicLiteral(node, arg);
+  @override
   R visitIntLiteral(IntLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  @override
   R visitDoubleLiteral(DoubleLiteral node, A arg) =>
       defaultBasicLiteral(node, arg);
+  @override
   R visitBoolLiteral(BoolLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  @override
   R visitNullLiteral(NullLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  @override
   R visitLet(Let node, A arg) => defaultExpression(node, arg);
+  @override
   R visitBlockExpression(BlockExpression node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitInstantiation(Instantiation node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitLoadLibrary(LoadLibrary node, A arg) => defaultExpression(node, arg);
+  @override
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitConstructorTearOff(ConstructorTearOff node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node, A arg) =>
       defaultExpression(node, arg);
+  @override
   R visitTypedefTearOff(TypedefTearOff node, A arg) =>
       defaultExpression(node, arg);
 
   // Statements
+  @override
   R defaultStatement(Statement node, A arg) => defaultTreeNode(node, arg);
+  @override
   R visitExpressionStatement(ExpressionStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitBlock(Block node, A arg) => defaultStatement(node, arg);
+  @override
   R visitAssertBlock(AssertBlock node, A arg) => defaultStatement(node, arg);
+  @override
   R visitEmptyStatement(EmptyStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitAssertStatement(AssertStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitLabeledStatement(LabeledStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitBreakStatement(BreakStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitWhileStatement(WhileStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitDoStatement(DoStatement node, A arg) => defaultStatement(node, arg);
+  @override
   R visitForStatement(ForStatement node, A arg) => defaultStatement(node, arg);
+  @override
   R visitForInStatement(ForInStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitSwitchStatement(SwitchStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitContinueSwitchStatement(ContinueSwitchStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitIfStatement(IfStatement node, A arg) => defaultStatement(node, arg);
+  @override
   R visitReturnStatement(ReturnStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitTryCatch(TryCatch node, A arg) => defaultStatement(node, arg);
+  @override
   R visitTryFinally(TryFinally node, A arg) => defaultStatement(node, arg);
+  @override
   R visitYieldStatement(YieldStatement node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitVariableDeclaration(VariableDeclaration node, A arg) =>
       defaultStatement(node, arg);
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node, A arg) =>
       defaultStatement(node, arg);
 
   // Members
+  @override
   R defaultMember(Member node, A arg) => defaultTreeNode(node, arg);
+  @override
   R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
+  @override
   R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
+  @override
   R visitField(Field node, A arg) => defaultMember(node, arg);
+  @override
   R visitRedirectingFactory(RedirectingFactory node, A arg) {
     return defaultMember(node, arg);
   }
@@ -484,17 +667,24 @@
   R visitExtension(Extension node, A arg) => defaultTreeNode(node, arg);
 
   // Initializers
+  @override
   R defaultInitializer(Initializer node, A arg) => defaultTreeNode(node, arg);
+  @override
   R visitInvalidInitializer(InvalidInitializer node, A arg) =>
       defaultInitializer(node, arg);
+  @override
   R visitFieldInitializer(FieldInitializer node, A arg) =>
       defaultInitializer(node, arg);
+  @override
   R visitSuperInitializer(SuperInitializer node, A arg) =>
       defaultInitializer(node, arg);
+  @override
   R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
       defaultInitializer(node, arg);
+  @override
   R visitLocalInitializer(LocalInitializer node, A arg) =>
       defaultInitializer(node, arg);
+  @override
   R visitAssertInitializer(AssertInitializer node, A arg) =>
       defaultInitializer(node, arg);
 
@@ -750,30 +940,48 @@
     return value;
   }
 
+  @override
   R defaultConstant(Constant node);
 
+  @override
   R visitNullConstant(NullConstant node) => defaultConstant(node);
+  @override
   R visitBoolConstant(BoolConstant node) => defaultConstant(node);
+  @override
   R visitIntConstant(IntConstant node) => defaultConstant(node);
+  @override
   R visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
+  @override
   R visitStringConstant(StringConstant node) => defaultConstant(node);
+  @override
   R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
+  @override
   R visitMapConstant(MapConstant node) => defaultConstant(node);
+  @override
   R visitListConstant(ListConstant node) => defaultConstant(node);
+  @override
   R visitSetConstant(SetConstant node) => defaultConstant(node);
+  @override
   R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
+  @override
   R visitInstantiationConstant(InstantiationConstant node) =>
       defaultConstant(node);
+  @override
   R visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitStaticTearOffConstant(StaticTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitRedirectingFactoryTearOffConstant(
           RedirectingFactoryTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  @override
   R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
 }
 
@@ -799,29 +1007,46 @@
     }
   }
 
+  @override
   void defaultConstant(Constant node);
 
+  @override
   void visitNullConstant(NullConstant node) => defaultConstant(node);
+  @override
   void visitBoolConstant(BoolConstant node) => defaultConstant(node);
+  @override
   void visitIntConstant(IntConstant node) => defaultConstant(node);
+  @override
   void visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
+  @override
   void visitStringConstant(StringConstant node) => defaultConstant(node);
+  @override
   void visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
+  @override
   void visitMapConstant(MapConstant node) => defaultConstant(node);
+  @override
   void visitListConstant(ListConstant node) => defaultConstant(node);
+  @override
   void visitSetConstant(SetConstant node) => defaultConstant(node);
+  @override
   void visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
+  @override
   void visitInstantiationConstant(InstantiationConstant node) =>
       defaultConstant(node);
+  @override
   void visitStaticTearOffConstant(StaticTearOffConstant node) =>
       defaultConstant(node);
+  @override
   void visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
       defaultConstant(node);
+  @override
   void visitRedirectingFactoryTearOffConstant(
           RedirectingFactoryTearOffConstant node) =>
       defaultConstant(node);
+  @override
   void visitTypeLiteralConstant(TypeLiteralConstant node) =>
       defaultConstant(node);
+  @override
   void visitUnevaluatedConstant(UnevaluatedConstant node) =>
       defaultConstant(node);
 }
@@ -863,46 +1088,77 @@
 
   /// The catch-all case, except for references.
   R defaultNode(Node node);
+  @override
   R defaultTreeNode(TreeNode node) => defaultNode(node);
 
   // DartTypes
+  @override
   R defaultDartType(DartType node) => defaultNode(node);
+  @override
   R visitInvalidType(InvalidType node) => defaultDartType(node);
+  @override
   R visitDynamicType(DynamicType node) => defaultDartType(node);
+  @override
   R visitVoidType(VoidType node) => defaultDartType(node);
+  @override
   R visitInterfaceType(InterfaceType node) => defaultDartType(node);
+  @override
   R visitFutureOrType(FutureOrType node) => defaultDartType(node);
+  @override
   R visitFunctionType(FunctionType node) => defaultDartType(node);
+  @override
   R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
+  @override
   R visitTypedefType(TypedefType node) => defaultDartType(node);
+  @override
   R visitNeverType(NeverType node) => defaultDartType(node);
+  @override
   R visitNullType(NullType node) => defaultDartType(node);
+  @override
   R visitExtensionType(ExtensionType node) => defaultDartType(node);
 
   // Constants
+  @override
   R defaultConstant(Constant node) => defaultNode(node);
+  @override
   R visitNullConstant(NullConstant node) => defaultConstant(node);
+  @override
   R visitBoolConstant(BoolConstant node) => defaultConstant(node);
+  @override
   R visitIntConstant(IntConstant node) => defaultConstant(node);
+  @override
   R visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
+  @override
   R visitStringConstant(StringConstant node) => defaultConstant(node);
+  @override
   R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
+  @override
   R visitMapConstant(MapConstant node) => defaultConstant(node);
+  @override
   R visitListConstant(ListConstant node) => defaultConstant(node);
+  @override
   R visitSetConstant(SetConstant node) => defaultConstant(node);
+  @override
   R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
+  @override
   R visitInstantiationConstant(InstantiationConstant node) =>
       defaultConstant(node);
+  @override
   R visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitStaticTearOffConstant(StaticTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitRedirectingFactoryTearOffConstant(
           RedirectingFactoryTearOffConstant node) =>
       defaultConstant(node);
+  @override
   R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  @override
   R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
 
   // Class references
@@ -952,11 +1208,16 @@
       defaultConstantReference(node);
 
   // Member references
+  @override
   R defaultMemberReference(Member node);
 
+  @override
   R visitFieldReference(Field node) => defaultMemberReference(node);
+  @override
   R visitConstructorReference(Constructor node) => defaultMemberReference(node);
+  @override
   R visitProcedureReference(Procedure node) => defaultMemberReference(node);
+  @override
   R visitRedirectingFactoryReference(RedirectingFactory node) {
     return defaultMemberReference(node);
   }
@@ -975,43 +1236,70 @@
 
   /// The catch-all case, except for references.
   R defaultNode(Node node, A arg);
+  @override
   R defaultTreeNode(TreeNode node, A arg) => defaultNode(node, arg);
 
   // DartTypes
+  @override
   R defaultDartType(DartType node, A arg) => defaultNode(node, arg);
+  @override
   R visitInvalidType(InvalidType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitDynamicType(DynamicType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitVoidType(VoidType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitInterfaceType(InterfaceType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitFutureOrType(FutureOrType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitFunctionType(FunctionType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitTypeParameterType(TypeParameterType node, A arg) =>
       defaultDartType(node, arg);
+  @override
   R visitTypedefType(TypedefType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitNeverType(NeverType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitNullType(NullType node, A arg) => defaultDartType(node, arg);
+  @override
   R visitExtensionType(ExtensionType node, A arg) => defaultDartType(node, arg);
 
   // Constants
+  @override
   R defaultConstant(Constant node, A arg) => defaultNode(node, arg);
+  @override
   R visitNullConstant(NullConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitBoolConstant(BoolConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitIntConstant(IntConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitDoubleConstant(DoubleConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitStringConstant(StringConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitSymbolConstant(SymbolConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitMapConstant(MapConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitListConstant(ListConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitSetConstant(SetConstant node, A arg) => defaultConstant(node, arg);
+  @override
   R visitInstanceConstant(InstanceConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitInstantiationConstant(InstantiationConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitTypeLiteralConstant(TypeLiteralConstant node, A arg) =>
       defaultConstant(node, arg);
+  @override
   R visitUnevaluatedConstant(UnevaluatedConstant node, A arg) =>
       defaultConstant(node, arg);
 
@@ -1063,13 +1351,18 @@
       defaultConstantReference(node, arg);
 
   // Member references
+  @override
   R defaultMemberReference(Member node, A arg);
 
+  @override
   R visitFieldReference(Field node, A arg) => defaultMemberReference(node, arg);
+  @override
   R visitConstructorReference(Constructor node, A arg) =>
       defaultMemberReference(node, arg);
+  @override
   R visitProcedureReference(Procedure node, A arg) =>
       defaultMemberReference(node, arg);
+  @override
   R visitRedirectingFactoryReference(RedirectingFactory node, A arg) =>
       defaultMemberReference(node, arg);
 
@@ -1194,6 +1487,7 @@
 class RecursiveVisitor<T> extends Visitor<void> with VisitorVoidMixin {
   const RecursiveVisitor();
 
+  @override
   void defaultNode(Node node) {
     node.visitChildren(this);
   }
@@ -1204,6 +1498,7 @@
 class RecursiveResultVisitor<R> extends Visitor<R?> with VisitorNullMixin<R> {
   const RecursiveResultVisitor();
 
+  @override
   R? defaultNode(Node node) {
     node.visitChildren(this);
     return null;
@@ -1295,6 +1590,7 @@
 
   Supertype visitSupertype(Supertype node) => node;
 
+  @override
   TreeNode defaultTreeNode(TreeNode node) {
     node.transformChildren(this);
     return node;
@@ -1653,6 +1949,7 @@
 
   Supertype visitSupertype(Supertype node, Supertype? removalSentinel) => node;
 
+  @override
   TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) {
     node.transformOrRemoveChildren(this);
     return node;
@@ -1806,38 +2103,59 @@
     implements StatementVisitor1<R, T> {
   const BodyVisitor1();
 
+  @override
   R defaultStatement(Statement node, T arg);
+  @override
   R visitExpressionStatement(ExpressionStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitBlock(Block node, T arg) => defaultStatement(node, arg);
+  @override
   R visitAssertBlock(AssertBlock node, T arg) => defaultStatement(node, arg);
+  @override
   R visitEmptyStatement(EmptyStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitAssertStatement(AssertStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitLabeledStatement(LabeledStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitBreakStatement(BreakStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitWhileStatement(WhileStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitDoStatement(DoStatement node, T arg) => defaultStatement(node, arg);
+  @override
   R visitForStatement(ForStatement node, T arg) => defaultStatement(node, arg);
+  @override
   R visitForInStatement(ForInStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitSwitchStatement(SwitchStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitContinueSwitchStatement(ContinueSwitchStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitIfStatement(IfStatement node, T arg) => defaultStatement(node, arg);
+  @override
   R visitReturnStatement(ReturnStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitTryCatch(TryCatch node, T arg) => defaultStatement(node, arg);
+  @override
   R visitTryFinally(TryFinally node, T arg) => defaultStatement(node, arg);
+  @override
   R visitYieldStatement(YieldStatement node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitVariableDeclaration(VariableDeclaration node, T arg) =>
       defaultStatement(node, arg);
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node, T arg) =>
       defaultStatement(node, arg);
 }
diff --git a/pkg/kernel/test/binary/utils.dart b/pkg/kernel/test/binary/utils.dart
index 1005909..b5faa20 100644
--- a/pkg/kernel/test/binary/utils.dart
+++ b/pkg/kernel/test/binary/utils.dart
@@ -32,9 +32,11 @@
 class ByteSink implements Sink<List<int>> {
   final BytesBuilder builder = new BytesBuilder();
 
+  @override
   void add(List<int> data) {
     builder.add(data);
   }
 
+  @override
   void close() {}
 }
diff --git a/pkg/kernel/test/class_hierarchy_basic.dart b/pkg/kernel/test/class_hierarchy_basic.dart
index 78ca0c5..259fd47 100644
--- a/pkg/kernel/test/class_hierarchy_basic.dart
+++ b/pkg/kernel/test/class_hierarchy_basic.dart
@@ -11,6 +11,7 @@
 /// A simple implementation of the class hierarchy interface using
 /// hash tables for everything.
 class BasicClassHierarchy implements ClassHierarchy {
+  @override
   final Set<Library> knownLibraries;
   final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{};
   final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{};
@@ -39,6 +40,7 @@
     }
   }
 
+  @override
   void forEachOverridePair(
       Class class_, callback(Member member, Member superMember, bool setter)) {
     void report(Member member, Member superMember, bool setter) {
@@ -199,6 +201,7 @@
     }
   }
 
+  @override
   bool isSubclassOf(Class subtype, Class supertype) {
     return superclasses[subtype]!.contains(supertype);
   }
@@ -207,18 +210,22 @@
     return superMixtures[subtype]!.contains(supertype);
   }
 
+  @override
   bool isSubtypeOf(Class subtype, Class supertype) {
     return supertypes[subtype]!.contains(supertype);
   }
 
+  @override
   Supertype? getClassAsInstanceOf(Class type, Class supertype) {
     return supertypeInstantiations[type]![supertype];
   }
 
+  @override
   Member? getDispatchTarget(Class class_, Name name, {bool setter: false}) {
     return setter ? setters[class_]![name] : gettersAndCalls[class_]![name];
   }
 
+  @override
   List<Member> getDispatchTargets(Class class_, {bool setters: false}) {
     return setters
         ? this.setters[class_]!.values.toList()
@@ -229,6 +236,7 @@
     return (members == null || members.isEmpty) ? null : members.first;
   }
 
+  @override
   Member? getInterfaceMember(Class class_, Name name, {bool setter: false}) {
     return tryFirst(getInterfaceMembersByName(class_, name, setter: setter));
   }
@@ -241,6 +249,7 @@
     return iterable == null ? const <Member>[] : iterable;
   }
 
+  @override
   List<Member> getInterfaceMembers(Class class_, {bool setters: false}) {
     return setters
         ? interfaceSetters[class_]!.values.expand((x) => x).toList()
@@ -255,5 +264,6 @@
   double getCompressionRatio() => 0.0;
   int getSuperTypeHashTableSize() => 0;
 
+  @override
   noSuchMethod(inv) => super.noSuchMethod(inv);
 }
diff --git a/pkg/kernel/test/graph_test.dart b/pkg/kernel/test/graph_test.dart
index 1dc79f9..e6d87db 100644
--- a/pkg/kernel/test/graph_test.dart
+++ b/pkg/kernel/test/graph_test.dart
@@ -13,8 +13,10 @@
 
   TestGraph(this.graph);
 
+  @override
   Iterable<String> get vertices => graph.keys;
 
+  @override
   Iterable<String> neighborsOf(String vertex) => graph[vertex]!;
 }
 
diff --git a/pkg/kernel/test/heap_test.dart b/pkg/kernel/test/heap_test.dart
index 32b294e..139fe54 100644
--- a/pkg/kernel/test/heap_test.dart
+++ b/pkg/kernel/test/heap_test.dart
@@ -34,5 +34,6 @@
 }
 
 class _intHeap extends Heap<int> {
+  @override
   bool sortsBefore(int a, int b) => a < b;
 }
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index 16418c6..fbdc952 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -56,10 +56,13 @@
 class TestMetadataRepository extends MetadataRepository<Metadata> {
   static const kTag = 'kernel.metadata.test';
 
+  @override
   final String tag = kTag;
 
+  @override
   final Map<TreeNode, Metadata> mapping = <TreeNode, Metadata>{};
 
+  @override
   void writeToBinary(Metadata metadata, Node node, BinarySink sink) {
     expect(metadata, equals(mapping[node]));
     sink.writeByteList(utf8.encode(metadata.string));
@@ -69,6 +72,7 @@
     sink.writeDartType(metadata.type);
   }
 
+  @override
   Metadata readFromBinary(Node node, BinarySource source) {
     final string1 = utf8.decode(source.readByteList());
     final string2 = source.readStringReference();
@@ -101,6 +105,7 @@
 
   Visitor(this.predicate, this.handle);
 
+  @override
   defaultTreeNode(TreeNode node) {
     super.defaultTreeNode(node);
     if (MetadataRepository.isSupported(node) && predicate(node)) {
diff --git a/pkg/kernel/test/type_hashcode_test.dart b/pkg/kernel/test/type_hashcode_test.dart
index 8d13fe6..c232443 100644
--- a/pkg/kernel/test/type_hashcode_test.dart
+++ b/pkg/kernel/test/type_hashcode_test.dart
@@ -65,6 +65,7 @@
 
   bool get shouldSucceed => expectedSubstitution != null;
 
+  @override
   String toString() => '∃ ${quantifiedVariables.join(',')}. $type1 = $type2';
 }
 
diff --git a/pkg/kernel/test/type_substitute_bounds_test.dart b/pkg/kernel/test/type_substitute_bounds_test.dart
index ca16ac0..19436dc 100644
--- a/pkg/kernel/test/type_substitute_bounds_test.dart
+++ b/pkg/kernel/test/type_substitute_bounds_test.dart
@@ -41,6 +41,7 @@
 
   TestCase(this.type, this.bounds, this.expected);
 
+  @override
   String toString() {
     var substitution = bounds.keys.map((key) {
       var bound = bounds[key]!;