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); |