| Index: lib/src/js/nodes.dart | 
| diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart | 
| deleted file mode 100644 | 
| index cd0e807a9542a3cf4c5cb13da93722b2f49473a4..0000000000000000000000000000000000000000 | 
| --- a/lib/src/js/nodes.dart | 
| +++ /dev/null | 
| @@ -1,1838 +0,0 @@ | 
| -// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| -// for details. All rights reserved. Use of this source code is governed by a | 
| -// BSD-style license that can be found in the LICENSE file. | 
| - | 
| -part of js_ast; | 
| - | 
| -abstract class NodeVisitor<T> implements TypeRefVisitor<T> { | 
| -  T visitProgram(Program node); | 
| - | 
| -  T visitBlock(Block node); | 
| -  T visitExpressionStatement(ExpressionStatement node); | 
| -  T visitEmptyStatement(EmptyStatement node); | 
| -  T visitIf(If node); | 
| -  T visitFor(For node); | 
| -  T visitForIn(ForIn node); | 
| -  T visitForOf(ForOf node); | 
| -  T visitWhile(While node); | 
| -  T visitDo(Do node); | 
| -  T visitContinue(Continue node); | 
| -  T visitBreak(Break node); | 
| -  T visitReturn(Return node); | 
| -  T visitThrow(Throw node); | 
| -  T visitTry(Try node); | 
| -  T visitCatch(Catch node); | 
| -  T visitSwitch(Switch node); | 
| -  T visitCase(Case node); | 
| -  T visitDefault(Default node); | 
| -  T visitFunctionDeclaration(FunctionDeclaration node); | 
| -  T visitLabeledStatement(LabeledStatement node); | 
| -  T visitLiteralStatement(LiteralStatement node); | 
| -  T visitDartYield(DartYield node); | 
| - | 
| -  T visitLiteralExpression(LiteralExpression node); | 
| -  T visitVariableDeclarationList(VariableDeclarationList node); | 
| -  T visitAssignment(Assignment node); | 
| -  T visitVariableInitialization(VariableInitialization node); | 
| -  T visitConditional(Conditional cond); | 
| -  T visitNew(New node); | 
| -  T visitCall(Call node); | 
| -  T visitBinary(Binary node); | 
| -  T visitPrefix(Prefix node); | 
| -  T visitPostfix(Postfix node); | 
| -  T visitSpread(Spread node); | 
| -  T visitYield(Yield node); | 
| - | 
| -  T visitIdentifier(Identifier node); | 
| -  T visitThis(This node); | 
| -  T visitSuper(Super node); | 
| -  T visitAccess(PropertyAccess node); | 
| -  T visitRestParameter(RestParameter node); | 
| - | 
| -  T visitNamedFunction(NamedFunction node); | 
| -  T visitFun(Fun node); | 
| -  T visitArrowFun(ArrowFun node); | 
| - | 
| -  T visitLiteralBool(LiteralBool node); | 
| -  T visitLiteralString(LiteralString node); | 
| -  T visitLiteralNumber(LiteralNumber node); | 
| -  T visitLiteralNull(LiteralNull node); | 
| - | 
| -  T visitArrayInitializer(ArrayInitializer node); | 
| -  T visitArrayHole(ArrayHole node); | 
| -  T visitObjectInitializer(ObjectInitializer node); | 
| -  T visitProperty(Property node); | 
| -  T visitRegExpLiteral(RegExpLiteral node); | 
| -  T visitTemplateString(TemplateString node); | 
| -  T visitTaggedTemplate(TaggedTemplate node); | 
| - | 
| -  T visitAwait(Await node); | 
| - | 
| -  T visitClassDeclaration(ClassDeclaration node); | 
| -  T visitClassExpression(ClassExpression node); | 
| -  T visitMethod(Method node); | 
| - | 
| -  T visitImportDeclaration(ImportDeclaration node); | 
| -  T visitExportDeclaration(ExportDeclaration node); | 
| -  T visitExportClause(ExportClause node); | 
| -  T visitNameSpecifier(NameSpecifier node); | 
| -  T visitModule(Module node); | 
| - | 
| -  T visitComment(Comment node); | 
| -  T visitCommentExpression(CommentExpression node); | 
| - | 
| -  T visitInterpolatedExpression(InterpolatedExpression node); | 
| -  T visitInterpolatedLiteral(InterpolatedLiteral node); | 
| -  T visitInterpolatedParameter(InterpolatedParameter node); | 
| -  T visitInterpolatedSelector(InterpolatedSelector node); | 
| -  T visitInterpolatedStatement(InterpolatedStatement node); | 
| -  T visitInterpolatedMethod(InterpolatedMethod node); | 
| -  T visitInterpolatedIdentifier(InterpolatedIdentifier node); | 
| - | 
| -  T visitArrayBindingPattern(ArrayBindingPattern node); | 
| -  T visitObjectBindingPattern(ObjectBindingPattern node); | 
| -  T visitDestructuredVariable(DestructuredVariable node); | 
| -  T visitSimpleBindingPattern(SimpleBindingPattern node); | 
| -} | 
| - | 
| -abstract class TypeRefVisitor<T> { | 
| -  T visitQualifiedTypeRef(QualifiedTypeRef node); | 
| -  T visitGenericTypeRef(GenericTypeRef node); | 
| -  T visitUnionTypeRef(UnionTypeRef node); | 
| -  T visitRecordTypeRef(RecordTypeRef node); | 
| -  T visitOptionalTypeRef(OptionalTypeRef node); | 
| -  T visitFunctionTypeRef(FunctionTypeRef node); | 
| -  T visitAnyTypeRef(AnyTypeRef node); | 
| -  T visitUnknownTypeRef(UnknownTypeRef node); | 
| -  T visitArrayTypeRef(ArrayTypeRef node); | 
| -} | 
| - | 
| -class BaseVisitor<T> implements NodeVisitor<T> { | 
| -  T visitNode(Node node) { | 
| -    node.visitChildren(this); | 
| -    return null; | 
| -  } | 
| - | 
| -  T visitProgram(Program node) => visitNode(node); | 
| - | 
| -  T visitStatement(Statement node) => visitModuleItem(node); | 
| -  T visitLoop(Loop node) => visitStatement(node); | 
| -  T visitJump(Statement node) => visitStatement(node); | 
| - | 
| -  T visitBlock(Block node) => visitStatement(node); | 
| -  T visitExpressionStatement(ExpressionStatement node) | 
| -      => visitStatement(node); | 
| -  T visitEmptyStatement(EmptyStatement node) => visitStatement(node); | 
| -  T visitIf(If node) => visitStatement(node); | 
| -  T visitFor(For node) => visitLoop(node); | 
| -  T visitForIn(ForIn node) => visitLoop(node); | 
| -  T visitForOf(ForOf node) => visitLoop(node); | 
| -  T visitWhile(While node) => visitLoop(node); | 
| -  T visitDo(Do node) => visitLoop(node); | 
| -  T visitContinue(Continue node) => visitJump(node); | 
| -  T visitBreak(Break node) => visitJump(node); | 
| -  T visitReturn(Return node) => visitJump(node); | 
| -  T visitThrow(Throw node) => visitJump(node); | 
| -  T visitTry(Try node) => visitStatement(node); | 
| -  T visitSwitch(Switch node) => visitStatement(node); | 
| -  T visitFunctionDeclaration(FunctionDeclaration node) | 
| -      => visitStatement(node); | 
| -  T visitLabeledStatement(LabeledStatement node) => visitStatement(node); | 
| -  T visitLiteralStatement(LiteralStatement node) => visitStatement(node); | 
| - | 
| -  T visitCatch(Catch node) => visitNode(node); | 
| -  T visitCase(Case node) => visitNode(node); | 
| -  T visitDefault(Default node) => visitNode(node); | 
| - | 
| -  T visitExpression(Expression node) => visitNode(node); | 
| - | 
| -  T visitLiteralExpression(LiteralExpression node) => visitExpression(node); | 
| -  T visitVariableDeclarationList(VariableDeclarationList node) | 
| -      => visitExpression(node); | 
| -  T visitAssignment(Assignment node) => visitExpression(node); | 
| -  T visitVariableInitialization(VariableInitialization node) { | 
| -    if (node.value != null) { | 
| -      return visitAssignment(node); | 
| -    } else { | 
| -      return visitExpression(node); | 
| -    } | 
| -  } | 
| -  T visitConditional(Conditional node) => visitExpression(node); | 
| -  T visitNew(New node) => visitExpression(node); | 
| -  T visitCall(Call node) => visitExpression(node); | 
| -  T visitBinary(Binary node) => visitExpression(node); | 
| -  T visitPrefix(Prefix node) => visitExpression(node); | 
| -  T visitPostfix(Postfix node) => visitExpression(node); | 
| -  T visitSpread(Spread node) => visitPrefix(node); | 
| -  T visitYield(Yield node) => visitExpression(node); | 
| -  T visitAccess(PropertyAccess node) => visitExpression(node); | 
| - | 
| -  T visitIdentifier(Identifier node) => visitExpression(node); | 
| -  T visitThis(This node) => visitExpression(node); | 
| -  T visitSuper(Super node) => visitExpression(node); | 
| - | 
| -  T visitRestParameter(RestParameter node) => visitNode(node); | 
| - | 
| -  T visitNamedFunction(NamedFunction node) => visitExpression(node); | 
| -  T visitFunctionExpression(FunctionExpression node) => visitExpression(node); | 
| -  T visitFun(Fun node) => visitFunctionExpression(node); | 
| -  T visitArrowFun(ArrowFun node) => visitFunctionExpression(node); | 
| - | 
| -  T visitLiteral(Literal node) => visitExpression(node); | 
| - | 
| -  T visitLiteralBool(LiteralBool node) => visitLiteral(node); | 
| -  T visitLiteralString(LiteralString node) => visitLiteral(node); | 
| -  T visitLiteralNumber(LiteralNumber node) => visitLiteral(node); | 
| -  T visitLiteralNull(LiteralNull node) => visitLiteral(node); | 
| - | 
| -  T visitArrayInitializer(ArrayInitializer node) => visitExpression(node); | 
| -  T visitArrayHole(ArrayHole node) => visitExpression(node); | 
| -  T visitObjectInitializer(ObjectInitializer node) => visitExpression(node); | 
| -  T visitProperty(Property node) => visitNode(node); | 
| -  T visitRegExpLiteral(RegExpLiteral node) => visitExpression(node); | 
| -  T visitTemplateString(TemplateString node) => visitExpression(node); | 
| -  T visitTaggedTemplate(TaggedTemplate node) => visitExpression(node); | 
| - | 
| -  T visitClassDeclaration(ClassDeclaration node) => visitStatement(node); | 
| -  T visitClassExpression(ClassExpression node) => visitExpression(node); | 
| -  T visitMethod(Method node) => visitProperty(node); | 
| - | 
| -  T visitModuleItem(ModuleItem node) => visitNode(node); | 
| -  T visitImportDeclaration(ImportDeclaration node) => visitModuleItem(node); | 
| -  T visitExportDeclaration(ExportDeclaration node) => visitModuleItem(node); | 
| -  T visitExportClause(ExportClause node) => visitNode(node); | 
| -  T visitNameSpecifier(NameSpecifier node) => visitNode(node); | 
| -  T visitModule(Module node) => visitNode(node); | 
| - | 
| -  T visitInterpolatedNode(InterpolatedNode node) => visitNode(node); | 
| - | 
| -  T visitInterpolatedExpression(InterpolatedExpression node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedLiteral(InterpolatedLiteral node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedParameter(InterpolatedParameter node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedSelector(InterpolatedSelector node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedStatement(InterpolatedStatement node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedMethod(InterpolatedMethod node) | 
| -      => visitInterpolatedNode(node); | 
| -  T visitInterpolatedIdentifier(InterpolatedIdentifier node) | 
| -      => visitInterpolatedNode(node); | 
| - | 
| -  // Ignore comments by default. | 
| -  T visitComment(Comment node) => null; | 
| -  T visitCommentExpression(CommentExpression node) => null; | 
| - | 
| -  T visitAwait(Await node) => visitExpression(node); | 
| -  T visitDartYield(DartYield node) => visitStatement(node); | 
| - | 
| -  T visitBindingPattern(BindingPattern node) => visitNode(node); | 
| -  T visitArrayBindingPattern(ArrayBindingPattern node) | 
| -      => visitBindingPattern(node); | 
| -  T visitObjectBindingPattern(ObjectBindingPattern node) | 
| -      => visitBindingPattern(node); | 
| -  T visitDestructuredVariable(DestructuredVariable node) => visitNode(node); | 
| -  T visitSimpleBindingPattern(SimpleBindingPattern node) => visitNode(node); | 
| - | 
| -  T visitTypeRef(TypeRef node) => visitNode(node); | 
| -  T visitQualifiedTypeRef(QualifiedTypeRef node) => visitTypeRef(node); | 
| -  T visitGenericTypeRef(GenericTypeRef node) => visitTypeRef(node); | 
| -  T visitOptionalTypeRef(OptionalTypeRef node) => visitTypeRef(node); | 
| -  T visitRecordTypeRef(RecordTypeRef node) => visitTypeRef(node); | 
| -  T visitUnionTypeRef(UnionTypeRef node) => visitTypeRef(node); | 
| -  T visitFunctionTypeRef(FunctionTypeRef node) => visitTypeRef(node); | 
| -  T visitAnyTypeRef(AnyTypeRef node) => visitTypeRef(node); | 
| -  T visitUnknownTypeRef(UnknownTypeRef node) => visitTypeRef(node); | 
| -  T visitArrayTypeRef(ArrayTypeRef node) => visitTypeRef(node); | 
| -} | 
| - | 
| -abstract class Node { | 
| -  /// Sets the source location of this node. For performance reasons, we allow | 
| -  /// setting this after construction. | 
| -  Object sourceInformation; | 
| - | 
| -  ClosureAnnotation _closureAnnotation; | 
| -  /// Closure annotation of this node. | 
| -  ClosureAnnotation get closureAnnotation => _closureAnnotation; | 
| - | 
| -  accept(NodeVisitor visitor); | 
| -  void visitChildren(NodeVisitor visitor); | 
| - | 
| -  // Shallow clone of node.  Does not clone positions since the only use of this | 
| -  // private method is create a copy with a new position. | 
| -  Node _clone(); | 
| - | 
| -  withClosureAnnotation(ClosureAnnotation closureAnnotation) { | 
| -    if (this.closureAnnotation == closureAnnotation) return this; | 
| - | 
| -    return _clone() | 
| -        ..sourceInformation = sourceInformation | 
| -        .._closureAnnotation = closureAnnotation; | 
| -  } | 
| -  // Returns a node equivalent to [this], but with new source position and end | 
| -  // source position. | 
| -  Node withSourceInformation(sourceInformation) { | 
| -    if (sourceInformation == this.sourceInformation) { | 
| -      return this; | 
| -    } | 
| -    Node clone = _clone(); | 
| -    // TODO(sra): Should existing data be 'sticky' if we try to overwrite with | 
| -    // `null`? | 
| -    clone.sourceInformation = sourceInformation; | 
| -    return clone; | 
| -  } | 
| - | 
| -  bool get isCommaOperator => false; | 
| - | 
| -  Statement toStatement() { | 
| -    throw new UnsupportedError('toStatement'); | 
| -  } | 
| -  Statement toReturn() { | 
| -    throw new UnsupportedError('toReturn'); | 
| -  } | 
| - | 
| -  // For debugging | 
| -  String toString() { | 
| -    var context = new SimpleJavaScriptPrintingContext(); | 
| -    var opts = new JavaScriptPrintingOptions(allowKeywordsInProperties: true); | 
| -    context.buffer.write('js_ast `'); | 
| -    accept(new Printer(opts, context)); | 
| -    context.buffer.write('`'); | 
| -    return context.getText(); | 
| -  } | 
| -} | 
| - | 
| -class Program extends Node { | 
| -  /// Script tag hash-bang, e.g. `#!/usr/bin/env node` | 
| -  final String scriptTag; | 
| - | 
| -  /// Top-level statements in the program. | 
| -  final List<ModuleItem> body; | 
| - | 
| -  Program(this.body, {this.scriptTag}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitProgram(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (ModuleItem statement in body) statement.accept(visitor); | 
| -  } | 
| -  Program _clone() => new Program(body); | 
| -} | 
| - | 
| -abstract class Statement extends ModuleItem { | 
| -  Statement toStatement() => this; | 
| -  Statement toReturn() => new Block([this, new Return()]); | 
| -} | 
| - | 
| -class Block extends Statement { | 
| -  final List<Statement> statements; | 
| - | 
| -  /// True to preserve this [Block] for scoping reasons. | 
| -  final bool isScope; | 
| - | 
| -  Block(this.statements, {this.isScope: false}) { | 
| -    assert(!statements.any((s) => s is! Statement)); | 
| -  } | 
| -  Block.empty() : statements = <Statement>[], isScope = false; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitBlock(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (Statement statement in statements) statement.accept(visitor); | 
| -  } | 
| -  Block _clone() => new Block(statements); | 
| -} | 
| - | 
| -class ExpressionStatement extends Statement { | 
| -  final Expression expression; | 
| -  ExpressionStatement(this.expression); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this); | 
| -  void visitChildren(NodeVisitor visitor) { expression.accept(visitor); } | 
| -  ExpressionStatement _clone() => new ExpressionStatement(expression); | 
| -} | 
| - | 
| -class EmptyStatement extends Statement { | 
| -  EmptyStatement(); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitEmptyStatement(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  EmptyStatement _clone() => new EmptyStatement(); | 
| -} | 
| - | 
| -class If extends Statement { | 
| -  final Expression condition; | 
| -  final Node then; | 
| -  final Node otherwise; | 
| - | 
| -  If(this.condition, this.then, this.otherwise); | 
| -  If.noElse(this.condition, this.then) : this.otherwise = null; | 
| - | 
| -  bool get hasElse => otherwise != null; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitIf(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    condition.accept(visitor); | 
| -    then.accept(visitor); | 
| -    if (otherwise != null) otherwise.accept(visitor); | 
| -  } | 
| - | 
| -  If _clone() => new If(condition, then, otherwise); | 
| -} | 
| - | 
| -abstract class Loop extends Statement { | 
| -  final Statement body; | 
| -  Loop(this.body); | 
| -} | 
| - | 
| -class For extends Loop { | 
| -  final Expression init; | 
| -  final Expression condition; | 
| -  final Expression update; | 
| - | 
| -  For(this.init, this.condition, this.update, Statement body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitFor(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    if (init != null) init.accept(visitor); | 
| -    if (condition != null) condition.accept(visitor); | 
| -    if (update != null) update.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  For _clone() => new For(init, condition, update, body); | 
| -} | 
| - | 
| -class ForIn extends Loop { | 
| -  // Note that [VariableDeclarationList] is a subclass of [Expression]. | 
| -  // Therefore we can type the leftHandSide as [Expression]. | 
| -  final Expression leftHandSide; | 
| -  final Expression object; | 
| - | 
| -  ForIn(this.leftHandSide, this.object, Statement body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitForIn(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    leftHandSide.accept(visitor); | 
| -    object.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  ForIn _clone() => new ForIn(leftHandSide, object, body); | 
| -} | 
| - | 
| -class ForOf extends Loop { | 
| -  // Note that [VariableDeclarationList] is a subclass of [Expression]. | 
| -  // Therefore we can type the leftHandSide as [Expression]. | 
| -  final Expression leftHandSide; | 
| -  final Expression iterable; | 
| - | 
| -  ForOf(this.leftHandSide, this.iterable, Statement body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitForOf(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    leftHandSide.accept(visitor); | 
| -    iterable.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  ForIn _clone() => new ForIn(leftHandSide, iterable, body); | 
| -} | 
| - | 
| -class While extends Loop { | 
| -  final Node condition; | 
| - | 
| -  While(this.condition, Statement body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitWhile(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    condition.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  While _clone() => new While(condition, body); | 
| -} | 
| - | 
| -class Do extends Loop { | 
| -  final Expression condition; | 
| - | 
| -  Do(Statement body, this.condition) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitDo(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    body.accept(visitor); | 
| -    condition.accept(visitor); | 
| -  } | 
| - | 
| -  Do _clone() => new Do(body, condition); | 
| -} | 
| - | 
| -class Continue extends Statement { | 
| -  final String targetLabel;  // Can be null. | 
| - | 
| -  Continue(this.targetLabel); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitContinue(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| - | 
| -  Continue _clone() => new Continue(targetLabel); | 
| -} | 
| - | 
| -class Break extends Statement { | 
| -  final String targetLabel;  // Can be null. | 
| - | 
| -  Break(this.targetLabel); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitBreak(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| - | 
| -  Break _clone() => new Break(targetLabel); | 
| -} | 
| - | 
| -class Return extends Statement { | 
| -  final Expression value;  // Can be null. | 
| - | 
| -  Return([this.value = null]); | 
| - | 
| -  Statement toReturn() => this; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitReturn(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    if (value != null) value.accept(visitor); | 
| -  } | 
| - | 
| -  Return _clone() => new Return(value); | 
| - | 
| -  static bool foundIn(Node node) { | 
| -    _returnFinder.found = false; | 
| -    node.accept(_returnFinder); | 
| -    return _returnFinder.found; | 
| -  } | 
| -} | 
| - | 
| -final _returnFinder = new _ReturnFinder(); | 
| -class _ReturnFinder extends BaseVisitor { | 
| -  bool found = false; | 
| -  visitReturn(Return node) { | 
| -    found = true; | 
| -  } | 
| -  visitNode(Node node) { | 
| -    if (!found) super.visitNode(node); | 
| -  } | 
| -} | 
| - | 
| - | 
| -class Throw extends Statement { | 
| -  final Expression expression; | 
| - | 
| -  Throw(this.expression); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitThrow(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    expression.accept(visitor); | 
| -  } | 
| - | 
| -  Throw _clone() => new Throw(expression); | 
| -} | 
| - | 
| -class Try extends Statement { | 
| -  final Block body; | 
| -  final Catch catchPart;  // Can be null if [finallyPart] is non-null. | 
| -  final Block finallyPart;  // Can be null if [catchPart] is non-null. | 
| - | 
| -  Try(this.body, this.catchPart, this.finallyPart) { | 
| -    assert(catchPart != null || finallyPart != null); | 
| -  } | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitTry(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    body.accept(visitor); | 
| -    if (catchPart != null) catchPart.accept(visitor); | 
| -    if (finallyPart != null) finallyPart.accept(visitor); | 
| -  } | 
| - | 
| -  Try _clone() => new Try(body, catchPart, finallyPart); | 
| -} | 
| - | 
| -class Catch extends Node { | 
| -  final Identifier declaration; | 
| -  final Block body; | 
| - | 
| -  Catch(this.declaration, this.body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitCatch(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    declaration.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  Catch _clone() => new Catch(declaration, body); | 
| -} | 
| - | 
| -class Switch extends Statement { | 
| -  final Expression key; | 
| -  final List<SwitchClause> cases; | 
| - | 
| -  Switch(this.key, this.cases); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitSwitch(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    key.accept(visitor); | 
| -    for (SwitchClause clause in cases) clause.accept(visitor); | 
| -  } | 
| - | 
| -  Switch _clone() => new Switch(key, cases); | 
| -} | 
| - | 
| -abstract class SwitchClause extends Node { | 
| -  final Block body; | 
| - | 
| -  SwitchClause(this.body); | 
| -} | 
| - | 
| -class Case extends SwitchClause { | 
| -  final Expression expression; | 
| - | 
| -  Case(this.expression, Block body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitCase(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    expression.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  Case _clone() => new Case(expression, body); | 
| -} | 
| - | 
| -class Default extends SwitchClause { | 
| -  Default(Block body) : super(body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitDefault(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  Default _clone() => new Default(body); | 
| -} | 
| - | 
| -class FunctionDeclaration extends Statement { | 
| -  final Identifier name; | 
| -  final Fun function; | 
| - | 
| -  FunctionDeclaration(this.name, this.function); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitFunctionDeclaration(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name.accept(visitor); | 
| -    function.accept(visitor); | 
| -  } | 
| - | 
| -  FunctionDeclaration _clone() => new FunctionDeclaration(name, function); | 
| -} | 
| - | 
| -class LabeledStatement extends Statement { | 
| -  final String label; | 
| -  final Statement body; | 
| - | 
| -  LabeledStatement(this.label, this.body); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLabeledStatement(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  LabeledStatement _clone() => new LabeledStatement(label, body); | 
| -} | 
| - | 
| -class LiteralStatement extends Statement { | 
| -  final String code; | 
| - | 
| -  LiteralStatement(this.code); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this); | 
| -  void visitChildren(NodeVisitor visitor) { } | 
| - | 
| -  LiteralStatement _clone() => new LiteralStatement(code); | 
| -} | 
| - | 
| -// Not a real JavaScript node, but represents the yield statement from a dart | 
| -// program translated to JavaScript. | 
| -class DartYield extends Statement { | 
| -  final Expression expression; | 
| - | 
| -  final bool hasStar; | 
| - | 
| -  DartYield(this.expression, this.hasStar); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitDartYield(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    expression.accept(visitor); | 
| -  } | 
| - | 
| -  DartYield _clone() => new DartYield(expression, hasStar); | 
| -} | 
| - | 
| -abstract class Expression extends Node { | 
| -  Expression(); | 
| - | 
| -  factory Expression.binary(List<Expression> exprs, String op) { | 
| -    Expression comma = null; | 
| -    for (var node in exprs) { | 
| -      comma = (comma == null) ? node : new Binary(op, comma, node); | 
| -    } | 
| -    return comma; | 
| -  } | 
| - | 
| -  int get precedenceLevel; | 
| - | 
| -  Statement toStatement() => new ExpressionStatement(toVoidExpression()); | 
| -  Statement toReturn() => new Return(this); | 
| -  Statement toYieldStatement({bool star: false}) => | 
| -      new ExpressionStatement(new Yield(this, star: star)); | 
| - | 
| -  Expression toVoidExpression() => this; | 
| -  Expression toAssignExpression(Expression left) => new Assignment(left, this); | 
| -  Statement toVariableDeclaration(Identifier name) => | 
| -      new VariableDeclarationList('let', | 
| -          [new VariableInitialization(name, this)]).toStatement(); | 
| -} | 
| - | 
| -class LiteralExpression extends Expression { | 
| -  final String template; | 
| -  final List<Expression> inputs; | 
| - | 
| -  LiteralExpression(this.template) : inputs = const []; | 
| -  LiteralExpression.withData(this.template, this.inputs); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralExpression(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    if (inputs != null) { | 
| -      for (Expression expr in inputs) expr.accept(visitor); | 
| -    } | 
| -  } | 
| - | 
| -  LiteralExpression _clone() => | 
| -      new LiteralExpression.withData(template, inputs); | 
| - | 
| -  // Code that uses JS must take care of operator precedences, and | 
| -  // put parenthesis if needed. | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -/** | 
| - * [VariableDeclarationList] is a subclass of [Expression] to simplify the | 
| - * AST. | 
| - */ | 
| -class VariableDeclarationList extends Expression { | 
| -  /** The `var` or `let` keyword used for this variable declaration list. */ | 
| -  final String keyword; | 
| -  final List<VariableInitialization> declarations; | 
| - | 
| -  VariableDeclarationList(this.keyword, this.declarations); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitVariableDeclarationList(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (VariableInitialization declaration in declarations) { | 
| -      declaration.accept(visitor); | 
| -    } | 
| -  } | 
| - | 
| -  VariableDeclarationList _clone() => | 
| -      new VariableDeclarationList(keyword, declarations); | 
| - | 
| -  int get precedenceLevel => EXPRESSION; | 
| -} | 
| - | 
| -class Assignment extends Expression { | 
| -  final Expression leftHandSide; | 
| -  final String op;         // Null, if the assignment is not compound. | 
| -  final Expression value;  // May be null, for [VariableInitialization]s. | 
| - | 
| -  Assignment(leftHandSide, value) | 
| -      : this.compound(leftHandSide, null, value); | 
| -  Assignment.compound(this.leftHandSide, this.op, this.value); | 
| - | 
| -  int get precedenceLevel => ASSIGNMENT; | 
| - | 
| -  bool get isCompound => op != null; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitAssignment(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    leftHandSide.accept(visitor); | 
| -    if (value != null) value.accept(visitor); | 
| -  } | 
| - | 
| -  Assignment _clone() => | 
| -      new Assignment.compound(leftHandSide, op, value); | 
| -} | 
| - | 
| -class VariableInitialization extends Assignment { | 
| -  /** [value] may be null. */ | 
| -  VariableInitialization(VariableBinding declaration, Expression value) | 
| -      : super(declaration, value); | 
| - | 
| -  VariableBinding get declaration => leftHandSide; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this); | 
| - | 
| -  VariableInitialization _clone() => | 
| -      new VariableInitialization(declaration, value); | 
| -} | 
| - | 
| -abstract class VariableBinding extends Expression { | 
| -} | 
| - | 
| -class DestructuredVariable extends Expression implements Parameter { | 
| -  /// [LiteralString] or [Identifier]. | 
| -  final Expression name; | 
| -  final BindingPattern structure; | 
| -  final Expression defaultValue; | 
| -  final TypeRef type; | 
| -  DestructuredVariable({this.name, this.structure, this.defaultValue, this.type}) { | 
| -    assert(name != null || structure != null); | 
| -  } | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitDestructuredVariable(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name?.accept(visitor); | 
| -    structure?.accept(visitor); | 
| -    defaultValue?.accept(visitor); | 
| -  } | 
| - | 
| -  /// Avoid parenthesis when pretty-printing. | 
| -  @override int get precedenceLevel => PRIMARY; | 
| -  @override Node _clone() => | 
| -      new DestructuredVariable( | 
| -          name: name, structure: structure, defaultValue: defaultValue); | 
| -} | 
| - | 
| -abstract class BindingPattern extends Expression implements VariableBinding { | 
| -  final List<DestructuredVariable> variables; | 
| -  BindingPattern(this.variables); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (DestructuredVariable v in variables) v.accept(visitor); | 
| -  } | 
| -} | 
| - | 
| -class SimpleBindingPattern extends BindingPattern { | 
| -  final Identifier name; | 
| -  SimpleBindingPattern(Identifier name) | 
| -      : super([new DestructuredVariable(name: name)]), this.name = name; | 
| -  accept(NodeVisitor visitor) => visitor.visitSimpleBindingPattern(this); | 
| - | 
| -  /// Avoid parenthesis when pretty-printing. | 
| -  @override int get precedenceLevel => PRIMARY; | 
| -  @override Node _clone() => new SimpleBindingPattern(name); | 
| -} | 
| - | 
| -class ObjectBindingPattern extends BindingPattern { | 
| -  ObjectBindingPattern(List<DestructuredVariable> variables) | 
| -      : super(variables); | 
| -  accept(NodeVisitor visitor) => visitor.visitObjectBindingPattern(this); | 
| - | 
| -  /// Avoid parenthesis when pretty-printing. | 
| -  @override int get precedenceLevel => PRIMARY; | 
| -  @override Node _clone() => new ObjectBindingPattern(variables); | 
| -} | 
| - | 
| -class ArrayBindingPattern extends BindingPattern { | 
| -  ArrayBindingPattern(List<DestructuredVariable> variables) | 
| -      : super(variables); | 
| -  accept(NodeVisitor visitor) => visitor.visitArrayBindingPattern(this); | 
| - | 
| -  /// Avoid parenthesis when pretty-printing. | 
| -  @override int get precedenceLevel => PRIMARY; | 
| -  @override Node _clone() => new ObjectBindingPattern(variables); | 
| -} | 
| - | 
| -class Conditional extends Expression { | 
| -  final Expression condition; | 
| -  final Expression then; | 
| -  final Expression otherwise; | 
| - | 
| -  Conditional(this.condition, this.then, this.otherwise); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitConditional(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    condition.accept(visitor); | 
| -    then.accept(visitor); | 
| -    otherwise.accept(visitor); | 
| -  } | 
| - | 
| -  Conditional _clone() => new Conditional(condition, then, otherwise); | 
| - | 
| -  int get precedenceLevel => ASSIGNMENT; | 
| -} | 
| - | 
| -class Call extends Expression { | 
| -  Expression target; | 
| -  List<Expression> arguments; | 
| - | 
| -  Call(this.target, this.arguments); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitCall(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    target.accept(visitor); | 
| -    for (Expression arg in arguments) arg.accept(visitor); | 
| -  } | 
| - | 
| -  Call _clone() => new Call(target, arguments); | 
| - | 
| -  int get precedenceLevel => CALL; | 
| -} | 
| - | 
| -class New extends Call { | 
| -  New(Expression cls, List<Expression> arguments) : super(cls, arguments); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitNew(this); | 
| - | 
| -  New _clone() => new New(target, arguments); | 
| - | 
| -  int get precedenceLevel => ACCESS; | 
| -} | 
| - | 
| -class Binary extends Expression { | 
| -  final String op; | 
| -  final Expression left; | 
| -  final Expression right; | 
| - | 
| -  Binary(this.op, this.left, this.right); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitBinary(this); | 
| - | 
| -  Binary _clone() => new Binary(op, left, right); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    left.accept(visitor); | 
| -    right.accept(visitor); | 
| -  } | 
| - | 
| -  bool get isCommaOperator => op == ','; | 
| - | 
| -  Expression toVoidExpression() { | 
| -    if (!isCommaOperator) return super.toVoidExpression(); | 
| -    var l = left.toVoidExpression(); | 
| -    var r = right.toVoidExpression(); | 
| -    if (l == left && r == right) return this; | 
| -    return new Binary(',', l, r); | 
| -  } | 
| - | 
| -  Statement toStatement() { | 
| -    if (!isCommaOperator) return super.toStatement(); | 
| -    return new Block([left.toStatement(), right.toStatement()]); | 
| -  } | 
| - | 
| -  Statement toReturn() { | 
| -    if (!isCommaOperator) return super.toReturn(); | 
| -    return new Block([left.toStatement(), right.toReturn()]); | 
| -  } | 
| - | 
| -  Statement toYieldStatement({bool star: false}) { | 
| -    if (!isCommaOperator) return super.toYieldStatement(star: star); | 
| -    return new Block([left.toStatement(), right.toYieldStatement(star: star)]); | 
| -  } | 
| - | 
| -  List<Expression> commaToExpressionList() { | 
| -    if (!isCommaOperator) throw new StateError('not a comma expression'); | 
| -    var exprs = []; | 
| -    _flattenComma(exprs, left); | 
| -    _flattenComma(exprs, right); | 
| -    return exprs; | 
| -  } | 
| - | 
| -  static void _flattenComma(List<Expression> exprs, Expression node) { | 
| -    if (node is Binary && node.isCommaOperator) { | 
| -      _flattenComma(exprs, node.left); | 
| -      _flattenComma(exprs, node.right); | 
| -    } else { | 
| -      exprs.add(node); | 
| -    } | 
| -  } | 
| - | 
| -  int get precedenceLevel { | 
| -    // TODO(floitsch): switch to constant map. | 
| -    switch (op) { | 
| -      case "*": | 
| -      case "/": | 
| -      case "%": | 
| -        return MULTIPLICATIVE; | 
| -      case "+": | 
| -      case "-": | 
| -        return ADDITIVE; | 
| -      case "<<": | 
| -      case ">>": | 
| -      case ">>>": | 
| -        return SHIFT; | 
| -      case "<": | 
| -      case ">": | 
| -      case "<=": | 
| -      case ">=": | 
| -      case "instanceof": | 
| -      case "in": | 
| -        return RELATIONAL; | 
| -      case "==": | 
| -      case "===": | 
| -      case "!=": | 
| -      case "!==": | 
| -        return EQUALITY; | 
| -      case "&": | 
| -        return BIT_AND; | 
| -      case "^": | 
| -        return BIT_XOR; | 
| -      case "|": | 
| -        return BIT_OR; | 
| -      case "&&": | 
| -        return LOGICAL_AND; | 
| -      case "||": | 
| -        return LOGICAL_OR; | 
| -      case ',': | 
| -        return EXPRESSION; | 
| -      default: | 
| -        throw "Internal Error: Unhandled binary operator: $op"; | 
| -    } | 
| -  } | 
| -} | 
| - | 
| -class Prefix extends Expression { | 
| -  final String op; | 
| -  final Expression argument; | 
| - | 
| -  Prefix(this.op, this.argument); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitPrefix(this); | 
| - | 
| -  Prefix _clone() => new Prefix(op, argument); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    argument.accept(visitor); | 
| -  } | 
| - | 
| -  int get precedenceLevel => UNARY; | 
| -} | 
| - | 
| -// SpreadElement isn't really a prefix expression, as it can only appear in | 
| -// certain places such as ArgumentList and BindingPattern, but we pretend | 
| -// it is for simplicity's sake. | 
| -class Spread extends Prefix { | 
| -  Spread(Expression operand) : super('...', operand); | 
| -  int get precedenceLevel => SPREAD; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitSpread(this); | 
| -  Spread _clone() => new Spread(argument); | 
| -} | 
| - | 
| -class Postfix extends Expression { | 
| -  final String op; | 
| -  final Expression argument; | 
| - | 
| -  Postfix(this.op, this.argument); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitPostfix(this); | 
| - | 
| -  Postfix _clone() => new Postfix(op, argument); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    argument.accept(visitor); | 
| -  } | 
| - | 
| -  int get precedenceLevel => UNARY; | 
| -} | 
| - | 
| -abstract class Parameter implements Expression, VariableBinding { | 
| -  TypeRef get type; | 
| -} | 
| - | 
| -class Identifier extends Expression implements Parameter, VariableBinding { | 
| -  final String name; | 
| -  final bool allowRename; | 
| -  final TypeRef type; | 
| - | 
| -  Identifier(this.name, {this.allowRename: true, this.type}) { | 
| -    if (!_identifierRE.hasMatch(name)) { | 
| -      throw new ArgumentError.value(name, "name", "not a valid identifier"); | 
| -    } | 
| -  } | 
| -  static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$'); | 
| - | 
| -  Identifier _clone() => | 
| -      new Identifier(name, allowRename: allowRename); | 
| -  accept(NodeVisitor visitor) => visitor.visitIdentifier(this); | 
| -  int get precedenceLevel => PRIMARY; | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -} | 
| - | 
| -// This is an expression for convenience in the AST. | 
| -class RestParameter extends Expression implements Parameter { | 
| -  final Identifier parameter; | 
| -  TypeRef get type => null; | 
| - | 
| -  RestParameter(this.parameter); | 
| - | 
| -  RestParameter _clone() => new RestParameter(parameter); | 
| -  accept(NodeVisitor visitor) => visitor.visitRestParameter(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    parameter.accept(visitor); | 
| -  } | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class This extends Expression { | 
| -  accept(NodeVisitor visitor) => visitor.visitThis(this); | 
| -  This _clone() => new This(); | 
| -  int get precedenceLevel => PRIMARY; | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| - | 
| -  static bool foundIn(Node node) { | 
| -    _thisFinder.found = false; | 
| -    node.accept(_thisFinder); | 
| -    return _thisFinder.found; | 
| -  } | 
| -} | 
| - | 
| -final _thisFinder = new _ThisFinder(); | 
| -class _ThisFinder extends BaseVisitor { | 
| -  bool found = false; | 
| -  visitThis(This node) { | 
| -    found = true; | 
| -  } | 
| -  visitNode(Node node) { | 
| -    if (!found) super.visitNode(node); | 
| -  } | 
| -} | 
| - | 
| - | 
| -// `super` is more restricted in the ES6 spec, but for simplicity we accept | 
| -// it anywhere that `this` is accepted. | 
| -class Super extends Expression { | 
| -  accept(NodeVisitor visitor) => visitor.visitSuper(this); | 
| -  Super _clone() => new Super(); | 
| -  int get precedenceLevel => PRIMARY; | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -} | 
| - | 
| -class NamedFunction extends Expression { | 
| -  final Identifier name; | 
| -  final Fun function; | 
| - | 
| -  NamedFunction(this.name, this.function); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitNamedFunction(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name.accept(visitor); | 
| -    function.accept(visitor); | 
| -  } | 
| -  NamedFunction _clone() => new NamedFunction(name, function); | 
| - | 
| -  int get precedenceLevel => PRIMARY_LOW_PRECEDENCE; | 
| -} | 
| - | 
| -abstract class FunctionExpression extends Expression { | 
| -  List<Parameter> get params; | 
| - | 
| -  get body; // Expression or block | 
| -  /// Type parameters passed to this generic function, if any. `null` otherwise. | 
| -  // TODO(ochafik): Support type bounds. | 
| -  List<Identifier> get typeParams; | 
| -  /// Return type of this function, if any. `null` otherwise. | 
| -  TypeRef get returnType; | 
| -} | 
| - | 
| -class Fun extends FunctionExpression { | 
| -  final List<Parameter> params; | 
| -  final Block body; | 
| -  @override final List<Identifier> typeParams; | 
| -  @override final TypeRef returnType; | 
| -  /** Whether this is a JS generator (`function*`) that may contain `yield`. */ | 
| -  final bool isGenerator; | 
| - | 
| -  final AsyncModifier asyncModifier; | 
| - | 
| -  Fun(this.params, this.body, {this.isGenerator: false, | 
| -      this.asyncModifier: const AsyncModifier.sync(), | 
| -      this.typeParams, this.returnType}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitFun(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (Parameter param in params) param.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  Fun _clone() => new Fun(params, body, | 
| -      isGenerator: isGenerator, asyncModifier: asyncModifier); | 
| - | 
| -  int get precedenceLevel => PRIMARY_LOW_PRECEDENCE; | 
| -} | 
| - | 
| -class ArrowFun extends FunctionExpression { | 
| -  final List<Parameter> params; | 
| -  final body; // Expression or Block | 
| -  @override final List<Identifier> typeParams; | 
| -  @override final TypeRef returnType; | 
| - | 
| -  ArrowFun(this.params, this.body, {this.typeParams, this.returnType}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitArrowFun(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (Parameter param in params) param.accept(visitor); | 
| -    body.accept(visitor); | 
| -  } | 
| - | 
| -  int get precedenceLevel => PRIMARY_LOW_PRECEDENCE; | 
| - | 
| -  ArrowFun _clone() => new ArrowFun(params, body); | 
| -} | 
| - | 
| -/** | 
| - * The Dart sync, sync*, async, and async* modifier. | 
| - * See [DartYield]. | 
| - * | 
| - * This is not used for JS functions. | 
| - */ | 
| -class AsyncModifier { | 
| -  final bool isAsync; | 
| -  final bool isYielding; | 
| -  final String description; | 
| - | 
| -  const AsyncModifier.sync() | 
| -      : isAsync = false, | 
| -        isYielding = false, | 
| -        description = "sync"; | 
| -  const AsyncModifier.async() | 
| -      : isAsync = true, | 
| -        isYielding = false, | 
| -        description = "async"; | 
| -  const AsyncModifier.asyncStar() | 
| -      : isAsync = true, | 
| -        isYielding = true, | 
| -        description = "async*"; | 
| -  const AsyncModifier.syncStar() | 
| -      : isAsync = false, | 
| -        isYielding = true, | 
| -        description = "sync*"; | 
| -  toString() => description; | 
| -} | 
| - | 
| -class PropertyAccess extends Expression { | 
| -  final Expression receiver; | 
| -  final Expression selector; | 
| - | 
| -  PropertyAccess(this.receiver, this.selector); | 
| -  PropertyAccess.field(this.receiver, String fieldName) | 
| -      : selector = new LiteralString('"$fieldName"'); | 
| -  PropertyAccess.indexed(this.receiver, int index) | 
| -      : selector = new LiteralNumber('$index'); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitAccess(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    receiver.accept(visitor); | 
| -    selector.accept(visitor); | 
| -  } | 
| - | 
| -  PropertyAccess _clone() => new PropertyAccess(receiver, selector); | 
| - | 
| -  int get precedenceLevel => ACCESS; | 
| -} | 
| - | 
| -abstract class Literal extends Expression { | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class LiteralBool extends Literal { | 
| -  final bool value; | 
| - | 
| -  LiteralBool(this.value); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralBool(this); | 
| -  // [visitChildren] inherited from [Literal]. | 
| -  LiteralBool _clone() => new LiteralBool(value); | 
| -} | 
| - | 
| -class LiteralNull extends Literal { | 
| -  LiteralNull(); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralNull(this); | 
| -  LiteralNull _clone() => new LiteralNull(); | 
| -} | 
| - | 
| -class LiteralString extends Literal { | 
| -  final String value; | 
| - | 
| -  /** | 
| -   * Constructs a LiteralString from a string value. | 
| -   * | 
| -   * The constructor does not add the required quotes.  If [value] is not | 
| -   * surrounded by quotes and property escaped, the resulting object is invalid | 
| -   * as a JS value. | 
| -   * | 
| -   * TODO(sra): Introduce variants for known valid strings that don't allocate a | 
| -   * new string just to add quotes. | 
| -   */ | 
| -  LiteralString(this.value); | 
| - | 
| -  /// Gets the value inside the string without the beginning and end quotes. | 
| -  String get valueWithoutQuotes => value.substring(1, value.length - 1); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralString(this); | 
| -  LiteralString _clone() => new LiteralString(value); | 
| -} | 
| - | 
| -class LiteralNumber extends Literal { | 
| -  final String value;  // Must be a valid JavaScript number literal. | 
| - | 
| -  LiteralNumber(this.value); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitLiteralNumber(this); | 
| -  LiteralNumber _clone() => new 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()`. | 
| -   */ | 
| -  int get precedenceLevel => value.contains('.') ? PRIMARY : UNARY; | 
| -} | 
| - | 
| -class ArrayInitializer extends Expression { | 
| -  final List<Expression> elements; | 
| -  final bool multiline; | 
| - | 
| -  ArrayInitializer(this.elements, {this.multiline: false}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitArrayInitializer(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (Expression element in elements) element.accept(visitor); | 
| -  } | 
| - | 
| -  ArrayInitializer _clone() => new ArrayInitializer(elements); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -/** | 
| - * An empty place in an [ArrayInitializer]. | 
| - * For example the list [1, , , 2] would contain two holes. | 
| - */ | 
| -class ArrayHole extends Expression { | 
| -  accept(NodeVisitor visitor) => visitor.visitArrayHole(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| - | 
| -  ArrayHole _clone() => new ArrayHole(); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class ObjectInitializer extends Expression { | 
| -  final List<Property> properties; | 
| -  final bool _multiline; | 
| - | 
| -  /** | 
| -   * Constructs a new object-initializer containing the given [properties]. | 
| -   */ | 
| -  ObjectInitializer(this.properties, {multiline: false}) | 
| -      : _multiline = multiline; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitObjectInitializer(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (Property init in properties) init.accept(visitor); | 
| -  } | 
| - | 
| -  ObjectInitializer _clone() => new ObjectInitializer(properties); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -  /** | 
| -   * If set to true, forces a vertical layout when using the [Printer]. | 
| -   * Otherwise, layout will be vertical if and only if any [properties] | 
| -   * are [FunctionExpression]s. | 
| -   */ | 
| -  bool get multiline { | 
| -    return _multiline || properties.any((p) => p.value is FunctionExpression); | 
| -  } | 
| -} | 
| - | 
| -class Property extends Node { | 
| -  final Expression name; | 
| -  final Expression value; | 
| - | 
| -  Property(this.name, this.value); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitProperty(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name.accept(visitor); | 
| -    value.accept(visitor); | 
| -  } | 
| - | 
| -  Property _clone() => new Property(name, value); | 
| -} | 
| - | 
| -// TODO(jmesserly): parser does not support this yet. | 
| -class TemplateString extends Expression { | 
| -  /** | 
| -   * The parts of this template string: a sequence of [String]s and | 
| -   * [Expression]s. Strings and expressions will alternate, for example: | 
| -   * | 
| -   *     `foo${1 + 2} bar ${'hi'}` | 
| -   * | 
| -   * would be represented by: | 
| -   * | 
| -   *     ['foo', new JS.Binary('+', js.number(1), js.number(2)), | 
| -   *      ' bar ', new JS.LiteralString("'hi'")] | 
| -   */ | 
| -  final List elements; | 
| -  TemplateString(this.elements); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitTemplateString(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (var element in elements) { | 
| -      if (element is Expression) element.accept(visitor); | 
| -    } | 
| -  } | 
| - | 
| -  TemplateString _clone() => new TemplateString(elements); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -// TODO(jmesserly): parser does not support this yet. | 
| -class TaggedTemplate extends Expression { | 
| -  final Expression tag; | 
| -  final TemplateString template; | 
| - | 
| -  TaggedTemplate(this.tag, this.template); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitTaggedTemplate(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    tag.accept(visitor); | 
| -    template.accept(visitor); | 
| -  } | 
| - | 
| -  TaggedTemplate _clone() => new TaggedTemplate(tag, template); | 
| - | 
| -  int get precedenceLevel => CALL; | 
| -} | 
| - | 
| -// TODO(jmesserly): parser does not support this yet. | 
| -class Yield extends Expression { | 
| -  final Expression value; // Can be null. | 
| - | 
| -  /** | 
| -   * Whether this yield expression is a `yield*` that iterates each item in | 
| -   * [value]. | 
| -   */ | 
| -  final bool star; | 
| - | 
| -  Yield(this.value, {this.star: false}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitYield(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    if (value != null) value.accept(visitor); | 
| -  } | 
| - | 
| -  Yield _clone() => new Yield(value); | 
| - | 
| -  int get precedenceLevel => YIELD; | 
| -} | 
| - | 
| -class ClassDeclaration extends Statement { | 
| -  final ClassExpression classExpr; | 
| - | 
| -  ClassDeclaration(this.classExpr); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitClassDeclaration(this); | 
| -  visitChildren(NodeVisitor visitor) => classExpr.accept(visitor); | 
| -  ClassDeclaration _clone() => new ClassDeclaration(classExpr); | 
| -} | 
| - | 
| -class ClassExpression extends Expression { | 
| -  final Identifier name; | 
| -  final Expression heritage; // Can be null. | 
| -  final List<Method> methods; | 
| -  /// Type parameters of this class, if any. `null` otherwise. | 
| -  // TODO(ochafik): Support type bounds. | 
| -  final List<Identifier> typeParams; | 
| -  /// Field declarations of this class (TypeScript / ES6_TYPED). | 
| -  final List<VariableDeclarationList> fields; | 
| - | 
| -  ClassExpression(this.name, this.heritage, this.methods, | 
| -      {this.typeParams, this.fields}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitClassExpression(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name.accept(visitor); | 
| -    if (heritage != null) heritage.accept(visitor); | 
| -    for (Method element in methods) element.accept(visitor); | 
| -    if (fields != null) { | 
| -      for (var field in fields) { | 
| -        field.accept(visitor); | 
| -      } | 
| -    } | 
| -    if (typeParams != null) { | 
| -      for (var typeParam in typeParams) { | 
| -        typeParam.accept(visitor); | 
| -      } | 
| -    } | 
| -  } | 
| - | 
| -  ClassExpression _clone() => new ClassExpression( | 
| -      name, heritage, methods, typeParams: typeParams, fields: fields); | 
| - | 
| -  int get precedenceLevel => PRIMARY_LOW_PRECEDENCE; | 
| -} | 
| - | 
| -class Method extends Property { | 
| -  final bool isGetter; | 
| -  final bool isSetter; | 
| -  final bool isStatic; | 
| - | 
| -  Method(Expression name, Fun function, | 
| -      {this.isGetter: false, this.isSetter: false, this.isStatic: false}) | 
| -      : super(name, function) { | 
| -    assert(!isGetter || function.params.length == 0); | 
| -    assert(!isSetter || function.params.length == 1); | 
| -    assert(!isGetter && !isSetter || !function.isGenerator); | 
| -  } | 
| - | 
| -  Fun get function => super.value; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitMethod(this); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    name.accept(visitor); | 
| -    function.accept(visitor); | 
| -  } | 
| - | 
| -  Method _clone() => new Method(name, function, | 
| -      isGetter: isGetter, isSetter: isSetter, isStatic: isStatic); | 
| -} | 
| - | 
| -/// Tag class for all interpolated positions. | 
| -abstract class InterpolatedNode implements Node { | 
| -  get nameOrPosition; | 
| - | 
| -  bool get isNamed => nameOrPosition is String; | 
| -  bool get isPositional => nameOrPosition is int; | 
| -} | 
| - | 
| -class InterpolatedExpression extends Expression with InterpolatedNode { | 
| -  final nameOrPosition; | 
| - | 
| -  InterpolatedExpression(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedExpression _clone() => | 
| -      new InterpolatedExpression(nameOrPosition); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class InterpolatedLiteral extends Literal with InterpolatedNode { | 
| -  final nameOrPosition; | 
| - | 
| -  InterpolatedLiteral(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition); | 
| -} | 
| - | 
| -class InterpolatedParameter extends Expression with InterpolatedNode | 
| -    implements Identifier { | 
| -  final nameOrPosition; | 
| -  TypeRef get type => null; | 
| - | 
| -  String get name { throw "InterpolatedParameter.name must not be invoked"; } | 
| -  bool get allowRename => false; | 
| - | 
| -  InterpolatedParameter(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class InterpolatedSelector extends Expression with InterpolatedNode { | 
| -  final nameOrPosition; | 
| - | 
| -  InterpolatedSelector(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedSelector(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedSelector _clone() => new InterpolatedSelector(nameOrPosition); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -class InterpolatedStatement extends Statement with InterpolatedNode { | 
| -  final nameOrPosition; | 
| - | 
| -  InterpolatedStatement(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition); | 
| -} | 
| - | 
| -// TODO(jmesserly): generalize this to InterpolatedProperty? | 
| -class InterpolatedMethod extends Expression with InterpolatedNode | 
| -    implements Method { | 
| -  final nameOrPosition; | 
| - | 
| -  InterpolatedMethod(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitInterpolatedMethod(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedMethod _clone() => new InterpolatedMethod(nameOrPosition); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -  Expression get name => _unsupported; | 
| -  Expression get value => _unsupported; | 
| -  bool get isGetter => _unsupported; | 
| -  bool get isSetter => _unsupported; | 
| -  bool get isStatic => _unsupported; | 
| -  Fun get function => _unsupported; | 
| -  get _unsupported => throw '$runtimeType does not support this member.'; | 
| -} | 
| - | 
| -class InterpolatedIdentifier extends Expression with InterpolatedNode | 
| -    implements Identifier { | 
| -  final nameOrPosition; | 
| -  TypeRef get type => null; | 
| - | 
| -  InterpolatedIdentifier(this.nameOrPosition); | 
| - | 
| -  accept(NodeVisitor visitor) => | 
| -      visitor.visitInterpolatedIdentifier(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  InterpolatedIdentifier _clone() => new InterpolatedIdentifier(nameOrPosition); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -  String get name => throw '$runtimeType does not support this member.'; | 
| -  bool get allowRename => false; | 
| -} | 
| - | 
| -/** | 
| - * [RegExpLiteral]s, despite being called "Literal", do not inherit from | 
| - * [Literal]. Indeed, regular expressions in JavaScript have a side-effect and | 
| - * are thus not in the same category as numbers or strings. | 
| - */ | 
| -class RegExpLiteral extends Expression { | 
| -  /** Contains the pattern and the flags.*/ | 
| -  final String pattern; | 
| - | 
| -  RegExpLiteral(this.pattern); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitRegExpLiteral(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  RegExpLiteral _clone() => new RegExpLiteral(pattern); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -} | 
| - | 
| -/** | 
| - * An asynchronous await. | 
| - * | 
| - * Not part of JavaScript. We desugar this expression before outputting. | 
| - * Should only occur in a [Fun] with `asyncModifier` async or asyncStar. | 
| - */ | 
| -class Await extends Expression { | 
| -  /** The awaited expression. */ | 
| -  final Expression expression; | 
| - | 
| -  Await(this.expression); | 
| - | 
| -  int get precedenceLevel => UNARY; | 
| -  accept(NodeVisitor visitor) => visitor.visitAwait(this); | 
| -  void visitChildren(NodeVisitor visitor) => expression.accept(visitor); | 
| -  Await _clone() => new Await(expression); | 
| -} | 
| - | 
| -/** | 
| - * A comment. | 
| - * | 
| - * Extends [Statement] so we can add comments before statements in | 
| - * [Block] and [Program]. | 
| - */ | 
| -class Comment extends Statement { | 
| -  final String comment; | 
| - | 
| -  Comment(this.comment); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitComment(this); | 
| -  Comment _clone() => new Comment(comment); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -} | 
| - | 
| -/** | 
| - * A comment for expressions. | 
| - * | 
| - * Extends [Expression] so we can add comments before expressions. | 
| - * Has the highest possible precedence, so we don't add parentheses around it. | 
| - */ | 
| -class CommentExpression extends Expression { | 
| -  final String comment; | 
| -  final Expression expression; | 
| - | 
| -  CommentExpression(this.comment, this.expression); | 
| - | 
| -  int get precedenceLevel => PRIMARY; | 
| -  accept(NodeVisitor visitor) => visitor.visitCommentExpression(this); | 
| -  CommentExpression _clone() => new CommentExpression(comment, expression); | 
| - | 
| -  void visitChildren(NodeVisitor visitor) => expression.accept(visitor); | 
| -} | 
| - | 
| -/** | 
| - * Represents allowed module items: | 
| - * [Statement], [ImportDeclaration], and [ExportDeclaration]. | 
| - */ | 
| -abstract class ModuleItem extends Node {} | 
| - | 
| -class ImportDeclaration extends ModuleItem { | 
| -  final Identifier defaultBinding; // Can be null. | 
| - | 
| -  // Can be null, a single specifier of `* as name`, or a list. | 
| -  final List<NameSpecifier> namedImports; | 
| - | 
| -  final LiteralString from; | 
| - | 
| -  ImportDeclaration({this.defaultBinding, this.namedImports, this.from}); | 
| - | 
| -  /** The `import "name.js"` form of import */ | 
| -  ImportDeclaration.all(LiteralString module) : this(from: module); | 
| - | 
| -  /** If this import has `* as name` returns the name, otherwise null. */ | 
| -  String get importStarAs { | 
| -    if (namedImports != null && namedImports.length == 1 && | 
| -        namedImports[0].name == '*') { | 
| -      return namedImports[0].asName; | 
| -    } | 
| -    return null; | 
| -  } | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitImportDeclaration(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    if (namedImports != null) { | 
| -      for (NameSpecifier name in namedImports) name.accept(visitor); | 
| -    } | 
| -    from.accept(visitor); | 
| -  } | 
| -  ImportDeclaration _clone() => new ImportDeclaration( | 
| -      defaultBinding: defaultBinding, namedImports: namedImports, from: from); | 
| -} | 
| - | 
| -class ExportDeclaration extends ModuleItem { | 
| -  /** | 
| -   * Exports a name from this module. | 
| -   * | 
| -   * This can be a [ClassDeclaration] or [FunctionDeclaration]. | 
| -   * If [isDefault] is true, it can also be an [Expression]. | 
| -   * Otherwise it can be a [VariableDeclarationList] or an [ExportClause]. | 
| -   */ | 
| -  final Node exported; | 
| - | 
| -  /** True if this is an `export default`. */ | 
| -  final bool isDefault; | 
| - | 
| -  ExportDeclaration(this.exported, {this.isDefault: false}) { | 
| -    assert(exported is ClassDeclaration || | 
| -        exported is FunctionDeclaration || | 
| -        isDefault | 
| -            ? exported is Expression | 
| -            : exported is VariableDeclarationList || | 
| -              exported is ExportClause); | 
| -  } | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitExportDeclaration(this); | 
| -  visitChildren(NodeVisitor visitor) => exported.accept(visitor); | 
| -  ExportDeclaration _clone() => | 
| -      new ExportDeclaration(exported, isDefault: isDefault); | 
| -} | 
| - | 
| -class ExportClause extends Node { | 
| -  final List<NameSpecifier> exports; | 
| -  final LiteralString from; // Can be null. | 
| - | 
| -  ExportClause(this.exports, {this.from}); | 
| - | 
| -  /** The `export * from 'name.js'` form. */ | 
| -  ExportClause.star(LiteralString from) | 
| -      : this([new NameSpecifier('*')], from: from); | 
| - | 
| -  /** True if this is an `export *`. */ | 
| -  bool get exportStar => exports.length == 1 && exports[0].name == '*'; | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitExportClause(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (NameSpecifier name in exports) name.accept(visitor); | 
| -    if (from != null) from.accept(visitor); | 
| -  } | 
| -  ExportClause _clone() => new ExportClause(exports, from: from); | 
| -} | 
| - | 
| -/** An import or export specifier. */ | 
| -class NameSpecifier extends Node { | 
| -  // TODO(jmesserly): should we wrap this in a node of some sort? | 
| -  final String name; | 
| -  final String asName; // Can be null. | 
| - | 
| -  NameSpecifier(this.name, {this.asName}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitNameSpecifier(this); | 
| -  void visitChildren(NodeVisitor visitor) {} | 
| -  NameSpecifier _clone() => new NameSpecifier(name, asName: asName); | 
| -} | 
| - | 
| -// TODO(jmesserly): should this be related to [Program]? | 
| -class Module extends Node { | 
| -  /// The module's name | 
| -  // TODO(jmesserly): this is not declared in ES6, but is known by the loader. | 
| -  // We use this because some ES5 desugarings require it. | 
| -  final String name; | 
| - | 
| -  final List<ModuleItem> body; | 
| -  Module(this.body, {this.name}); | 
| - | 
| -  accept(NodeVisitor visitor) => visitor.visitModule(this); | 
| -  void visitChildren(NodeVisitor visitor) { | 
| -    for (ModuleItem item in body) item.accept(visitor); | 
| -  } | 
| -  Module _clone() => new Module(body); | 
| -} | 
|  |