Add override annotations across DDC

Previously 36% of overrides were annotated, including inconsistent
annotations within a single class.

- Add annotations on remaining overridden methods.
- Add linter section to `analysis_options.yaml` so that missing
  annotations are visible while editing.

Change-Id: Ief1a6d5b8da6f4b630a6cfc72a6ed67db346c081
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103140
Reviewed-by: Vijay Menon <vsm@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
diff --git a/pkg/dev_compiler/analysis_options.yaml b/pkg/dev_compiler/analysis_options.yaml
index 55db4c5..3d92c04 100644
--- a/pkg/dev_compiler/analysis_options.yaml
+++ b/pkg/dev_compiler/analysis_options.yaml
@@ -7,3 +7,7 @@
     - test/samples/**
     - test/transformer/hello_app/**
     - tool/input_sdk/**
+
+linter:
+  rules:
+    - annotate_overrides
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index fbe7114..db2f7b8 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -47,6 +47,7 @@
   CompilerResult lastResult;
 
   /// Performs each individual work request.
+  @override
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.merge(request.arguments);
     var output = StringBuffer();
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 2c72273..93bfa54 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -83,6 +83,7 @@
   /// Errors that were produced during compilation, if any.
   final ErrorCollector errors;
 
+  @override
   JSTypeRep jsTypeRep;
 
   /// The list of dart:_runtime SDK functions; these are assumed by other code
@@ -112,6 +113,7 @@
   /// The  type provider from the current Analysis [context].
   final TypeProvider types;
 
+  @override
   final LibraryElement coreLibrary;
   final LibraryElement dartJSLibrary;
 
@@ -183,6 +185,7 @@
 
   /// Information about virtual fields for all libraries in the current build
   /// unit.
+  @override
   final virtualFields = VirtualFieldModel();
 
   final _usedCovariantPrivateMembers = HashSet<ExecutableElement>();
@@ -234,6 +237,7 @@
     jsTypeRep = JSTypeRep(rules, driver);
   }
 
+  @override
   LibraryElement get currentLibrary => _currentElement.library;
 
   @override
@@ -6218,6 +6222,7 @@
 
   /// Return true if this is one of the methods/properties on all Dart Objects
   /// (toString, hashCode, noSuchMethod, runtimeType, ==).
+  @override
   bool isObjectMember(String name) {
     // We could look these up on Object, but we have hard coded runtime helpers
     // so it's not really providing any benefit.
@@ -6687,8 +6692,10 @@
         : enclosingElement;
   }
 
+  @override
   int get hashCode => identityHashCode(this);
 
+  @override
   bool operator ==(Object other) => identical(this, other);
 }
 
diff --git a/pkg/dev_compiler/lib/src/analyzer/command.dart b/pkg/dev_compiler/lib/src/analyzer/command.dart
index 2d32c8d..2ba5b2f 100644
--- a/pkg/dev_compiler/lib/src/analyzer/command.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/command.dart
@@ -208,11 +208,13 @@
 
 /// Thrown when the input source code has errors.
 class CompileErrorException implements Exception {
+  @override
   toString() => '\nPlease fix all errors before compiling (warnings are okay).';
 }
 
 /// Thrown when force compilation failed (probably due to static errors).
 class ForceCompileErrorException extends CompileErrorException {
+  @override
   toString() =>
       '\nForce-compilation not successful. Please check static errors.';
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
index 91978e7..dc52e86 100644
--- a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
@@ -134,6 +134,7 @@
 
   _GeneratorTable(this._runtimeModule);
 
+  @override
   JS.Statement _dischargeType(DartType t) {
     var name = _names.remove(t);
     if (name != null) {
diff --git a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
index e911dca..cd9edf9 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
@@ -54,6 +54,7 @@
   /// Returns an expression that ignores the result. This is a cross between
   /// [toExpression] and [toStatement]. Used for C-style for-loop updaters,
   /// which is an expression syntactically, but functions more like a statement.
+  @override
   Expression toVoidExpression() {
     var block = toStatement();
     var s = block.statements;
@@ -65,6 +66,7 @@
     return _toInvokedFunction(block);
   }
 
+  @override
   Expression toAssignExpression(Expression left, [String op]) {
     if (left is Identifier) {
       return _simplifyAssignment(left, op: op) ?? _toAssign(left, op);
@@ -82,6 +84,7 @@
     return MetaLet(variables, exprs);
   }
 
+  @override
   Statement toVariableDeclaration(VariableBinding name) {
     if (name is Identifier) {
       var simple = _simplifyAssignment(name, isDeclaration: true);
@@ -118,6 +121,7 @@
     return _expression = _toInvokedFunction(block);
   }
 
+  @override
   Block toStatement() {
     // Skip return value if not used.
     var statements = body.map((e) => e.toStatement()).toList();
@@ -125,6 +129,7 @@
     return _finishStatement(statements);
   }
 
+  @override
   Block toReturn() {
     var statements = body
         .map((e) => e == body.last ? e.toReturn() : e.toStatement())
@@ -132,6 +137,7 @@
     return _finishStatement(statements);
   }
 
+  @override
   Block toYieldStatement({bool star = false}) {
     var statements = body
         .map((e) =>
@@ -140,6 +146,7 @@
     return _finishStatement(statements);
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) {
     // TODO(jmesserly): we special case vistors from js_ast.Template, because it
     // doesn't know about MetaLet. Should we integrate directly?
@@ -153,6 +160,7 @@
     }
   }
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     // TODO(jmesserly): we special case vistors from js_ast.Template, because it
     // doesn't know about MetaLet. Should we integrate directly?
@@ -166,6 +174,7 @@
   }
 
   /// This generates as either a comma expression or a call.
+  @override
   int get precedenceLevel => toExpression().precedenceLevel;
 
   /// Patch to pretend [Template] supports visitMetaLet.
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index c4c1c11..ad91538 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -29,7 +29,9 @@
   //
   // However we may need to fix this if we want hover to work well for things
   // like library prefixes and field-initializing formals.
+  @override
   get sourceInformation => null;
+  @override
   set sourceInformation(Object obj) {}
 
   TemporaryId(String name) : super(name);
@@ -60,10 +62,13 @@
     }
   }
 
+  @override
   int get precedenceLevel => _expr.precedenceLevel;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => _expr.accept(visitor);
 
+  @override
   void visitChildren(NodeVisitor visitor) => _expr.visitChildren(visitor);
 }
 
@@ -83,16 +88,19 @@
 
   TemporaryNamer(Node node) : scope = _RenameVisitor.build(node).rootScope;
 
+  @override
   String getName(Identifier node) {
     var rename = scope.renames[identifierKey(node)];
     if (rename != null) return rename;
     return node.name;
   }
 
+  @override
   void enterScope(Node node) {
     scope = scope.childScopes[node];
   }
 
+  @override
   void leaveScope() {
     scope = scope.parent;
   }
@@ -138,6 +146,7 @@
     _finishNames();
   }
 
+  @override
   declare(Identifier node) {
     var id = identifierKey(node);
     var notAlreadyDeclared = scope.declared.add(id);
@@ -147,6 +156,7 @@
     _markUsed(node, id, scope);
   }
 
+  @override
   visitIdentifier(Identifier node) {
     var id = identifierKey(node);
 
@@ -180,11 +190,13 @@
     }
   }
 
+  @override
   visitFunctionExpression(FunctionExpression node) {
     // Visit nested functions after all identifiers are declared.
     scope.childScopes[node] = _FunctionScope(scope);
   }
 
+  @override
   visitClassExpression(ClassExpression node) {
     scope.childScopes[node] = _FunctionScope(scope);
   }
diff --git a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
index a7bd241..f5e355b 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
@@ -31,9 +31,13 @@
 /// Inhabited by booleans (including JSBool), null, and undefined
 class JSBoolean extends JSType {
   const JSBoolean();
+  @override
   bool get isPrimitive => true;
+  @override
   bool get isPrimitiveInJS => true;
+  @override
   bool get isFalsey => true;
+  @override
   String get primitiveTypeOf => 'boolean';
 }
 
@@ -45,42 +49,59 @@
 /// It's defined in our "dart:_interceptors".
 class JSNumber extends JSType {
   const JSNumber();
+  @override
   bool get isPrimitive => true;
+  @override
   bool get isPrimitiveInJS => true;
+  @override
   bool get isFalsey => true;
+  @override
   String get primitiveTypeOf => 'number';
 }
 
 /// Inhabited by null and undefined
 class JSNull extends JSType {
   const JSNull();
+  @override
   bool get isPrimitive => false;
+  @override
   bool get isPrimitiveInJS => false;
+  @override
   bool get isFalsey => true;
 }
 
 /// Inhabited by objects, null, and undefined
 class JSObject extends JSType {
   const JSObject();
+  @override
   bool get isPrimitive => false;
+  @override
   bool get isPrimitiveInJS => false;
+  @override
   bool get isFalsey => false;
 }
 
 /// Inhabited by strings (including JSString), null, and undefined
 class JSString extends JSType {
   const JSString();
+  @override
   bool get isPrimitive => true;
+  @override
   bool get isPrimitiveInJS => false;
+  @override
   bool get isFalsey => true;
+  @override
   String get primitiveTypeOf => 'string';
 }
 
 /// Inhabitance not statically known
 class JSUnknown extends JSType {
   const JSUnknown();
+  @override
   bool get isPrimitive => false;
+  @override
   bool get isPrimitiveInJS => false;
+  @override
   bool get isFalsey => true;
 }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index d9270a2..05cc667 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -585,10 +585,12 @@
 
   static final instance = _IdentifierFinder();
 
+  @override
   visitIdentifier(node) {
     if (node.name == nameToFind) found = true;
   }
 
+  @override
   visitNode(node) {
     if (!found) super.visitNode(node);
   }
diff --git a/pkg/dev_compiler/lib/src/js_ast/builder.dart b/pkg/dev_compiler/lib/src/js_ast/builder.dart
index fc44cb9..2dd8e89 100644
--- a/pkg/dev_compiler/lib/src/js_ast/builder.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/builder.dart
@@ -437,6 +437,7 @@
   final MiniJsParser parser;
   final String message;
 
+  @override
   String toString() {
     int pos = parser.lastPosition;
 
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 9cd3b7b..5c3e4e0 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -101,121 +101,197 @@
     return null;
   }
 
+  @override
   T visitProgram(Program node) => visitNode(node);
 
   T visitStatement(Statement node) => visitModuleItem(node);
   T visitLoop(Loop node) => visitStatement(node);
   T visitJump(Statement node) => visitStatement(node);
 
+  @override
   T visitBlock(Block node) => visitStatement(node);
+  @override
   T visitDebuggerStatement(node) => visitStatement(node);
+  @override
   T visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
+  @override
   T visitEmptyStatement(EmptyStatement node) => visitStatement(node);
+  @override
   T visitIf(If node) => visitStatement(node);
+  @override
   T visitFor(For node) => visitLoop(node);
+  @override
   T visitForIn(ForIn node) => visitLoop(node);
+  @override
   T visitForOf(ForOf node) => visitLoop(node);
+  @override
   T visitWhile(While node) => visitLoop(node);
+  @override
   T visitDo(Do node) => visitLoop(node);
+  @override
   T visitContinue(Continue node) => visitJump(node);
+  @override
   T visitBreak(Break node) => visitJump(node);
+  @override
   T visitReturn(Return node) => visitJump(node);
+  @override
   T visitThrow(Throw node) => visitJump(node);
+  @override
   T visitTry(Try node) => visitStatement(node);
+  @override
   T visitSwitch(Switch node) => visitStatement(node);
+  @override
   T visitFunctionDeclaration(FunctionDeclaration node) => visitStatement(node);
+  @override
   T visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+  @override
   T visitLiteralStatement(LiteralStatement node) => visitStatement(node);
 
+  @override
   T visitCatch(Catch node) => visitNode(node);
+  @override
   T visitSwitchCase(SwitchCase node) => visitNode(node);
 
   T visitExpression(Expression node) => visitNode(node);
 
+  @override
   T visitLiteralExpression(LiteralExpression node) => visitExpression(node);
+  @override
   T visitVariableDeclarationList(VariableDeclarationList node) =>
       visitExpression(node);
+  @override
   T visitAssignment(Assignment node) => visitExpression(node);
+  @override
   T visitVariableInitialization(VariableInitialization node) =>
       visitExpression(node);
 
+  @override
   T visitConditional(Conditional node) => visitExpression(node);
+  @override
   T visitNew(New node) => visitExpression(node);
+  @override
   T visitCall(Call node) => visitExpression(node);
+  @override
   T visitBinary(Binary node) => visitExpression(node);
+  @override
   T visitPrefix(Prefix node) => visitExpression(node);
+  @override
   T visitPostfix(Postfix node) => visitExpression(node);
+  @override
   T visitSpread(Spread node) => visitPrefix(node);
+  @override
   T visitYield(Yield node) => visitExpression(node);
+  @override
   T visitAccess(PropertyAccess node) => visitExpression(node);
 
+  @override
   T visitIdentifier(Identifier node) => visitExpression(node);
+  @override
   T visitThis(This node) => visitExpression(node);
+  @override
   T visitSuper(Super node) => visitExpression(node);
 
+  @override
   T visitRestParameter(RestParameter node) => visitNode(node);
 
+  @override
   T visitNamedFunction(NamedFunction node) => visitExpression(node);
   T visitFunctionExpression(FunctionExpression node) => visitExpression(node);
+  @override
   T visitFun(Fun node) => visitFunctionExpression(node);
+  @override
   T visitArrowFun(ArrowFun node) => visitFunctionExpression(node);
 
   T visitLiteral(Literal node) => visitExpression(node);
 
+  @override
   T visitLiteralBool(LiteralBool node) => visitLiteral(node);
+  @override
   T visitLiteralString(LiteralString node) => visitLiteral(node);
+  @override
   T visitLiteralNumber(LiteralNumber node) => visitLiteral(node);
+  @override
   T visitLiteralNull(LiteralNull node) => visitLiteral(node);
 
+  @override
   T visitArrayInitializer(ArrayInitializer node) => visitExpression(node);
+  @override
   T visitArrayHole(ArrayHole node) => visitExpression(node);
+  @override
   T visitObjectInitializer(ObjectInitializer node) => visitExpression(node);
+  @override
   T visitProperty(Property node) => visitNode(node);
+  @override
   T visitRegExpLiteral(RegExpLiteral node) => visitExpression(node);
+  @override
   T visitTemplateString(TemplateString node) => visitExpression(node);
+  @override
   T visitTaggedTemplate(TaggedTemplate node) => visitExpression(node);
 
+  @override
   T visitClassDeclaration(ClassDeclaration node) => visitStatement(node);
+  @override
   T visitClassExpression(ClassExpression node) => visitExpression(node);
+  @override
   T visitMethod(Method node) => visitProperty(node);
 
   T visitModuleItem(ModuleItem node) => visitNode(node);
+  @override
   T visitImportDeclaration(ImportDeclaration node) => visitModuleItem(node);
+  @override
   T visitExportDeclaration(ExportDeclaration node) => visitModuleItem(node);
+  @override
   T visitExportClause(ExportClause node) => visitNode(node);
+  @override
   T visitNameSpecifier(NameSpecifier node) => visitNode(node);
+  @override
   T visitModule(Module node) => visitNode(node);
 
   T visitInterpolatedNode(InterpolatedNode node) => visitNode(node);
 
+  @override
   T visitInterpolatedExpression(InterpolatedExpression node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedLiteral(InterpolatedLiteral node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedParameter(InterpolatedParameter node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedSelector(InterpolatedSelector node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedStatement(InterpolatedStatement node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedMethod(InterpolatedMethod node) =>
       visitInterpolatedNode(node);
+  @override
   T visitInterpolatedIdentifier(InterpolatedIdentifier node) =>
       visitInterpolatedNode(node);
 
   // Ignore comments by default.
+  @override
   T visitComment(Comment node) => null;
+  @override
   T visitCommentExpression(CommentExpression node) => null;
 
+  @override
   T visitAwait(Await node) => visitExpression(node);
+  @override
   T visitDartYield(DartYield node) => visitStatement(node);
 
   T visitBindingPattern(BindingPattern node) => visitNode(node);
+  @override
   T visitArrayBindingPattern(ArrayBindingPattern node) =>
       visitBindingPattern(node);
+  @override
   T visitObjectBindingPattern(ObjectBindingPattern node) =>
       visitBindingPattern(node);
+  @override
   T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
+  @override
   T visitSimpleBindingPattern(SimpleBindingPattern node) => visitNode(node);
 }
 
@@ -255,6 +331,7 @@
   }
 
   // For debugging
+  @override
   String toString() {
     var context = SimpleJavaScriptPrintingContext();
     var opts = JavaScriptPrintingOptions(allowKeywordsInProperties: true);
@@ -280,11 +357,14 @@
 
   Program(this.body, {this.scriptTag, this.name});
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitProgram(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (ModuleItem statement in body) statement.accept(visitor);
   }
 
+  @override
   Program _clone() => Program(body);
 }
 
@@ -317,7 +397,9 @@
     return shadows(names) ? Block([this], isScope: true) : this;
   }
 
+  @override
   Statement toStatement() => this;
+  @override
   Statement toReturn() => Block([this, Return()]);
 
   Block toBlock() => Block([this]);
@@ -355,11 +437,14 @@
       ..sourceInformation = sourceInformation;
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitBlock(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in statements) statement.accept(visitor);
   }
 
+  @override
   Block _clone() => Block(statements);
 }
 
@@ -373,19 +458,25 @@
     return expression is VariableDeclarationList && expression.shadows(names);
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitExpressionStatement(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     expression.accept(visitor);
   }
 
+  @override
   ExpressionStatement _clone() => ExpressionStatement(expression);
 }
 
 class EmptyStatement extends Statement {
   EmptyStatement();
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitEmptyStatement(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   EmptyStatement _clone() => EmptyStatement();
 }
 
@@ -403,14 +494,17 @@
 
   bool get hasElse => otherwise != null;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitIf(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     condition.accept(visitor);
     then.accept(visitor);
     if (otherwise != null) otherwise.accept(visitor);
   }
 
+  @override
   If _clone() => If(condition, then, otherwise);
 }
 
@@ -426,8 +520,10 @@
 
   For(this.init, this.condition, this.update, Statement body) : super(body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitFor(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     if (init != null) init.accept(visitor);
     if (condition != null) condition.accept(visitor);
@@ -435,6 +531,7 @@
     body.accept(visitor);
   }
 
+  @override
   For _clone() => For(init, condition, update, body);
 }
 
@@ -446,14 +543,17 @@
 
   ForIn(this.leftHandSide, this.object, Statement body) : super(body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitForIn(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     leftHandSide.accept(visitor);
     object.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   ForIn _clone() => ForIn(leftHandSide, object, body);
 }
 
@@ -465,14 +565,17 @@
 
   ForOf(this.leftHandSide, this.iterable, Statement body) : super(body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitForOf(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     leftHandSide.accept(visitor);
     iterable.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   ForIn _clone() => ForIn(leftHandSide, iterable, body);
 }
 
@@ -481,13 +584,16 @@
 
   While(this.condition, Statement body) : super(body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitWhile(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     condition.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   While _clone() => While(condition, body);
 }
 
@@ -496,13 +602,16 @@
 
   Do(Statement body, this.condition) : super(body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitDo(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     body.accept(visitor);
     condition.accept(visitor);
   }
 
+  @override
   Do _clone() => Do(body, condition);
 }
 
@@ -511,9 +620,12 @@
 
   Continue(this.targetLabel);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitContinue(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
 
+  @override
   Continue _clone() => Continue(targetLabel);
 }
 
@@ -522,9 +634,12 @@
 
   Break(this.targetLabel);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitBreak(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
 
+  @override
   Break _clone() => Break(targetLabel);
 }
 
@@ -536,14 +651,18 @@
   @override
   bool get alwaysReturns => true;
 
+  @override
   Statement toReturn() => this;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitReturn(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     if (value != null) value.accept(visitor);
   }
 
+  @override
   Return _clone() => Return(value);
 
   static bool foundIn(Node node) {
@@ -557,10 +676,12 @@
 
 class _ReturnFinder extends BaseVisitor {
   bool found = false;
+  @override
   visitReturn(Return node) {
     found = true;
   }
 
+  @override
   visitNode(Node node) {
     if (!found) super.visitNode(node);
   }
@@ -571,12 +692,15 @@
 
   Throw(this.expression);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitThrow(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     expression.accept(visitor);
   }
 
+  @override
   Throw _clone() => Throw(expression);
 }
 
@@ -589,14 +713,17 @@
     assert(catchPart != null || finallyPart != null);
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitTry(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     body.accept(visitor);
     if (catchPart != null) catchPart.accept(visitor);
     if (finallyPart != null) finallyPart.accept(visitor);
   }
 
+  @override
   Try _clone() => Try(body, catchPart, finallyPart);
 }
 
@@ -606,13 +733,16 @@
 
   Catch(this.declaration, this.body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitCatch(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     declaration.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   Catch _clone() => Catch(declaration, body);
 }
 
@@ -622,13 +752,16 @@
 
   Switch(this.key, this.cases);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSwitch(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     key.accept(visitor);
     for (var clause in cases) clause.accept(visitor);
   }
 
+  @override
   Switch _clone() => Switch(key, cases);
 }
 
@@ -641,13 +774,16 @@
 
   bool get isDefault => expression == null;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSwitchCase(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     expression?.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   SwitchCase _clone() => SwitchCase(expression, body);
 }
 
@@ -657,13 +793,16 @@
 
   FunctionDeclaration(this.name, this.function);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitFunctionDeclaration(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     name.accept(visitor);
     function.accept(visitor);
   }
 
+  @override
   FunctionDeclaration _clone() => FunctionDeclaration(name, function);
 }
 
@@ -673,12 +812,15 @@
 
   LabeledStatement(this.label, this.body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLabeledStatement(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     body.accept(visitor);
   }
 
+  @override
   LabeledStatement _clone() => LabeledStatement(label, body);
 }
 
@@ -687,9 +829,12 @@
 
   LiteralStatement(this.code);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralStatement(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
 
+  @override
   LiteralStatement _clone() => LiteralStatement(code);
 }
 
@@ -702,12 +847,15 @@
 
   DartYield(this.expression, this.hasStar);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitDartYield(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     expression.accept(visitor);
   }
 
+  @override
   DartYield _clone() => DartYield(expression, hasStar);
 }
 
@@ -724,7 +872,9 @@
 
   int get precedenceLevel;
 
+  @override
   Statement toStatement() => ExpressionStatement(toVoidExpression());
+  @override
   Statement toReturn() => Return(this);
 
   // TODO(jmesserly): make this return a Yield?
@@ -748,18 +898,22 @@
   LiteralExpression(this.template) : inputs = const [];
   LiteralExpression.withData(this.template, this.inputs);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralExpression(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     if (inputs != null) {
       for (Expression expr in inputs) expr.accept(visitor);
     }
   }
 
+  @override
   LiteralExpression _clone() => LiteralExpression.withData(template, inputs);
 
   // Code that uses JS must take care of operator precedences, and
   // put parenthesis if needed.
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -786,18 +940,22 @@
     return false;
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitVariableDeclarationList(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (VariableInitialization declaration in declarations) {
       declaration.accept(visitor);
     }
   }
 
+  @override
   VariableDeclarationList _clone() =>
       VariableDeclarationList(keyword, declarations);
 
+  @override
   int get precedenceLevel => EXPRESSION;
 }
 
@@ -809,17 +967,21 @@
   Assignment(this.leftHandSide, this.value) : op = null;
   Assignment.compound(this.leftHandSide, this.op, this.value);
 
+  @override
   int get precedenceLevel => ASSIGNMENT;
 
   bool get isCompound => op != null;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAssignment(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     leftHandSide.accept(visitor);
     if (value != null) value.accept(visitor);
   }
 
+  @override
   Assignment _clone() => Assignment.compound(leftHandSide, op, value);
 }
 
@@ -830,13 +992,17 @@
   /// [value] may be null.
   VariableInitialization(this.declaration, this.value);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitVariableInitialization(this);
 
+  @override
   VariableInitialization _clone() => VariableInitialization(declaration, value);
 
+  @override
   int get precedenceLevel => ASSIGNMENT;
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     declaration.accept(visitor);
     if (value != null) value.accept(visitor);
@@ -872,13 +1038,16 @@
     assert(name != null || structure != null);
   }
 
+  @override
   bool shadows(Set<String> names) {
     return (name?.shadows(names) ?? false) ||
         (structure?.shadows(names) ?? false);
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitDestructuredVariable(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     name?.accept(visitor);
     structure?.accept(visitor);
@@ -902,11 +1071,13 @@
   final List<DestructuredVariable> variables;
   BindingPattern(this.variables);
 
+  @override
   bool shadows(Set<String> names) {
     for (var v in variables) if (v.shadows(names)) return true;
     return false;
   }
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (DestructuredVariable v in variables) v.accept(visitor);
   }
@@ -918,6 +1089,7 @@
       : name = name,
         super([DestructuredVariable(name: name)]);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitSimpleBindingPattern(this);
 
@@ -933,6 +1105,7 @@
 
 class ObjectBindingPattern extends BindingPattern {
   ObjectBindingPattern(List<DestructuredVariable> variables) : super(variables);
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitObjectBindingPattern(this);
 
@@ -945,6 +1118,7 @@
 
 class ArrayBindingPattern extends BindingPattern {
   ArrayBindingPattern(List<DestructuredVariable> variables) : super(variables);
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayBindingPattern(this);
 
   /// Avoid parenthesis when pretty-printing.
@@ -961,16 +1135,20 @@
 
   Conditional(this.condition, this.then, this.otherwise);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitConditional(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     condition.accept(visitor);
     then.accept(visitor);
     otherwise.accept(visitor);
   }
 
+  @override
   Conditional _clone() => Conditional(condition, then, otherwise);
 
+  @override
   int get precedenceLevel => ASSIGNMENT;
 }
 
@@ -980,25 +1158,32 @@
 
   Call(this.target, this.arguments);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitCall(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     target.accept(visitor);
     for (Expression arg in arguments) arg.accept(visitor);
   }
 
+  @override
   Call _clone() => Call(target, arguments);
 
+  @override
   int get precedenceLevel => CALL;
 }
 
 class New extends Call {
   New(Expression cls, List<Expression> arguments) : super(cls, arguments);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitNew(this);
 
+  @override
   New _clone() => New(target, arguments);
 
+  @override
   int get precedenceLevel => ACCESS;
 }
 
@@ -1009,17 +1194,22 @@
 
   Binary(this.op, this.left, this.right);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitBinary(this);
 
+  @override
   Binary _clone() => Binary(op, left, right);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     left.accept(visitor);
     right.accept(visitor);
   }
 
+  @override
   bool get isCommaOperator => op == ',';
 
+  @override
   Expression toVoidExpression() {
     if (!isCommaOperator) return super.toVoidExpression();
     var l = left.toVoidExpression();
@@ -1028,16 +1218,19 @@
     return Binary(',', l, r);
   }
 
+  @override
   Statement toStatement() {
     if (!isCommaOperator) return super.toStatement();
     return Block([left.toStatement(), right.toStatement()]);
   }
 
+  @override
   Statement toReturn() {
     if (!isCommaOperator) return super.toReturn();
     return Block([left.toStatement(), right.toReturn()]);
   }
 
+  @override
   Statement toYieldStatement({bool star = false}) {
     if (!isCommaOperator) return super.toYieldStatement(star: star);
     return Block([left.toStatement(), right.toYieldStatement(star: star)]);
@@ -1060,6 +1253,7 @@
     }
   }
 
+  @override
   int get precedenceLevel {
     // TODO(floitsch): switch to constant map.
     switch (op) {
@@ -1110,14 +1304,18 @@
 
   Prefix(this.op, this.argument);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitPrefix(this);
 
+  @override
   Prefix _clone() => Prefix(op, argument);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     argument.accept(visitor);
   }
 
+  @override
   int get precedenceLevel => UNARY;
 }
 
@@ -1127,7 +1325,9 @@
 class Spread extends Prefix {
   Spread(Expression operand) : super('...', operand);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSpread(this);
+  @override
   Spread _clone() => Spread(argument);
 }
 
@@ -1137,14 +1337,18 @@
 
   Postfix(this.op, this.argument);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitPostfix(this);
 
+  @override
   Postfix _clone() => Postfix(op, argument);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     argument.accept(visitor);
   }
 
+  @override
   int get precedenceLevel => UNARY;
 }
 
@@ -1163,12 +1367,18 @@
   }
   static RegExp _identifierRE = RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
 
+  @override
   bool shadows(Set<String> names) => names.contains(name);
 
+  @override
   Identifier _clone() => Identifier(name, allowRename: allowRename);
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitIdentifier(this);
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   String get parameterName => name;
+  @override
   void visitChildren(NodeVisitor visitor) {}
 }
 
@@ -1178,31 +1388,45 @@
 
   RestParameter(this.parameter);
 
+  @override
   bool shadows(Set<String> names) => names.contains(parameter.name);
 
+  @override
   RestParameter _clone() => RestParameter(parameter);
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitRestParameter(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     parameter.accept(visitor);
   }
 
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   String get parameterName => parameter.parameterName;
 }
 
 class This extends Expression {
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitThis(this);
+  @override
   This _clone() => This();
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   void visitChildren(NodeVisitor visitor) {}
 }
 
 // `super` is more restricted in the ES6 spec, but for simplicity we accept
 // it anywhere that `this` is accepted.
 class Super extends Expression {
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSuper(this);
+  @override
   Super _clone() => Super();
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   void visitChildren(NodeVisitor visitor) {}
 }
 
@@ -1216,15 +1440,19 @@
 
   NamedFunction(this.name, this.function, [this.immediatelyInvoked = false]);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitNamedFunction(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     name.accept(visitor);
     function.accept(visitor);
   }
 
+  @override
   NamedFunction _clone() => NamedFunction(name, function, immediatelyInvoked);
 
+  @override
   int get precedenceLevel =>
       immediatelyInvoked ? EXPRESSION : PRIMARY_LOW_PRECEDENCE;
 }
@@ -1235,7 +1463,9 @@
 }
 
 class Fun extends FunctionExpression {
+  @override
   final List<Parameter> params;
+  @override
   final Block body;
 
   /** Whether this is a JS generator (`function*`) that may contain `yield`. */
