Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(544)

Unified Diff: lib/src/codegen/js_codegen.dart

Issue 1076883003: Initial support for runtime function types and type checking (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: uncomment code Created 5 years, 8 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/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');
}

Powered by Google App Engine
This is Rietveld 408576698