Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(857)

Unified Diff: lib/src/js/nodes.dart

Issue 1879373004: Implement modular compilation (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/js/module_transform.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
-}
« no previous file with comments | « lib/src/js/module_transform.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698