@@ -1247,34 +1477,44 @@
       {this.isGenerator = false,
       this.asyncModifier = const AsyncModifier.sync()});
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitFun(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (Parameter param in params) param.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   Fun _clone() =>
       Fun(params, body, isGenerator: isGenerator, asyncModifier: asyncModifier);
 
+  @override
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
 
 class ArrowFun extends FunctionExpression {
+  @override
   final List<Parameter> params;
+  @override
   final body; // Expression or Block
 
   ArrowFun(this.params, this.body);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrowFun(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (Parameter param in params) param.accept(visitor);
     body.accept(visitor);
   }
 
+  @override
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 
+  @override
   ArrowFun _clone() => ArrowFun(params, body);
 }
 
@@ -1305,6 +1545,7 @@
       : isAsync = false,
         isYielding = true,
         description = "sync*";
+  @override
   toString() => description;
 }
 
@@ -1318,21 +1559,27 @@
   PropertyAccess.indexed(this.receiver, int index)
       : selector = LiteralNumber('$index');
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAccess(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     receiver.accept(visitor);
     selector.accept(visitor);
   }
 
+  @override
   PropertyAccess _clone() => PropertyAccess(receiver, selector);
 
+  @override
   int get precedenceLevel => ACCESS;
 }
 
 abstract class Literal extends Expression {
+  @override
   void visitChildren(NodeVisitor visitor) {}
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1341,15 +1588,19 @@
 
   LiteralBool(this.value);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralBool(this);
   // [visitChildren] inherited from [Literal].
+  @override
   LiteralBool _clone() => LiteralBool(value);
 }
 
 class LiteralNull extends Literal {
   LiteralNull();
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNull(this);
+  @override
   LiteralNull _clone() => LiteralNull();
 }
 
