Chromium Code Reviews| Index: lib/src/codegen/js_codegen.dart |
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
| index 31ab6535fae86b3984ff8afebeb421b18f339ed1..43b30402b823290bb29d8564fff1807efe42300c 100644 |
| --- a/lib/src/codegen/js_codegen.dart |
| +++ b/lib/src/codegen/js_codegen.dart |
| @@ -304,11 +304,17 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| var type = node.element.type; |
| if (_pendingClasses.remove(node.element) == null) return null; |
| - var classDecl = new JS.ClassDeclaration(new JS.ClassExpression( |
| - new JS.Identifier(type.name), |
| - _emitTypeName(rules.provider.functionType), [])); |
| + var name = type.name; |
| + var closure = new JS.ArrowFun([], _emitTypeName(node.element.type, true)); |
| + var result = js.statement('let # = dart.typedef(#, #);', [ |
|
Jennifer Messerly
2015/04/09 18:44:29
maybe a little cleaner:
'let # = dart.typedef(#,
vsm
2015/04/09 19:52:25
Done.
|
| + new JS.Identifier(name), |
| + js.string(name, "'"), |
| + closure |
| + ]); |
| - return _finishClassDef(type, classDecl); |
| + return _finishClassDef(type, result); |
| + // if (isPublic(name)) _addExport(name); |
|
Jennifer Messerly
2015/04/09 18:44:29
remove?
vsm
2015/04/09 19:52:25
Done.
|
| + // return result; |
| } |
| @override |
| @@ -1093,10 +1099,57 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| return new JS.Identifier(name); |
| } |
| - JS.Expression _emitTypeName(DartType type) { |
| + JS.ArrayInitializer _emitTypeNames(List<DartType> types) { |
| + return new JS.ArrayInitializer(types.map(_emitTypeName).toList()); |
| + } |
| + |
| + JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) { |
| + var properties = <JS.Property>[]; |
| + types.forEach((name, type) { |
| + var key = new JS.LiteralString(name); |
| + var value = _emitTypeName(type); |
| + properties.add(new JS.Property(key, value)); |
| + }); |
| + return new JS.ObjectInitializer(properties); |
| + } |
| + |
| + JS.Expression _emitTypeName(DartType type, [bool lowerTypedef = false]) { |
|
Jennifer Messerly
2015/04/09 18:44:29
named arg?
vsm
2015/04/09 19:52:25
Done.
|
| + if (type.isVoid) { |
| + // The void type is not defined in core. |
|
Jennifer Messerly
2015/04/09 18:44:29
dynamic too?
vsm
2015/04/09 19:52:25
Done.
|
| + return js.call('dart.void'); |
| + } |
| + |
| var name = type.name; |
| var element = type.element; |
| - if (name == '') { |
| + if (name == '' || lowerTypedef && type is FunctionType) { |
| + if (type is FunctionType) { |
| + // TODO(vsm): Support all parameter types. |
|
Jennifer Messerly
2015/04/09 18:44:29
can you elaborate on this?
vsm
2015/04/09 19:52:25
Obsolete. Removed.
|
| + var returnType = type.returnType; |
| + var parameterTypes = type.normalParameterTypes; |
| + var optionalTypes = type.optionalParameterTypes; |
| + var namedTypes = type.namedParameterTypes; |
| + if (namedTypes.isEmpty) { |
| + if (optionalTypes.isEmpty) { |
| + return js.call('dart.functionType(#, #)', [ |
| + _emitTypeName(returnType), |
| + _emitTypeNames(parameterTypes) |
| + ]); |
| + } else { |
| + return js.call('dart.functionType(#, #, #)', [ |
| + _emitTypeName(returnType), |
| + _emitTypeNames(parameterTypes), |
| + _emitTypeNames(optionalTypes) |
| + ]); |
| + } |
| + } else { |
| + assert(optionalTypes.isEmpty); |
| + return js.call('dart.functionType(#, #, #)', [ |
| + _emitTypeName(returnType), |
| + _emitTypeNames(parameterTypes), |
| + _emitTypeProperties(namedTypes) |
| + ]); |
| + } |
| + } |
| // TODO(jmesserly): remove when we're using coercion reifier. |
| return _unimplementedCall('Unimplemented type $type'); |
| } |