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: lib/src/js/template.dart

Issue 949383003: use js_ast instead of strings to generate JS (Closed) Base URL: git@github.com:dart-lang/dart-dev-compiler.git@master
Patch Set: Created 5 years, 10 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: lib/src/js/template.dart
diff --git a/lib/src/js/template.dart b/lib/src/js/template.dart
index 7740431fc05ed717483c4adbbc7e189beac6657e..a4a5d11481e7d732e09cb9a96dbf6a477055f6cb 100644
--- a/lib/src/js/template.dart
+++ b/lib/src/js/template.dart
@@ -260,6 +260,43 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
};
}
+ Instantiator visitInterpolatedMethod(InterpolatedMethod node) {
+ var nameOrPosition = node.nameOrPosition;
+ return (arguments) {
+ var value = arguments[nameOrPosition];
+ Method toMethod(item) {
+ if (item is Method) return item;
+ return error('Interpolated value #$nameOrPosition is not a Method '
+ 'or List of Methods: $value');
+ }
+ if (value is Iterable) return value.map(toMethod);
+ return toMethod(value);
+ };
+ }
+
+ Instantiator visitInterpolatedPropertyName(InterpolatedPropertyName node) {
+ var nameOrPosition = node.nameOrPosition;
+ return (arguments) {
+ var item = arguments[nameOrPosition];
+ if (item is PropertyName) return item;
+ if (item is String) return new PropertyName(item);
+ return error('Interpolated value #$nameOrPosition is not a '
+ 'PropertyName or String: $item');
+ };
+ }
+
+ Instantiator visitInterpolatedVariableDeclaration(
+ InterpolatedVariableDeclaration node) {
+ var nameOrPosition = node.nameOrPosition;
+ return (arguments) {
+ var item = arguments[nameOrPosition];
+ if (item is VariableDeclaration) return item;
+ if (item is String) return new VariableDeclaration(item);
+ return error('Interpolated value #$nameOrPosition is not a '
+ 'VariableDeclaration or String: $item');
+ };
+ }
+
Instantiator visitSplayableStatement(Node node) {
if (node is InterpolatedStatement) {
var nameOrPosition = node.nameOrPosition;
@@ -404,6 +441,18 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
};
}
+ Instantiator visitForOf(ForOf node) {
+ Instantiator makeLeftHandSide = visit(node.leftHandSide);
+ Instantiator makeObject = visit(node.iterable);
+ Instantiator makeBody = visit(node.body);
+ return (arguments) {
+ return new ForOf(
+ makeLeftHandSide(arguments),
+ makeObject(arguments),
+ makeBody(arguments));
+ };
+ }
+
TODO(String name) {
throw new UnimplementedError('$this.$name');
}
@@ -511,7 +560,7 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
var result = instantiator(arguments);
declarations.add(result);
}
- return new VariableDeclarationList(declarations);
+ return new VariableDeclarationList(node.keyword, declarations);
};
}
@@ -598,6 +647,7 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
(arguments) => new VariableUse(node.name);
Instantiator visitThis(This node) => (arguments) => new This();
+ Instantiator visitSuper(Super node) => (arguments) => new Super();
Instantiator visitVariableDeclaration(VariableDeclaration node) =>
(arguments) => new VariableDeclaration(node.name);
@@ -619,7 +669,7 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
new NamedFunction(makeDeclaration(arguments), makeFunction(arguments));
}
- Instantiator visitFun(Fun node) {
+ Instantiator visitFunctionExpression(FunctionExpression node) {
List<Instantiator> paramMakers = node.params.map(visitSplayable).toList();
Instantiator makeBody = visit(node.body);
// TODO(sra): Avoid copying params if no interpolation or forced copying.
@@ -633,11 +683,21 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
params.add(result);
}
}
- Statement body = makeBody(arguments);
- return new Fun(params, body);
+ var body = makeBody(arguments);
+ if (node is ArrowFun) {
+ return new ArrowFun(params, body);
+ } else if (node is Fun) {
+ return new Fun(params, body);
+ } else {
+ throw "Unknown FunctionExpression type ${node.runtimeType}: $node";
+ }
};
}
+ Instantiator visitFun(Fun node) => visitFunctionExpression(node);
+
+ Instantiator visitArrowFun(ArrowFun node) => visitFunctionExpression(node);
+
Instantiator visitLiteralBool(LiteralBool node) =>
(arguments) => new LiteralBool(node.value);
@@ -670,7 +730,6 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
Instantiator visitObjectInitializer(ObjectInitializer node) {
List<Instantiator> propertyMakers =
node.properties.map(visitSplayable).toList();
- bool isOneLiner = node.isOneLiner;
return (arguments) {
List<Property> properties = <Property>[];
for (Instantiator instantiator in propertyMakers) {
@@ -681,7 +740,7 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
properties.add(result);
}
}
- return new ObjectInitializer(properties, isOneLiner: isOneLiner);
+ return new ObjectInitializer(properties);
};
}
@@ -693,10 +752,80 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
};
}
+ Instantiator visitPropertyName(PropertyName node) =>
+ (arguments) => new PropertyName(node.name);
+
Instantiator visitRegExpLiteral(RegExpLiteral node) =>
(arguments) => new RegExpLiteral(node.pattern);
- Instantiator visitComment(Comment node) => TODO('visitComment');
+ Instantiator visitTemplateString(TemplateString node) {
+ Iterable makeElements =
+ node.elements.map((e) => e is String ? e : visit(e));
+ return (arguments) {
+ return new TemplateString(makeElements
+ .map((m) => m is String ? m : m(arguments))
+ .toList(growable: false));
+ };
+ }
+
+ Instantiator visitTaggedTemplate(TaggedTemplate node) {
+ Instantiator makeTag = visit(node.tag);
+ Instantiator makeTemplate = visit(node.template);
+ return (arguments) {
+ return new TaggedTemplate(makeTag(arguments), makeTemplate(arguments));
+ };
+ }
+
+ Instantiator visitClassDeclaration(ClassDeclaration node) {
+ Instantiator makeClass = visit(node.classExpr);
+ return (arguments) {
+ return new ClassDeclaration(makeClass(arguments));
+ };
+ }
+
+ Instantiator visitClassExpression(ClassExpression node) {
+ List<Instantiator> makeMethods = node.methods.map(visitSplayableExpression)
+ .toList(growable: true);
+ Instantiator makeName = visit(node.name);
+ Instantiator makeHeritage = visit(node.heritage);
+
+ return (arguments) {
+ var methods = <Method>[];
+ for (Instantiator instantiator in makeMethods) {
+ var result = instantiator(arguments);
+ if (result is Iterable) {
+ methods.addAll(result);
+ } else {
+ methods.add(result);
+ }
+ }
+ return new ClassExpression(
+ makeName(arguments), makeHeritage(arguments), methods);
+ };
+ }
+
+ Instantiator visitMethod(Method node) {
+ Instantiator makeName = visit(node.name);
+ Instantiator makeFunction = visit(node.function);
+ return (arguments) {
+ return new Method(
+ makeName(arguments),
+ makeFunction(arguments),
+ isGetter: node.isGetter,
+ isSetter: node.isSetter,
+ isStatic: node.isStatic);
+ };
+ }
+
+ Instantiator visitComment(Comment node) =>
+ (arguments) => new Comment(node.comment);
+
+ Instantiator visitCommentExpression(CommentExpression node) {
+ Instantiator makeExpr = visit(node.expression);
+ return (arguments) {
+ return new CommentExpression(node.comment, makeExpr(arguments));
+ };
+ }
Instantiator visitAwait(Await node) {
Instantiator makeExpression = visit(node.expression);

Powered by Google App Engine
This is Rietveld 408576698