@@ -1371,7 +1622,9 @@
   /// Gets the value inside the string without the beginning and end quotes.
   String get valueWithoutQuotes => value.substring(1, value.length - 1);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralString(this);
+  @override
   LiteralString _clone() => LiteralString(value);
 }
 
@@ -1380,13 +1633,16 @@
 
   LiteralNumber(this.value);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNumber(this);
+  @override
   LiteralNumber _clone() => LiteralNumber(value);
 
   /**
    * Use a different precedence level depending on whether the value contains a
    * dot to ensure we generate `(1).toString()` and `1.0.toString()`.
    */
+  @override
   int get precedenceLevel => value.contains('.') ? PRIMARY : UNARY;
 }
 
@@ -1396,14 +1652,18 @@
 
   ArrayInitializer(this.elements, {this.multiline = false});
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayInitializer(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (Expression element in elements) element.accept(visitor);
   }
 
+  @override
   ArrayInitializer _clone() => ArrayInitializer(elements);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1412,12 +1672,16 @@
  * For example the list [1, , , 2] would contain two holes.
  */
 class ArrayHole extends Expression {
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayHole(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {}
 
+  @override
   ArrayHole _clone() => ArrayHole();
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1431,14 +1695,18 @@
   ObjectInitializer(this.properties, {bool multiline = false})
       : _multiline = multiline;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitObjectInitializer(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (Property init in properties) init.accept(visitor);
   }
 
+  @override
   ObjectInitializer _clone() => ObjectInitializer(properties);
 
+  @override
   int get precedenceLevel => PRIMARY;
   /**
    * If set to true, forces a vertical layout when using the [Printer].
@@ -1456,13 +1724,16 @@
 
   Property(this.name, this.value);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitProperty(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     name.accept(visitor);
     value.accept(visitor);
   }
 
+  @override
   Property _clone() => Property(name, value);
 }
 
@@ -1492,16 +1763,20 @@
     assert(strings.length == interpolations.length + 1);
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitTemplateString(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (var element in interpolations) {
       element.accept(visitor);
     }
   }
 
+  @override
   TemplateString _clone() => TemplateString(strings, interpolations);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1512,15 +1787,19 @@
 
   TaggedTemplate(this.tag, this.template);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitTaggedTemplate(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     tag.accept(visitor);
     template.accept(visitor);
   }
 
+  @override
   TaggedTemplate _clone() => TaggedTemplate(tag, template);
 
+  @override
   int get precedenceLevel => CALL;
 }
 
@@ -1536,14 +1815,18 @@
 
   Yield(this.value, {this.star = false});
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitYield(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     if (value != null) value.accept(visitor);
   }
 
+  @override
   Yield _clone() => Yield(value);
 
+  @override
   int get precedenceLevel => YIELD;
 }
 
@@ -1552,8 +1835,11 @@
 
   ClassDeclaration(this.classExpr);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitClassDeclaration(this);
+  @override
   visitChildren(NodeVisitor visitor) => classExpr.accept(visitor);
+  @override
   ClassDeclaration _clone() => ClassDeclaration(classExpr);
 }
 
@@ -1564,8 +1850,10 @@
 
   ClassExpression(this.name, this.heritage, this.methods);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitClassExpression(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     name.accept(visitor);
     if (heritage != null) heritage.accept(visitor);
@@ -1575,12 +1863,15 @@
   @override
   ClassDeclaration toStatement() => ClassDeclaration(this);
 
+  @override
   ClassExpression _clone() => ClassExpression(name, heritage, methods);
 
+  @override
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
 
 class Method extends Node implements Property {
+  @override
   final Expression name;
   final Fun function;
   final bool isGetter;
@@ -1594,15 +1885,19 @@
     assert(!isGetter && !isSetter || !function.isGenerator);
   }
 
+  @override
   Fun get value => function;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitMethod(this);
 
+  @override
   void visitChildren(NodeVisitor visitor) {
     name.accept(visitor);
     function.accept(visitor);
   }
 
+  @override
   Method _clone() => Method(name, function,
       isGetter: isGetter, isSetter: isSetter, isStatic: isStatic);
 }
@@ -1616,76 +1911,103 @@
 }
 
 class InterpolatedExpression extends Expression with InterpolatedNode {
+  @override
   final nameOrPosition;
 
   InterpolatedExpression(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedExpression(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedExpression _clone() => InterpolatedExpression(nameOrPosition);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
 class InterpolatedLiteral extends Literal with InterpolatedNode {
+  @override
   final nameOrPosition;
 
   InterpolatedLiteral(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitInterpolatedLiteral(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedLiteral _clone() => InterpolatedLiteral(nameOrPosition);
 }
 
 class InterpolatedParameter extends Expression
     with InterpolatedNode
     implements Identifier {
+  @override
   final nameOrPosition;
 
+  @override
   String get name {
     throw "InterpolatedParameter.name must not be invoked";
   }
 
+  @override
   String get parameterName {
     throw "InterpolatedParameter.parameterName must not be invoked";
   }
 
+  @override
   bool shadows(Set<String> names) => false;
 
+  @override
   bool get allowRename => false;
 
   InterpolatedParameter(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedParameter(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedParameter _clone() => InterpolatedParameter(nameOrPosition);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
 class InterpolatedSelector extends Expression with InterpolatedNode {
+  @override
   final nameOrPosition;
 
   InterpolatedSelector(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedSelector(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedSelector _clone() => InterpolatedSelector(nameOrPosition);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
 class InterpolatedStatement extends Statement with InterpolatedNode {
+  @override
   final nameOrPosition;
 
   InterpolatedStatement(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedStatement(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedStatement _clone() => InterpolatedStatement(nameOrPosition);
 }
 
@@ -1693,20 +2015,31 @@
 class InterpolatedMethod extends Expression
     with InterpolatedNode
     implements Method {
+  @override
   final nameOrPosition;
 
   InterpolatedMethod(this.nameOrPosition);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitInterpolatedMethod(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedMethod _clone() => InterpolatedMethod(nameOrPosition);
 
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   Expression get name => throw _unsupported;
+  @override
   Fun get value => throw _unsupported;
+  @override
   bool get isGetter => throw _unsupported;
+  @override
   bool get isSetter => throw _unsupported;
+  @override
   bool get isStatic => throw _unsupported;
+  @override
   Fun get function => throw _unsupported;
   Error get _unsupported =>
       UnsupportedError('$runtimeType does not support this member.');
@@ -1715,21 +2048,30 @@
 class InterpolatedIdentifier extends Expression
     with InterpolatedNode
     implements Identifier {
+  @override
   final nameOrPosition;
 
   InterpolatedIdentifier(this.nameOrPosition);
 
+  @override
   bool shadows(Set<String> names) => false;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedIdentifier(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   InterpolatedIdentifier _clone() => InterpolatedIdentifier(nameOrPosition);
 
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   String get name => throw '$runtimeType does not support this member.';
+  @override
   String get parameterName =>
       throw '$runtimeType does not support this member.';
+  @override
   bool get allowRename => false;
 }
 
@@ -1744,10 +2086,14 @@
 
   RegExpLiteral(this.pattern);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitRegExpLiteral(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   RegExpLiteral _clone() => RegExpLiteral(pattern);
 
+  @override
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1763,9 +2109,13 @@
 
   Await(this.expression);
 
+  @override
   int get precedenceLevel => UNARY;
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAwait(this);
+  @override
   void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
+  @override
   Await _clone() => Await(expression);
 }
 
@@ -1780,9 +2130,12 @@
 
   Comment(this.comment);
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitComment(this);
+  @override
   Comment _clone() => Comment(comment);
 
+  @override
   void visitChildren(NodeVisitor visitor) {}
 }
 
@@ -1798,16 +2151,23 @@
 
   CommentExpression(this.comment, this.expression);
 
+  @override
   int get precedenceLevel => PRIMARY;
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitCommentExpression(this);
+  @override
   CommentExpression _clone() => CommentExpression(comment, expression);
 
+  @override
   void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
 }
 
 class DebuggerStatement extends Statement {
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitDebuggerStatement(this);
+  @override
   DebuggerStatement _clone() => DebuggerStatement();
+  @override
   void visitChildren(NodeVisitor visitor) {}
 }
 
@@ -1842,7 +2202,9 @@
     return null;
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitImportDeclaration(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     if (namedImports != null) {
       for (NameSpecifier name in namedImports) name.accept(visitor);
@@ -1850,6 +2212,7 @@
     from.accept(visitor);
   }
 
+  @override
   ImportDeclaration _clone() => ImportDeclaration(
       defaultBinding: defaultBinding, namedImports: namedImports, from: from);
 }
@@ -1897,8 +2260,11 @@
     throw StateError('invalid export declaration');
   }
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitExportDeclaration(this);
+  @override
   visitChildren(NodeVisitor visitor) => exported.accept(visitor);
+  @override
   ExportDeclaration _clone() =>
       ExportDeclaration(exported, isDefault: isDefault);
 }
@@ -1916,12 +2282,15 @@
   /** True if this is an `export *`. */
   bool get exportStar => exports.length == 1 && exports[0].isStar;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitExportClause(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (NameSpecifier name in exports) name.accept(visitor);
     if (from != null) from.accept(visitor);
   }
 
+  @override
   ExportClause _clone() => ExportClause(exports, from: from);
 }
 
@@ -1936,8 +2305,11 @@
   /** True if this is a `* as someName` specifier. */
   bool get isStar => name == null;
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitNameSpecifier(this);
+  @override
   void visitChildren(NodeVisitor visitor) {}
+  @override
   NameSpecifier _clone() => NameSpecifier(name, asName: asName);
 }
 
