Index: lib/src/js/template.dart |
diff --git a/lib/src/js/template.dart b/lib/src/js/template.dart |
index eb55252a95903d41d2029c076ae9324af6c96e29..9eec2c59b858645013490531bbae1df5b1872abc 100644 |
--- a/lib/src/js/template.dart |
+++ b/lib/src/js/template.dart |
@@ -206,8 +206,9 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { |
Expression toExpression(item) { |
if (item is Expression) return item; |
if (item is String) return new Identifier(item); |
+ if (item is Parameter) return item.binding; |
return error('Interpolated value #$nameOrPosition is not ' |
- 'an Expression or List of Expressions: $value'); |
+ 'an Expression or List of Expressions: $value: ${value is Iterable ? value.map((v) => v.runtimeType) : value.runtimeType}'); |
} |
if (value is Iterable) return value.map(toExpression); |
return toExpression(value); |
@@ -227,17 +228,18 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { |
Instantiator visitInterpolatedParameter(InterpolatedParameter node) { |
var nameOrPosition = node.nameOrPosition; |
+ var isRest = node.isRest; |
return (arguments) { |
var value = arguments[nameOrPosition]; |
- Parameter toIdentifier(item) { |
- if (item is Parameter) return item; |
- if (item is String) return new Identifier(item); |
- return error('Interpolated value #$nameOrPosition is not an Identifier' |
- ' or List of Identifiers: $value'); |
+ Parameter toParameter(item, {bool isRest: false}) { |
+ if (item is Identifier) return new Parameter(item, isRest: isRest); |
+ if (item is String) return new Parameter(new Identifier(item), isRest: isRest); |
+ return error('Interpolated value #$nameOrPosition is not an Parameter' |
+ ' or List of Parameters: $value: ${value.runtimeType}'); |
} |
- if (value is Iterable) return value.map(toIdentifier); |
- return toIdentifier(value); |
+ if (value is Iterable) return value.map(toParameter); |
+ return toParameter(value, isRest: isRest); |
}; |
} |
@@ -627,6 +629,21 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { |
Instantiator visitThis(This node) => (arguments) => new This(); |
Instantiator visitSuper(Super node) => (arguments) => new Super(); |
+ Instantiator visitParameter(Parameter node) { |
+ Instantiator makeBinding = visit(node.binding); |
+ Instantiator makeType = visit(node.type); |
+ var isRest = node.isRest; |
+ return (arguments) => new Parameter( |
+ makeBinding(arguments), type: makeType(arguments), isRest: isRest); |
+ } |
+ |
+ Instantiator visitTypeParameter(TypeParameter node) { |
+ Instantiator makeName = visit(node.name); |
+ Instantiator makeBound = visit(node.bound); |
+ return (arguments) => |
+ new TypeParameter(makeName(arguments), bound: makeBound(arguments)); |
+ } |
+ |
Instantiator visitIdentifier(Identifier node) => |
(arguments) => new Identifier(node.name); |
@@ -637,9 +654,6 @@ class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { |
(args) => new Yield(node.value != null ? visit(node.value)(args) : null, |
star: node.star); |
- Instantiator visitRestParameter(RestParameter node) => |
- (args) => new RestParameter(visit(node.parameter)(args)); |
- |
Instantiator visitAccess(PropertyAccess node) { |
Instantiator makeReceiver = visit(node.receiver); |
Instantiator makeSelector = visit(node.selector); |