Index: lib/src/codegen/js_codegen.dart |
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
index ddae19b24c3543d687b667429682bfb141f4fe3f..bb73a3cb104db8624875837fc86061c2952b312c 100644 |
--- a/lib/src/codegen/js_codegen.dart |
+++ b/lib/src/codegen/js_codegen.dart |
@@ -509,6 +509,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
result.add(js.statement('#.values = dart.const(dart.list(#, #));', |
[id, values, _emitTypeName(type)])); |
+ if (isPublic(type.name)) _addExport(type.name); |
return _statement(result); |
} |
@@ -751,7 +752,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
for (ConstructorDeclaration node in ctors) { |
var memberName = _constructorName(node.element); |
var element = node.element; |
- var parts = _emitFunctionTypeParts(element.type); |
+ var parts = _emitFunctionTypeParts(element.type, node.parameters); |
var property = |
new JS.Property(memberName, new JS.ArrayInitializer(parts)); |
tCtors.add(property); |
@@ -794,6 +795,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
])); |
} |
+ // TODO(vsm): Make this optional per #268. |
// Metadata |
if (metadata.isNotEmpty) { |
body.add(js.statement('#[dart.metadata] = () => #;', [ |
@@ -1479,9 +1481,27 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
JS.TemporaryId _getTemp(Element key, String name) => |
_temps.putIfAbsent(key, () => new JS.TemporaryId(name)); |
- JS.ArrayInitializer _emitTypeNames(List<DartType> types) { |
- return new JS.ArrayInitializer( |
- new List<JS.Expression>.from(types.map(_emitTypeName))); |
+ List<Annotation> _parameterMetadata(FormalParameter p) => |
+ (p is NormalFormalParameter) |
+ ? p.metadata |
+ : (p as DefaultFormalParameter).parameter.metadata; |
+ |
+ JS.ArrayInitializer _emitTypeNames(List<DartType> types, |
+ [List<FormalParameter> parameters]) { |
+ var result = <JS.Expression>[]; |
+ for (int i = 0; i < types.length; ++i) { |
+ var metadata = |
+ parameters != null ? _parameterMetadata(parameters[i]) : []; |
+ var typeName = _emitTypeName(types[i]); |
+ var value = typeName; |
+ // TODO(vsm): Make this optional per #268. |
+ if (metadata.isNotEmpty) { |
+ metadata = metadata.map(_instantiateAnnotation).toList(); |
+ value = new JS.ArrayInitializer([typeName]..addAll(metadata)); |
+ } |
+ result.add(value); |
+ } |
+ return new JS.ArrayInitializer(result); |
} |
JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) { |
@@ -1496,21 +1516,25 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
/// Emit the pieces of a function type, as an array of return type, |
/// regular args, and optional/named args. |
- List<JS.Expression> _emitFunctionTypeParts(FunctionType type) { |
+ List<JS.Expression> _emitFunctionTypeParts(FunctionType type, |
+ [FormalParameterList parameterList]) { |
+ var parameters = parameterList?.parameters; |
var returnType = type.returnType; |
var parameterTypes = type.normalParameterTypes; |
var optionalTypes = type.optionalParameterTypes; |
var namedTypes = type.namedParameterTypes; |
var rt = _emitTypeName(returnType); |
- var ra = _emitTypeNames(parameterTypes); |
+ var ra = _emitTypeNames(parameterTypes, parameters); |
if (!namedTypes.isEmpty) { |
assert(optionalTypes.isEmpty); |
+ // TODO(vsm): Pass in annotations here as well. |
var na = _emitTypeProperties(namedTypes); |
return [rt, ra, na]; |
} |
if (!optionalTypes.isEmpty) { |
assert(namedTypes.isEmpty); |
- var oa = _emitTypeNames(optionalTypes); |
+ var oa = _emitTypeNames( |
+ optionalTypes, parameters?.sublist(parameterTypes.length)); |
return [rt, ra, oa]; |
} |
return [rt, ra]; |
@@ -1694,7 +1718,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
if (DynamicInvoke.get(target)) { |
code = 'dart.$DSEND(#, #, #)'; |
} else if (DynamicInvoke.get(node.methodName)) { |
- // This is a dynamic call to a statically know target. For example: |
+ // This is a dynamic call to a statically known target. For example: |
// class Foo { Function bar; } |
// new Foo().bar(); // dynamic call |
code = 'dart.$DCALL(#.#, #)'; |