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).';
}