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

Unified Diff: sdk/lib/_internal/compiler/implementation/js/nodes.dart

Issue 246633006: Revert "JS templates" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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
Index: sdk/lib/_internal/compiler/implementation/js/nodes.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index 93d1f5ecb735a5b3e47353ce0c14eb03b132bb11..b48c4aeb4ebebc023b14aa3a59a0d2041ab7d0d8 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -64,10 +64,8 @@ abstract class NodeVisitor<T> {
T visitComment(Comment node);
T visitInterpolatedExpression(InterpolatedExpression node);
- T visitInterpolatedLiteral(InterpolatedLiteral node);
- T visitInterpolatedParameter(InterpolatedParameter node);
- T visitInterpolatedSelector(InterpolatedSelector node);
T visitInterpolatedStatement(InterpolatedStatement node);
+ T visitJSExpression(JSExpression node);
}
class BaseVisitor<T> implements NodeVisitor<T> {
@@ -152,18 +150,11 @@ class BaseVisitor<T> implements NodeVisitor<T> {
T visitProperty(Property node) => visitNode(node);
T visitRegExpLiteral(RegExpLiteral node) => visitExpression(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);
+ => visitExpression(node);
T visitInterpolatedStatement(InterpolatedStatement node)
- => visitInterpolatedNode(node);
+ => visitStatement(node);
+ T visitJSExpression(JSExpression node) => visitExpression(node);
// Ignore comments by default.
T visitComment(Comment node) => null;
@@ -463,7 +454,59 @@ class LiteralStatement extends Statement {
abstract class Expression extends Node {
int get precedenceLevel;
+ Call callWith(List<Expression> arguments) => new Call(this, arguments);
+
+ PropertyAccess operator [](expression) {
+ if (expression is Expression) {
+ return new PropertyAccess(this, expression);
+ } else if (expression is int) {
+ return new PropertyAccess.indexed(this, expression);
+ } else if (expression is String) {
+ return new PropertyAccess.field(this, expression);
+ } else {
+ throw new ArgumentError('Expected an int, String, or Expression');
+ }
+ }
+
Statement toStatement() => new ExpressionStatement(this);
+
+ Call call([expression]) {
+ List<Expression> arguments;
+ if (expression == null) {
+ arguments = <Expression>[];
+ } else if (expression is List) {
+ arguments = expression.map(js.toExpression).toList();
+ } else {
+ arguments = <Expression>[js.toExpression(expression)];
+ }
+ return callWith(arguments);
+ }
+
+ Expression operator +(expression) => binary('+', expression);
+
+ Expression operator -(expression) => binary('-', expression);
+
+ Expression operator &(expression) => binary('&', expression);
+
+ Expression operator <(expression) => binary('<', expression);
+
+ Expression operator >(expression) => binary('>', expression);
+
+ Expression operator >=(expression) => binary('>=', expression);
+
+ Expression binary(String operator, expression) {
+ return new Binary(operator, this, js.toExpression(expression));
+ }
+
+ Expression update(String operator, expression) {
+ return new Assignment.compound(this, operator, js.toExpression(expression));
+ }
+
+ Expression get plusPlus => new Postfix('++', this);
+
+ Prefix get typeof => new Prefix('typeof', this);
+
+ Prefix get not => new Prefix('!', this);
}
/// Wrap a CodeBuffer as an expression.
@@ -910,62 +953,65 @@ class Property extends Node {
}
/// Tag class for all interpolated positions.
-abstract class InterpolatedNode implements Node {
- get name; // 'int' for positional interpolated nodes, 'String' for named.
-}
+abstract class InterpolatedNode implements Node {}
class InterpolatedExpression extends Expression implements InterpolatedNode {
- final name;
+ Expression value;
- InterpolatedExpression(this.name);
+ InterpolatedExpression(this.value);
- accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
- void visitChildren(NodeVisitor visitor) {}
-
- int get precedenceLevel => PRIMARY;
-}
+ void assign(Expression newValue) {
+ value = newValue;
+ }
-class InterpolatedLiteral extends Literal implements InterpolatedNode {
- final name;
+ accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
- InterpolatedLiteral(this.name);
+ void visitChildren(NodeVisitor visitor) {
+ if (value != null) value.accept(visitor);
+ }
- accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this);
- void visitChildren(NodeVisitor visitor) {}
+ int get precedenceLevel => value.precedenceLevel;
}
-class InterpolatedParameter extends Expression
- implements Parameter, InterpolatedNode {
- final name;
-
- InterpolatedParameter(this.name);
+class InterpolatedStatement extends Statement implements InterpolatedNode {
+ Statement value;
- accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this);
- void visitChildren(NodeVisitor visitor) {}
+ InterpolatedStatement(this.value);
- int get precedenceLevel => PRIMARY;
-}
+ void assign(Node newValue) {
+ if (newValue is Expression)
+ value = new ExpressionStatement(newValue);
+ else
+ value = newValue;
+ }
-class InterpolatedSelector extends Expression implements InterpolatedNode {
- final name;
+ accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this);
- InterpolatedSelector(this.name);
+ void visitChildren(NodeVisitor visitor) {
+ if (value != null) value.accept(visitor);
+ }
+}
- accept(NodeVisitor visitor) => visitor.visitInterpolatedSelector(this);
- void visitChildren(NodeVisitor visitor) {}
+class JSExpression extends Expression {
+ Expression value;
+ List<InterpolatedNode> interpolatedNodes;
- int get precedenceLevel => PRIMARY;
-}
+ JSExpression(this.value, this.interpolatedNodes);
-class InterpolatedStatement extends Statement implements InterpolatedNode {
- final name;
+ accept(NodeVisitor visitor) => visitor.visitJSExpression(this);
- InterpolatedStatement(this.name);
+ void visitChildren(NodeVisitor visitor) {
+ value.accept(visitor);
+ for (InterpolatedNode node in interpolatedNodes) {
+ node.accept(visitor);
+ }
+ }
- accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this);
- void visitChildren(NodeVisitor visitor) {}
+ int get precedenceLevel => value.precedenceLevel;
}
+// TODO(sra): JSStatement like JSExpression.
+
/**
* [RegExpLiteral]s, despite being called "Literal", do not inherit from
* [Literal]. Indeed, regular expressions in JavaScript have a side-effect and
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/js/js.dart ('k') | sdk/lib/_internal/compiler/implementation/js/printer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698