@@ -1951,10 +2323,13 @@
   final List<ModuleItem> body;
   Module(this.body, {this.name});
 
+  @override
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitModule(this);
+  @override
   void visitChildren(NodeVisitor visitor) {
     for (ModuleItem item in body) item.accept(visitor);
   }
 
+  @override
   Module _clone() => Module(body);
 }
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index bdd29bd..d9d2f4b 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -47,6 +47,7 @@
 class SimpleJavaScriptPrintingContext extends JavaScriptPrintingContext {
   final StringBuffer buffer = StringBuffer();
 
+  @override
   void emit(String string) {
     buffer.write(string);
   }
@@ -233,6 +234,7 @@
     nodes.forEach(visit);
   }
 
+  @override
   visitProgram(Program program) {
     if (program.scriptTag != null) {
       out('#!${program.scriptTag}\n');
@@ -284,14 +286,17 @@
     if (needsNewline) lineOut();
   }
 
+  @override
   visitBlock(Block block) {
     blockOut(block, true, true);
   }
 
+  @override
   visitDebuggerStatement(node) {
     outIndentLn('debugger;');
   }
 
+  @override
   visitExpressionStatement(ExpressionStatement expressionStatement) {
     indent();
     visitNestedExpression(expressionStatement.expression, EXPRESSION,
@@ -299,6 +304,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitEmptyStatement(EmptyStatement nop) {
     outIndentLn(";");
   }
@@ -352,10 +358,12 @@
     }
   }
 
+  @override
   visitIf(If node) {
     ifOut(node, true);
   }
 
+  @override
   visitFor(For loop) {
     outIndent("for");
     spaceOut();
@@ -380,6 +388,7 @@
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
 
+  @override
   visitForIn(ForIn loop) {
     outIndent("for");
     spaceOut();
@@ -394,6 +403,7 @@
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
 
+  @override
   visitForOf(ForOf loop) {
     outIndent("for");
     spaceOut();
@@ -408,6 +418,7 @@
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
 
+  @override
   visitWhile(While loop) {
     outIndent("while");
     spaceOut();
@@ -418,6 +429,7 @@
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
 
+  @override
   visitDo(Do loop) {
     outIndent("do");
     if (blockBody(loop.body, needsSeparation: true, needsNewline: false)) {
@@ -434,6 +446,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitContinue(Continue node) {
     if (node.targetLabel == null) {
       outIndent("continue");
@@ -443,6 +456,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitBreak(Break node) {
     if (node.targetLabel == null) {
       outIndent("break");
@@ -452,6 +466,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitReturn(Return node) {
     if (node.value == null) {
       outIndent("return");
@@ -464,6 +479,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitDartYield(DartYield node) {
     if (node.hasStar) {
       outIndent("yield*");
@@ -476,6 +492,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitThrow(Throw node) {
     outIndent("throw");
     pendingSpace = true;
@@ -484,6 +501,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitTry(Try node) {
     outIndent("try");
     blockBody(node.body, needsSeparation: true, needsNewline: false);
@@ -499,6 +517,7 @@
     }
   }
 
+  @override
   visitCatch(Catch node) {
     spaceOut();
     out("catch");
@@ -510,6 +529,7 @@
     blockBody(node.body, needsSeparation: false, needsNewline: false);
   }
 
+  @override
   visitSwitch(Switch node) {
     outIndent("switch");
     spaceOut();
@@ -525,6 +545,7 @@
     outIndentLn("}");
   }
 
+  @override
   visitSwitchCase(SwitchCase node) {
     if (node.isDefault) {
       outIndentLn("default:");
@@ -540,6 +561,7 @@
     }
   }
 
+  @override
   visitLabeledStatement(LabeledStatement node) {
     outIndent("${node.label}:");
     blockBody(node.body, needsSeparation: false, needsNewline: true);
@@ -578,6 +600,7 @@
     localNamer.leaveScope();
   }
 
+  @override
   visitFunctionDeclaration(FunctionDeclaration declaration) {
     indent();
     var f = declaration.function;
@@ -616,6 +639,7 @@
     }
   }
 
+  @override
   visitVariableDeclarationList(VariableDeclarationList list) {
     // Note: keyword can be null for non-static field declarations.
     if (list.keyword != null) {
@@ -626,6 +650,7 @@
         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
+  @override
   visitArrayBindingPattern(ArrayBindingPattern node) {
     out("[");
     visitCommaSeparated(node.variables, EXPRESSION,
@@ -633,6 +658,7 @@
     out("]");
   }
 
+  @override
   visitObjectBindingPattern(ObjectBindingPattern node) {
     out("{");
     visitCommaSeparated(node.variables, EXPRESSION,
@@ -640,6 +666,7 @@
     out("}");
   }
 
+  @override
   visitDestructuredVariable(DestructuredVariable node) {
     var name = node.name;
     var property = node.property;
@@ -668,10 +695,12 @@
     }
   }
 
+  @override
   visitSimpleBindingPattern(SimpleBindingPattern node) {
     visit(node.name);
   }
 
+  @override
   visitAssignment(Assignment assignment) {
     visitNestedExpression(assignment.leftHandSide, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
@@ -686,6 +715,7 @@
     }
   }
 
+  @override
   visitVariableInitialization(VariableInitialization init) {
     visitNestedExpression(init.declaration, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
@@ -698,6 +728,7 @@
     }
   }
 
+  @override
   visitConditional(Conditional cond) {
     visitNestedExpression(cond.condition, LOGICAL_OR,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
@@ -714,6 +745,7 @@
         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
+  @override
   visitNew(New node) {
     out("new ");
     inNewTarget = true;
@@ -726,6 +758,7 @@
     out(")");
   }
 
+  @override
   visitCall(Call call) {
     visitNestedExpression(call.target, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
@@ -735,6 +768,7 @@
     out(")");
   }
 
+  @override
   visitBinary(Binary binary) {
     Expression left = binary.left;
     Expression right = binary.right;
@@ -835,6 +869,7 @@
         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
+  @override
   visitPrefix(Prefix unary) {
     String op = unary.op;
     switch (op) {
@@ -863,8 +898,10 @@
         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
+  @override
   visitSpread(Spread unary) => visitPrefix(unary);
 
+  @override
   visitYield(Yield yield) {
     out(yield.star ? "yield*" : "yield");
     if (yield.value == null) return;
@@ -873,24 +910,29 @@
         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
+  @override
   visitPostfix(Postfix postfix) {
     visitNestedExpression(postfix.argument, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     out(postfix.op);
   }
 
+  @override
   visitThis(This node) {
     out("this");
   }
 
+  @override
   visitSuper(Super node) {
     out("super");
   }
 
+  @override
   visitIdentifier(Identifier node) {
     out(localNamer.getName(node));
   }
 
+  @override
   visitRestParameter(RestParameter node) {
     out('...');
     visitIdentifier(node.parameter);
@@ -921,6 +963,7 @@
     return options.allowKeywordsInProperties || field != '"super"';
   }
 
+  @override
   visitAccess(PropertyAccess access) {
     // Normally we can omit parens on the receiver if it is a Call, even though
     // Call expressions have lower precedence. However this optimization doesn't
@@ -943,6 +986,7 @@
     propertyNameOut(access.selector, inAccess: true);
   }
 
+  @override
   visitNamedFunction(NamedFunction namedFunction) {
     var f = namedFunction.function;
     context.enterNode(f);
@@ -950,10 +994,12 @@
     context.exitNode(f);
   }
 
+  @override
   visitFun(Fun fun) {
     functionOut(fun, null);
   }
 
+  @override
   visitArrowFun(ArrowFun fun) {
     localNamer.enterScope(fun);
     if (fun.params.length == 1 && fun.params[0] is Identifier) {
@@ -984,14 +1030,17 @@
     localNamer.leaveScope();
   }
 
+  @override
   visitLiteralBool(LiteralBool node) {
     out(node.value ? "true" : "false");
   }
 
+  @override
   visitLiteralString(LiteralString node) {
     out(node.value);
   }
 
+  @override
   visitLiteralNumber(LiteralNumber node) {
     int charCode = node.value.codeUnitAt(0);
     if (charCode == charCodes.$MINUS && lastCharCode == charCodes.$MINUS) {
@@ -1000,10 +1049,12 @@
     out(node.value);
   }
 
+  @override
   visitLiteralNull(LiteralNull node) {
     out("null");
   }
 
+  @override
   visitArrayInitializer(ArrayInitializer node) {
     out("[");
     indentMore();
@@ -1038,10 +1089,12 @@
     out("]");
   }
 
+  @override
   visitArrayHole(ArrayHole node) {
     throw "Unreachable";
   }
 
+  @override
   visitObjectInitializer(ObjectInitializer node) {
     List<Property> properties = node.properties;
     out("{");
@@ -1067,6 +1120,7 @@
     out("}");
   }
 
+  @override
   visitProperty(Property node) {
     propertyNameOut(node.name);
     out(":");
@@ -1075,10 +1129,12 @@
         newInForInit: false, newAtStatementBegin: false);
   }
 
+  @override
   visitRegExpLiteral(RegExpLiteral node) {
     out(node.pattern);
   }
 
+  @override
   visitTemplateString(TemplateString node) {
     out('`');
     int len = node.interpolations.length;
@@ -1092,17 +1148,20 @@
     out('`');
   }
 
+  @override
   visitTaggedTemplate(TaggedTemplate node) {
     visit(node.tag);
     visit(node.template);
   }
 
+  @override
   visitClassDeclaration(ClassDeclaration node) {
     indent();
     visit(node.classExpr);
     lineOut();
   }
 
+  @override
   visitClassExpression(ClassExpression node) {
     localNamer.enterScope(node);
     out('class ');
@@ -1130,6 +1189,7 @@
     localNamer.leaveScope();
   }
 
+  @override
   visitMethod(Method node) {
     if (node.isStatic) {
       out('static ');
@@ -1189,6 +1249,7 @@
     }
   }
 
+  @override
   visitImportDeclaration(ImportDeclaration node) {
     indent();
     out('import ');
@@ -1204,6 +1265,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitExportDeclaration(ExportDeclaration node) {
     indent();
     out('export ');
@@ -1213,6 +1275,7 @@
     outSemicolonLn();
   }
 
+  @override
   visitExportClause(ExportClause node) {
     nameSpecifierListOut(node.exports, true);
     fromClauseOut(node.from);
@@ -1248,6 +1311,7 @@
   }
 
   /// This is unused, see [nameSpecifierOut].
+  @override
   visitNameSpecifier(NameSpecifier node) {
     throw UnsupportedError('visitNameSpecifier');
   }
@@ -1276,10 +1340,12 @@
     }
   }
 
+  @override
   visitModule(Module node) {
     visitAll(node.body);
   }
 
+  @override
   visitLiteralExpression(LiteralExpression node) {
     String template = node.template;
     List<Expression> inputs = node.inputs;
@@ -1298,6 +1364,7 @@
     }
   }
 
+  @override
   visitLiteralStatement(LiteralStatement node) {
     outLn(node.code);
   }
@@ -1306,28 +1373,36 @@
     out('#${node.nameOrPosition}');
   }
 
+  @override
   visitInterpolatedExpression(InterpolatedExpression node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedLiteral(InterpolatedLiteral node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedParameter(InterpolatedParameter node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedSelector(InterpolatedSelector node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedMethod(InterpolatedMethod node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedIdentifier(InterpolatedIdentifier node) =>
       visitInterpolatedNode(node);
 
+  @override
   visitInterpolatedStatement(InterpolatedStatement node) {
     outLn('#${node.nameOrPosition}');
   }
 
+  @override
   void visitComment(Comment node) {
     if (shouldCompressOutput) return;
     String comment = node.comment.trim();
@@ -1341,6 +1416,7 @@
     }
   }
 
+  @override
   void visitCommentExpression(CommentExpression node) {
     if (shouldCompressOutput) return;
     String comment = node.comment.trim();
@@ -1353,6 +1429,7 @@
     visit(node.expression);
   }
 
+  @override
   void visitAwait(Await node) {
     out("await ");
     visit(node.expression);
@@ -1389,39 +1466,47 @@
     }
   }
 
+  @override
   void visitFunctionDeclaration(FunctionDeclaration declaration) {
     // Note that we don't bother collecting the name of the function.
     collectVarsInFunction(declaration.function);
   }
 
+  @override
   void visitNamedFunction(NamedFunction namedFunction) {
     // Note that we don't bother collecting the name of the function.
     collectVarsInFunction(namedFunction.function);
   }
 
+  @override
   void visitMethod(Method declaration) {
     collectVarsInFunction(declaration.function);
   }
 
+  @override
   void visitFun(Fun fun) {
     collectVarsInFunction(fun);
   }
 
+  @override
   void visitArrowFun(ArrowFun fun) {
     collectVarsInFunction(fun);
   }
 
+  @override
   void visitClassExpression(ClassExpression node) {
     // Note that we don't bother collecting the name of the class.
     if (node.heritage != null) node.heritage.accept(this);
     for (Method method in node.methods) method.accept(this);
   }
 
+  @override
   void visitCatch(Catch node) {
     declareVariable(node.declaration);
     node.body.accept(this);
   }
 
+  @override
   void visitVariableInitialization(VariableInitialization node) {
     // TODO(jmesserly): add ES6 support. Currently not needed because
     // dart2js does not emit ES6 rest param or destructuring.
@@ -1443,30 +1528,46 @@
 
   DanglingElseVisitor(this.context);
 
+  @override
   bool visitProgram(Program node) => false;
 
+  @override
   bool visitNode(Node node) {
     context.error("Forgot node: $node");
     return null;
   }
 
+  @override
   bool visitBlock(Block node) => false;
+  @override
   bool visitExpressionStatement(ExpressionStatement node) => false;
+  @override
   bool visitEmptyStatement(EmptyStatement node) => false;
+  @override
   bool visitIf(If node) {
     if (!node.hasElse) return true;
     return node.otherwise.accept(this);
   }
 
+  @override
   bool visitFor(For node) => node.body.accept(this);
+  @override
   bool visitForIn(ForIn node) => node.body.accept(this);
+  @override
   bool visitForOf(ForOf node) => node.body.accept(this);
+  @override
   bool visitWhile(While node) => node.body.accept(this);
+  @override
   bool visitDo(Do node) => false;
+  @override
   bool visitContinue(Continue node) => false;
+  @override
   bool visitBreak(Break node) => false;
+  @override
   bool visitReturn(Return node) => false;
+  @override
   bool visitThrow(Throw node) => false;
+  @override
   bool visitTry(Try node) {
     if (node.finallyPart != null) {
       return node.finallyPart.accept(this);
@@ -1475,14 +1576,22 @@
     }
   }
 
+  @override
   bool visitCatch(Catch node) => node.body.accept(this);
+  @override
   bool visitSwitch(Switch node) => false;
+  @override
   bool visitSwitchCase(SwitchCase node) => false;
+  @override
   bool visitFunctionDeclaration(FunctionDeclaration node) => false;
+  @override
   bool visitLabeledStatement(LabeledStatement node) => node.body.accept(this);
+  @override
   bool visitLiteralStatement(LiteralStatement node) => true;
+  @override
   bool visitClassDeclaration(ClassDeclaration node) => false;
 
+  @override
   bool visitExpression(Expression node) => false;
 }
 
@@ -1493,8 +1602,11 @@
 }
 
 class IdentityNamer implements LocalNamer {
+  @override
   String getName(Identifier node) => node.name;
+  @override
   void enterScope(Node node) {}
+  @override
   void leaveScope() {}
 }
 
@@ -1505,6 +1617,7 @@
   int parameterNumber = 0;
   int variableNumber = 0;
 
+  @override
   void enterScope(Node node) {
     var vars = VarCollector();
     node.accept(vars);
@@ -1515,12 +1628,14 @@
     vars.forEachParam(declareParameter);
   }
 
+  @override
   void leaveScope() {
     maps.removeLast();
     variableNumber = variableNumberStack.removeLast();
     parameterNumber = parameterNumberStack.removeLast();
   }
 
+  @override
   String getName(Identifier node) {
     String oldName = node.name;
     // Go from inner scope to outer looking for mapping of name.
@@ -1625,6 +1740,7 @@
 abstract class VariableDeclarationVisitor extends BaseVisitor<void> {
   declare(Identifier node);
 
+  @override
   visitFunctionExpression(FunctionExpression node) {
     node.params.forEach(_scanVariableBinding);
     node.body.accept(this);
@@ -1638,42 +1754,50 @@
     }
   }
 
+  @override
   visitRestParameter(RestParameter node) {
     _scanVariableBinding(node.parameter);
     super.visitRestParameter(node);
   }
 
+  @override
   visitDestructuredVariable(DestructuredVariable node) {
     var name = node.name;
     if (name is Identifier) _scanVariableBinding(name);
     super.visitDestructuredVariable(node);
   }
 
+  @override
   visitSimpleBindingPattern(SimpleBindingPattern node) {
     _scanVariableBinding(node.name);
     super.visitSimpleBindingPattern(node);
   }
 
+  @override
   visitVariableInitialization(VariableInitialization node) {
     _scanVariableBinding(node.declaration);
     if (node.value != null) node.value.accept(this);
   }
 
+  @override
   visitCatch(Catch node) {
     declare(node.declaration);
     node.body.accept(this);
   }
 
+  @override
   visitFunctionDeclaration(FunctionDeclaration node) {
     declare(node.name);
     node.function.accept(this);
   }
 
+  @override
   visitNamedFunction(NamedFunction node) {
     declare(node.name);
     node.function.accept(this);
   }
 
+  @override
   visitClassExpression(ClassExpression node) {
     declare(node.name);
     if (node.heritage != null) node.heritage.accept(this);
diff --git a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
index af5a5b6..d9e7da8 100644
--- a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
@@ -9,12 +9,14 @@
 class NodeEnd {
   final SourceLocation end;
   NodeEnd(this.end);
+  @override
   toString() => '#<NodeEnd $end>';
 }
 
 class NodeSpan {
   final SourceLocation start, end;
   NodeSpan(this.start, this.end);
+  @override
   toString() => '#<NodeSpan $start to $end>';
 }
 
@@ -22,6 +24,7 @@
   final SourceLocation start, end;
   final Expression expression;
   HoverComment(this.expression, this.start, this.end);
+  @override
   toString() => '#<HoverComment `$expression` @ $start to $end>';
 }
 
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 178b15c..fcc8338 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -176,6 +176,7 @@
     throw UnimplementedError('visit${node.runtimeType}');
   }
 
+  @override
   Instantiator<Expression> visitInterpolatedExpression(
       InterpolatedExpression node) {
     var nameOrPosition = node.nameOrPosition;
@@ -220,6 +221,7 @@
     return exprs;
   }
 
+  @override
   Instantiator<Literal> visitInterpolatedLiteral(InterpolatedLiteral node) {
     var nameOrPosition = node.nameOrPosition;
     return (arguments) {
@@ -230,6 +232,7 @@
     };
   }
 
+  @override
   Instantiator visitInterpolatedParameter(InterpolatedParameter node) {
     var nameOrPosition = node.nameOrPosition;
     return (arguments) {
@@ -248,6 +251,7 @@
     };
   }
 
+  @override
   Instantiator<Expression> visitInterpolatedSelector(
       InterpolatedSelector node) {
     // A selector is an expression, as in `a[selector]`.
@@ -263,6 +267,7 @@
     };
   }
 
+  @override
   Instantiator<Statement> visitInterpolatedStatement(
       InterpolatedStatement node) {
     var nameOrPosition = node.nameOrPosition;
@@ -274,6 +279,7 @@
     };
   }
 
+  @override
   Instantiator visitInterpolatedMethod(InterpolatedMethod node) {
     var nameOrPosition = node.nameOrPosition;
     return (arguments) {
@@ -289,6 +295,7 @@
     };
   }
 
+  @override
   Instantiator<Identifier> visitInterpolatedIdentifier(
       InterpolatedIdentifier node) {
     var nameOrPosition = node.nameOrPosition;
@@ -320,6 +327,7 @@
     return visit(node);
   }
 
+  @override
   Instantiator<Program> visitProgram(Program node) {
     var instantiators = node.body.map(visitSplayableStatement).toList();
     return (a) => Program(splayStatements(instantiators, a));
@@ -341,22 +349,27 @@
     return statements;
   }
 
+  @override
   Instantiator<Block> visitBlock(Block node) {
     var instantiators = node.statements.map(visitSplayableStatement).toList();
     return (a) => Block(splayStatements(instantiators, a));
   }
 
+  @override
   Instantiator<Statement> visitExpressionStatement(ExpressionStatement node) {
     Instantiator<Expression> makeExpression = visit(node.expression);
     return (a) => makeExpression(a).toStatement();
   }
 
+  @override
   Instantiator<DebuggerStatement> visitDebuggerStatement(node) =>
       (a) => DebuggerStatement();
 
+  @override
   Instantiator<EmptyStatement> visitEmptyStatement(EmptyStatement node) =>
       (a) => EmptyStatement();
 
+  @override
   Instantiator<Statement> visitIf(If node) {
     var condition = node.condition;
     if (condition is InterpolatedExpression) {
@@ -389,6 +402,7 @@
     return (a) => If(makeCondition(a), makeThen(a), makeOtherwise(a));
   }
 
+  @override
   Instantiator<Statement> visitFor(For node) {
     Instantiator<Expression> makeInit = visitNullable(node.init);
     Instantiator<Expression> makeCondition = visitNullable(node.condition);
@@ -398,6 +412,7 @@
         makeUpdate(a)?.toVoidExpression(), makeBody(a));
   }
 
+  @override
   Instantiator<ForIn> visitForIn(ForIn node) {
     Instantiator<Expression> makeLeftHandSide = visit(node.leftHandSide);
     Instantiator<Expression> makeObject = visit(node.object);
@@ -405,6 +420,7 @@
     return (a) => ForIn(makeLeftHandSide(a), makeObject(a), makeBody(a));
   }
 
+  @override
   Instantiator<ForOf> visitForOf(ForOf node) {
     Instantiator<Expression> makeLeftHandSide = visit(node.leftHandSide);
     Instantiator<Expression> makeObject = visit(node.iterable);
@@ -412,39 +428,47 @@
     return (a) => ForOf(makeLeftHandSide(a), makeObject(a), makeBody(a));
   }
 
+  @override
   Instantiator<While> visitWhile(While node) {
     Instantiator<Expression> makeCondition = visit(node.condition);
     Instantiator<Statement> makeBody = visit(node.body);
     return (a) => While(makeCondition(a), makeBody(a));
   }
 
+  @override
   Instantiator<Do> visitDo(Do node) {
     Instantiator<Statement> makeBody = visit(node.body);
     Instantiator<Expression> makeCondition = visit(node.condition);
     return (a) => Do(makeBody(a), makeCondition(a));
   }
 
+  @override
   Instantiator<Continue> visitContinue(Continue node) =>
       (a) => Continue(node.targetLabel);
 
+  @override
   Instantiator<Break> visitBreak(Break node) => (a) => Break(node.targetLabel);
 
+  @override
   Instantiator<Statement> visitReturn(Return node) {
     if (node.value == null) return (args) => Return();
     Instantiator<Expression> makeExpression = visit(node.value);
     return (a) => makeExpression(a).toReturn();
   }
 
+  @override
   Instantiator<DartYield> visitDartYield(DartYield node) {
     Instantiator<Expression> makeExpression = visit(node.expression);
     return (a) => DartYield(makeExpression(a), node.hasStar);
   }
 
+  @override
   Instantiator<Throw> visitThrow(Throw node) {
     Instantiator<Expression> makeExpression = visit(node.expression);
     return (a) => Throw(makeExpression(a));
   }
 
+  @override
   Instantiator<Try> visitTry(Try node) {
     Instantiator<Block> makeBody = visit(node.body);
     Instantiator<Catch> makeCatch = visitNullable(node.catchPart);
@@ -452,18 +476,21 @@
     return (a) => Try(makeBody(a), makeCatch(a), makeFinally(a));
   }
 
+  @override
   Instantiator<Catch> visitCatch(Catch node) {
     Instantiator<Identifier> makeDeclaration = visit(node.declaration);
     Instantiator<Block> makeBody = visit(node.body);
     return (a) => Catch(makeDeclaration(a), makeBody(a));
   }
 
+  @override
   Instantiator<Switch> visitSwitch(Switch node) {
     Instantiator<Expression> makeKey = visit(node.key);
     var makeCases = node.cases.map(visitSwitchCase).toList();
     return (a) => Switch(makeKey(a), makeCases.map((m) => m(a)).toList());
   }
 
+  @override
   Instantiator<SwitchCase> visitSwitchCase(SwitchCase node) {
     Instantiator<Expression> makeExpression = visitNullable(node.expression);
     Instantiator<Block> makeBody = visit(node.body);
@@ -472,6 +499,7 @@
     };
   }
 
+  @override
   Instantiator<FunctionDeclaration> visitFunctionDeclaration(
       FunctionDeclaration node) {
     Instantiator<Identifier> makeName = visit(node.name);
@@ -479,15 +507,19 @@
     return (a) => FunctionDeclaration(makeName(a), makeFunction(a));
   }
 
+  @override
   Instantiator<LabeledStatement> visitLabeledStatement(LabeledStatement node) {
     Instantiator<Statement> makeBody = visit(node.body);
     return (a) => LabeledStatement(node.label, makeBody(a));
   }
 
+  @override
   Instantiator visitLiteralStatement(LiteralStatement node) => visitNode(node);
+  @override
   Instantiator visitLiteralExpression(LiteralExpression node) =>
       visitNode(node);
 
+  @override
   Instantiator<VariableDeclarationList> visitVariableDeclarationList(
       VariableDeclarationList node) {
     var declarationMakers =
@@ -496,6 +528,7 @@
         node.keyword, declarationMakers.map((m) => m(a)).toList());
   }
 
+  @override
   Instantiator<Expression> visitAssignment(Assignment node) {
     Instantiator makeLeftHandSide = visit(node.leftHandSide);
     String op = node.op;
@@ -506,6 +539,7 @@
     };
   }
 
+  @override
   Instantiator<VariableInitialization> visitVariableInitialization(
       VariableInitialization node) {
     Instantiator<VariableBinding> makeDeclaration = visit(node.declaration);
@@ -513,6 +547,7 @@
     return (a) => VariableInitialization(makeDeclaration(a), makeValue(a));
   }
 
+  @override
   Instantiator<Conditional> visitConditional(Conditional cond) {
     Instantiator<Expression> makeCondition = visit(cond.condition);
     Instantiator<Expression> makeThen = visit(cond.then);
@@ -520,8 +555,10 @@
     return (a) => Conditional(makeCondition(a), makeThen(a), makeOtherwise(a));
   }
 
+  @override
   Instantiator<Call> visitNew(New node) => handleCallOrNew(node, true);
 
+  @override
   Instantiator<Call> visitCall(Call node) => handleCallOrNew(node, false);
 
   Instantiator<Call> handleCallOrNew(Call node, bool isNew) {
@@ -537,6 +574,7 @@
     };
   }
 
+  @override
   Instantiator<Binary> visitBinary(Binary node) {
     Instantiator<Expression> makeLeft = visit(node.left);
     Instantiator<Expression> makeRight = visit(node.right);
@@ -544,51 +582,62 @@
     return (a) => Binary(op, makeLeft(a), makeRight(a));
   }
 
+  @override
   Instantiator<Prefix> visitPrefix(Prefix node) {
     Instantiator<Expression> makeOperand = visit(node.argument);
     String op = node.op;
     return (a) => Prefix(op, makeOperand(a));
   }
 
+  @override
   Instantiator<Postfix> visitPostfix(Postfix node) {
     Instantiator<Expression> makeOperand = visit(node.argument);
     String op = node.op;
     return (a) => Postfix(op, makeOperand(a));
   }
 
+  @override
   Instantiator<This> visitThis(This node) => (a) => This();
+  @override
   Instantiator<Super> visitSuper(Super node) => (a) => Super();
 
+  @override
   Instantiator<Identifier> visitIdentifier(Identifier node) =>
       (a) => Identifier(node.name);
 
+  @override
   Instantiator<Spread> visitSpread(Spread node) {
     var maker = visit(node.argument);
     return (a) => Spread(maker(a) as Expression);
   }
 
+  @override
   Instantiator<Yield> visitYield(Yield node) {
     var maker = visitNullable(node.value);
     return (a) => Yield(maker(a) as Expression, star: node.star);
   }
 
+  @override
   Instantiator<RestParameter> visitRestParameter(RestParameter node) {
     var maker = visit(node.parameter);
     return (a) => RestParameter(maker(a) as Identifier);
   }
 
+  @override
   Instantiator<PropertyAccess> visitAccess(PropertyAccess node) {
     Instantiator<Expression> makeReceiver = visit(node.receiver);
     Instantiator<Expression> makeSelector = visit(node.selector);
     return (a) => PropertyAccess(makeReceiver(a), makeSelector(a));
   }
 
+  @override
   Instantiator<NamedFunction> visitNamedFunction(NamedFunction node) {
     Instantiator<Identifier> makeDeclaration = visit(node.name);
     Instantiator<Fun> makeFunction = visit(node.function);
     return (a) => NamedFunction(makeDeclaration(a), makeFunction(a));
   }
 
+  @override
   Instantiator<Fun> visitFun(Fun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
     Instantiator<Block> makeBody = visit(node.body);
@@ -596,64 +645,78 @@
         isGenerator: node.isGenerator, asyncModifier: node.asyncModifier);
   }
 
+  @override
   Instantiator<ArrowFun> visitArrowFun(ArrowFun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
     Instantiator makeBody = visit(node.body);
     return (a) => ArrowFun(splayNodes(paramMakers, a), makeBody(a));
   }
 
+  @override
   Instantiator<LiteralBool> visitLiteralBool(LiteralBool node) =>
       (a) => LiteralBool(node.value);
 
+  @override
   Instantiator<LiteralString> visitLiteralString(LiteralString node) =>
       (a) => LiteralString(node.value);
 
+  @override
   Instantiator<LiteralNumber> visitLiteralNumber(LiteralNumber node) =>
       (a) => LiteralNumber(node.value);
 
+  @override
   Instantiator<LiteralNull> visitLiteralNull(LiteralNull node) =>
       (a) => LiteralNull();
 
+  @override
   Instantiator<ArrayInitializer> visitArrayInitializer(ArrayInitializer node) {
     var makers = node.elements.map(visitSplayableExpression).toList();
     return (a) => ArrayInitializer(splayNodes(makers, a));
   }
 
+  @override
   Instantiator visitArrayHole(ArrayHole node) {
     return (arguments) => ArrayHole();
   }
 
+  @override
   Instantiator<ObjectInitializer> visitObjectInitializer(
       ObjectInitializer node) {
     var propertyMakers = node.properties.map(visitSplayable).toList();
     return (a) => ObjectInitializer(splayNodes(propertyMakers, a));
   }
 
+  @override
   Instantiator<Property> visitProperty(Property node) {
     Instantiator<Expression> makeName = visit(node.name);
     Instantiator<Expression> makeValue = visit(node.value);
     return (a) => Property(makeName(a), makeValue(a));
   }
 
+  @override
   Instantiator<RegExpLiteral> visitRegExpLiteral(RegExpLiteral node) =>
       (a) => RegExpLiteral(node.pattern);
 
+  @override
   Instantiator<TemplateString> visitTemplateString(TemplateString node) {
     var makeElements = node.interpolations.map(visit).toList();
     return (a) => TemplateString(node.strings, splayNodes(makeElements, a));
   }
 
+  @override
   Instantiator<TaggedTemplate> visitTaggedTemplate(TaggedTemplate node) {
     Instantiator<Expression> makeTag = visit(node.tag);
     var makeTemplate = visitTemplateString(node.template);
     return (a) => TaggedTemplate(makeTag(a), makeTemplate(a));
   }
 
+  @override
   Instantiator visitClassDeclaration(ClassDeclaration node) {
     var makeClass = visitClassExpression(node.classExpr);
     return (a) => ClassDeclaration(makeClass(a));
   }
 
+  @override
   Instantiator<ClassExpression> visitClassExpression(ClassExpression node) {
     var makeMethods = node.methods.map(visitSplayableExpression).toList();
     Instantiator<Identifier> makeName = visit(node.name);
@@ -663,6 +726,7 @@
         makeName(a), makeHeritage(a), splayNodes(makeMethods, a));
   }
 
+  @override
   Instantiator<Method> visitMethod(Method node) {
     Instantiator<Expression> makeName = visit(node.name);
     Instantiator<Fun> makeFunction = visit(node.function);
@@ -672,31 +736,39 @@
         isStatic: node.isStatic);
   }
 
+  @override
   Instantiator<Comment> visitComment(Comment node) =>
       (a) => Comment(node.comment);
 
+  @override
   Instantiator<CommentExpression> visitCommentExpression(
       CommentExpression node) {
     Instantiator<Expression> makeExpr = visit(node.expression);
     return (a) => CommentExpression(node.comment, makeExpr(a));
   }
 
+  @override
   Instantiator<Await> visitAwait(Await node) {
     Instantiator<Expression> makeExpr = visit(node.expression);
     return (a) => Await(makeExpr(a));
   }
 
   // Note: these are not supported yet in the interpolation grammar.
+  @override
   Instantiator visitModule(Module node) => throw UnimplementedError();
+  @override
   Instantiator visitNameSpecifier(NameSpecifier node) =>
       throw UnimplementedError();
 
+  @override
   Instantiator visitImportDeclaration(ImportDeclaration node) =>
       throw UnimplementedError();
 
+  @override
   Instantiator visitExportDeclaration(ExportDeclaration node) =>
       throw UnimplementedError();
 
+  @override
   Instantiator visitExportClause(ExportClause node) =>
       throw UnimplementedError();
 
@@ -751,6 +823,7 @@
     node.accept(this);
   }
 
+  @override
   void visitNode(Node node) {
     int before = count;
     node.visitChildren(this);
@@ -758,6 +831,7 @@
     return null;
   }
 
+  @override
   visitInterpolatedNode(InterpolatedNode node) {
     containsInterpolatedNode.add(node);
     if (node.isNamed) holeNames.add(node.nameOrPosition as String);
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 55885a5..4fe583b 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -120,12 +120,19 @@
 
   bool isConstant(Expression e) => e.accept(this);
 
+  @override
   defaultExpression(node) => false;
+  @override
   defaultBasicLiteral(node) => true;
+  @override
   visitTypeLiteral(node) => true; // TODO(jmesserly): deferred libraries?
+  @override
   visitSymbolLiteral(node) => true;
+  @override
   visitListLiteral(node) => node.isConst;
+  @override
   visitMapLiteral(node) => node.isConst;
+  @override
   visitStaticInvocation(node) {
     return node.isConst ||
         node.target == coreTypes.identicalProcedure &&
@@ -135,27 +142,34 @@
             node.arguments.named.every((n) => isConstant(n.value));
   }
 
+  @override
   visitDirectMethodInvocation(node) {
     return node.receiver is BasicLiteral &&
         isOperatorMethodName(node.name.name) &&
         node.arguments.positional.every((p) => p is BasicLiteral);
   }
 
+  @override
   visitMethodInvocation(node) {
     return node.receiver is BasicLiteral &&
         isOperatorMethodName(node.name.name) &&
         node.arguments.positional.every((p) => p is BasicLiteral);
   }
 
+  @override
   visitConstructorInvocation(node) => node.isConst;
+  @override
   visitStringConcatenation(node) =>
       node.expressions.every((e) => e is BasicLiteral);
+  @override
   visitStaticGet(node) {
     var target = node.target;
     return target is Procedure || target is Field && target.isConst;
   }
 
+  @override
   visitVariableGet(node) => node.variable.isConst;
+  @override
   visitNot(node) {
     var operand = node.operand;
     return operand is BoolLiteral ||
@@ -164,13 +178,16 @@
         operand is MethodInvocation && visitMethodInvocation(operand);
   }
 
+  @override
   visitLogicalExpression(node) =>
       node.left is BoolLiteral && node.right is BoolLiteral;
+  @override
   visitConditionalExpression(node) =>
       node.condition is BoolLiteral &&
       node.then is BoolLiteral &&
       node.otherwise is BoolLiteral;
 
+  @override
   visitLet(Let node) {
     var init = node.variable.initializer;
     return (init == null || isConstant(init)) && isConstant(node.body);
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 38b8c39..5b65f02 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -20,12 +20,16 @@
 
   ClassHierarchy hierarchy;
 
+  @override
   bool get legacyMode => false;
 
+  @override
   bool get enableSuperMixins => true;
 
+  @override
   String get name => 'dartdevc';
 
+  @override
   List<String> get extraRequiredLibraries => const [
         'dart:_runtime',
         'dart:_debugger',
diff --git a/pkg/dev_compiler/lib/src/kernel/type_table.dart b/pkg/dev_compiler/lib/src/kernel/type_table.dart
index 313e8c9..7dd63c9 100644
--- a/pkg/dev_compiler/lib/src/kernel/type_table.dart
+++ b/pkg/dev_compiler/lib/src/kernel/type_table.dart
@@ -116,6 +116,7 @@
 
   _GeneratorTable(this._runtimeModule);
 
+  @override
   JS.Statement _dischargeType(DartType t) {
     var name = _names.remove(t);
     if (name != null) {
diff --git a/pkg/dev_compiler/test/sourcemap/common.dart b/pkg/dev_compiler/test/sourcemap/common.dart
index c4868c3..86f1e30 100644
--- a/pkg/dev_compiler/test/sourcemap/common.dart
+++ b/pkg/dev_compiler/test/sourcemap/common.dart
@@ -21,6 +21,7 @@
 abstract class ChainContextWithCleanupHelper extends ChainContext {
   Map<TestDescription, Data> cleanupHelper = {};
 
+  @override
   Future<void> cleanUp(TestDescription description, Result result) {
     if (debugging() && result.outcome != Expectation.Pass) {
       print("Not cleaning up: Running in debug-mode for non-passing test.");
@@ -38,8 +39,10 @@
 class Setup extends Step<TestDescription, Data, ChainContext> {
   const Setup();
 
+  @override
   String get name => "setup";
 
+  @override
   Future<Result<Data>> run(TestDescription input, ChainContext context) async {
     Data data = Data()..uri = input.uri;
     if (context is ChainContextWithCleanupHelper) {
@@ -52,8 +55,10 @@
 class SetCwdToSdkRoot extends Step<Data, Data, ChainContext> {
   const SetCwdToSdkRoot();
 
+  @override
   String get name => "setCWD";
 
+  @override
   Future<Result<Data>> run(Data input, ChainContext context) async {
     // stacktrace_helper assumes CWD is the sdk root dir.
     Directory.current = sdkRoot;
@@ -64,8 +69,10 @@
 class StepWithD8 extends Step<Data, Data, ChainContext> {
   const StepWithD8();
 
+  @override
   String get name => "step";
 
+  @override
   Future<Result<Data>> run(Data data, ChainContext context) async {
     var outWrapperPath = path.join(data.outDir.path, "wrapper.js");
     ProcessResult runResult =
@@ -80,8 +87,10 @@
 
   CheckSteps(this.debug);
 
+  @override
   String get name => "check";
 
+  @override
   Future<Result<Data>> run(Data data, ChainContext context) async {
     checkD8Steps(data.outDir.path, data.d8Output, data.code, debug: debug);
     return pass(data);
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 437b008..e2dbdbc 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -29,8 +29,10 @@
 
   const Compile(this.runner);
 
+  @override
   String get name => "compile";
 
+  @override
   Future<Result<Data>> run(Data data, ChainContext context) async {
     var dartScriptAbsolute = File.fromUri(data.uri).absolute;
     var inputFile = dartScriptAbsolute.path;
@@ -58,8 +60,10 @@
 
   const TestStackTrace(this.runner, this.marker, this.knownMarkers);
 
+  @override
   String get name => "TestStackTrace";
 
+  @override
   Future<Result<Data>> run(Data data, ChainContext context) async {
     data.outDir = await Directory.systemTemp.createTemp("stacktrace-test");
     String code = await File.fromUri(data.uri).readAsString();
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
index d8b3c1a..d14cc6d 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
@@ -21,6 +21,7 @@
 
   List<Step> _steps;
 
+  @override
   List<Step> get steps => _steps ??= <Step>[
         const Setup(),
         Compile(DevCompilerRunner(environment.containsKey("debug"))),
@@ -28,6 +29,7 @@
         CheckSteps(environment.containsKey("debug")),
       ];
 
+  @override
   bool debugging() => environment.containsKey("debug");
 }
 
@@ -36,6 +38,7 @@
 
   const DevCompilerRunner([this.debugging = false]);
 
+  @override
   Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index b275906..de9c620 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -21,12 +21,14 @@
 class SourceMapContext extends ChainContextWithCleanupHelper
     implements WithCompilerState {
   final Map<String, String> environment;
+  @override
   fe.InitializedCompilerState compilerState;
 
   SourceMapContext(this.environment);
 
   List<Step> _steps;
 
+  @override
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
@@ -36,6 +38,7 @@
     ];
   }
 
+  @override
   bool debugging() => environment.containsKey("debug");
 }
 
@@ -45,6 +48,7 @@
 
   const DevCompilerRunner(this.context, [this.debugging = false]);
 
+  @override
   Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
index c4b1fae..1143568 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
@@ -10,6 +10,7 @@
 }
 
 class StackTraceContext extends ChainContextWithCleanupHelper {
+  @override
   final List<Step> steps = <Step>[
     const Setup(),
     const SetCwdToSdkRoot(),
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index 65fb257..aeaca51 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -12,10 +12,12 @@
 
 class StackTraceContext extends ChainContextWithCleanupHelper
     implements WithCompilerState {
+  @override
   fe.InitializedCompilerState compilerState;
 
   List<Step> _steps;
 
+  @override
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
index b84e3fa..27d4995 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
@@ -14,6 +14,7 @@
 }
 
 class Class3 extends Class2 {
+  @override
   code() {
     /*bl*/ /*sl:1*/ super[42];
     /*sl:2*/ return super[42];
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
index 061bfde..e4211c0 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
@@ -26,6 +26,7 @@
     data3 = this;
   }
 
+  @override
   void doStuff() {
     /* bl */
     /*s:1*/ print(data2);
diff --git a/pkg/dev_compiler/test/testing.dart b/pkg/dev_compiler/test/testing.dart
index d350f57..449f460 100644
--- a/pkg/dev_compiler/test/testing.dart
+++ b/pkg/dev_compiler/test/testing.dart
@@ -20,6 +20,7 @@
 class _TestUtils {}
 
 class TestUriResolver extends ResourceUriResolver {
+  @override
   final MemoryResourceProvider provider;
   TestUriResolver(this.provider) : super(provider);
 
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 31b0ca0..c6aa9b3 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -416,6 +416,7 @@
   ///
   /// Throws [UnsupportedError] if the edits were overlapping. If no edits were
   /// made, the original string will be returned.
+  @override
   String toString() {
     var sb = StringBuffer();
     if (_edits.length == 0) return original;
@@ -462,8 +463,10 @@
 
   int get length => end - begin;
 
+  @override
   String toString() => '(Edit @ $begin,$end: "$replace")';
 
+  @override
   int compareTo(_StringEdit other) {
     int diff = begin - other.begin;
     if (diff != 0) return diff;
diff --git a/pkg/dev_compiler/web/stack_trace_mapper.dart b/pkg/dev_compiler/web/stack_trace_mapper.dart
index de9e2b6..9044aa6 100644
--- a/pkg/dev_compiler/web/stack_trace_mapper.dart
+++ b/pkg/dev_compiler/web/stack_trace_mapper.dart
@@ -66,6 +66,7 @@
 
   List toJson() => _bundle.toJson();
 
+  @override
   SourceMapSpan spanFor(int line, int column,
       {Map<String, SourceFile> files, String uri}) {
     if (uri == null) {
diff --git a/pkg/dev_compiler/web/web_command.dart b/pkg/dev_compiler/web/web_command.dart
index 2904b5a..ff27960 100644
--- a/pkg/dev_compiler/web/web_command.dart
+++ b/pkg/dev_compiler/web/web_command.dart
@@ -59,8 +59,10 @@
 
 /// The command for invoking the modular compiler.
 class WebCompileCommand extends Command {
+  @override
   get name => 'compile';
 
+  @override
   get description => 'Compile a set of Dart files into a JavaScript module.';
   final MessageHandler messageHandler;
 
@@ -306,5 +308,6 @@
 
 /// Thrown when the input source code has errors.
 class CompileErrorException implements Exception {
+  @override
   toString() => '\nPlease fix all errors before compiling (warnings are okay).';
 }