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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dev_compiler.src.codegen.js_codegen; 5 library dev_compiler.src.codegen.js_codegen;
6 6
7 import 'dart:collection' show HashSet, HashMap; 7 import 'dart:collection' show HashSet, HashMap;
8 import 'dart:io' show Directory, File; 8 import 'dart:io' show Directory, File;
9 9
10 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; 10 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 if (rules.isBoolType(t)) return 'boolean'; 297 if (rules.isBoolType(t)) return 'boolean';
298 return null; 298 return null;
299 } 299 }
300 300
301 @override 301 @override
302 visitFunctionTypeAlias(FunctionTypeAlias node) { 302 visitFunctionTypeAlias(FunctionTypeAlias node) {
303 // If we've already emitted this class, skip it. 303 // If we've already emitted this class, skip it.
304 var type = node.element.type; 304 var type = node.element.type;
305 if (_pendingClasses.remove(node.element) == null) return null; 305 if (_pendingClasses.remove(node.element) == null) return null;
306 306
307 var classDecl = new JS.ClassDeclaration(new JS.ClassExpression( 307 var name = type.name;
308 new JS.Identifier(type.name), 308 var closure = new JS.ArrowFun([], _emitTypeName(node.element.type, true));
309 _emitTypeName(rules.provider.functionType), [])); 309 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.
310 new JS.Identifier(name),
311 js.string(name, "'"),
312 closure
313 ]);
310 314
311 return _finishClassDef(type, classDecl); 315 return _finishClassDef(type, result);
316 // if (isPublic(name)) _addExport(name);
Jennifer Messerly 2015/04/09 18:44:29 remove?
vsm 2015/04/09 19:52:25 Done.
317 // return result;
312 } 318 }
313 319
314 @override 320 @override
315 JS.Expression visitTypeName(TypeName node) => _emitTypeName(node.type); 321 JS.Expression visitTypeName(TypeName node) => _emitTypeName(node.type);
316 322
317 @override 323 @override
318 JS.Statement visitClassTypeAlias(ClassTypeAlias node) { 324 JS.Statement visitClassTypeAlias(ClassTypeAlias node) {
319 // If we've already emitted this class, skip it. 325 // If we've already emitted this class, skip it.
320 var type = node.element.type; 326 var type = node.element.type;
321 if (_pendingClasses.remove(node.element) == null) return null; 327 if (_pendingClasses.remove(node.element) == null) return null;
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 /// The renamer would handle this, but it would prefer to rename the 1092 /// The renamer would handle this, but it would prefer to rename the
1087 /// temporary used for the private symbol. Instead rename the parameter. 1093 /// temporary used for the private symbol. Instead rename the parameter.
1088 return new JSTemporary('${name.substring(1)}'); 1094 return new JSTemporary('${name.substring(1)}');
1089 } 1095 }
1090 1096
1091 if (_isTemporary(e)) return new JSTemporary(e.name); 1097 if (_isTemporary(e)) return new JSTemporary(e.name);
1092 1098
1093 return new JS.Identifier(name); 1099 return new JS.Identifier(name);
1094 } 1100 }
1095 1101
1096 JS.Expression _emitTypeName(DartType type) { 1102 JS.ArrayInitializer _emitTypeNames(List<DartType> types) {
1103 return new JS.ArrayInitializer(types.map(_emitTypeName).toList());
1104 }
1105
1106 JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) {
1107 var properties = <JS.Property>[];
1108 types.forEach((name, type) {
1109 var key = new JS.LiteralString(name);
1110 var value = _emitTypeName(type);
1111 properties.add(new JS.Property(key, value));
1112 });
1113 return new JS.ObjectInitializer(properties);
1114 }
1115
1116 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.
1117 if (type.isVoid) {
1118 // 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.
1119 return js.call('dart.void');
1120 }
1121
1097 var name = type.name; 1122 var name = type.name;
1098 var element = type.element; 1123 var element = type.element;
1099 if (name == '') { 1124 if (name == '' || lowerTypedef && type is FunctionType) {
1125 if (type is FunctionType) {
1126 // 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.
1127 var returnType = type.returnType;
1128 var parameterTypes = type.normalParameterTypes;
1129 var optionalTypes = type.optionalParameterTypes;
1130 var namedTypes = type.namedParameterTypes;
1131 if (namedTypes.isEmpty) {
1132 if (optionalTypes.isEmpty) {
1133 return js.call('dart.functionType(#, #)', [
1134 _emitTypeName(returnType),
1135 _emitTypeNames(parameterTypes)
1136 ]);
1137 } else {
1138 return js.call('dart.functionType(#, #, #)', [
1139 _emitTypeName(returnType),
1140 _emitTypeNames(parameterTypes),
1141 _emitTypeNames(optionalTypes)
1142 ]);
1143 }
1144 } else {
1145 assert(optionalTypes.isEmpty);
1146 return js.call('dart.functionType(#, #, #)', [
1147 _emitTypeName(returnType),
1148 _emitTypeNames(parameterTypes),
1149 _emitTypeProperties(namedTypes)
1150 ]);
1151 }
1152 }
1100 // TODO(jmesserly): remove when we're using coercion reifier. 1153 // TODO(jmesserly): remove when we're using coercion reifier.
1101 return _unimplementedCall('Unimplemented type $type'); 1154 return _unimplementedCall('Unimplemented type $type');
1102 } 1155 }
1103 1156
1104 var typeArgs = null; 1157 var typeArgs = null;
1105 if (type is ParameterizedType) { 1158 if (type is ParameterizedType) {
1106 // TODO(jmesserly): this is a workaround for an analyzer bug, see: 1159 // TODO(jmesserly): this is a workaround for an analyzer bug, see:
1107 // https://github.com/dart-lang/dev_compiler/commit/a212d59ad046085a626dd8 d16881cdb8e8b9c3fa 1160 // https://github.com/dart-lang/dev_compiler/commit/a212d59ad046085a626dd8 d16881cdb8e8b9c3fa
1108 if (type is! FunctionType || element is FunctionTypeAlias) { 1161 if (type is! FunctionType || element is FunctionTypeAlias) {
1109 var args = type.typeArguments; 1162 var args = type.typeArguments;
(...skipping 1384 matching lines...) Expand 10 before | Expand all | Expand 10 after
2494 2547
2495 // TODO(jmesserly): in many cases marking the end will be unncessary. 2548 // TODO(jmesserly): in many cases marking the end will be unncessary.
2496 printer.mark(_location(node.end)); 2549 printer.mark(_location(node.end));
2497 } 2550 }
2498 2551
2499 String _getIdentifier(AstNode node) { 2552 String _getIdentifier(AstNode node) {
2500 if (node is SimpleIdentifier) return node.name; 2553 if (node is SimpleIdentifier) return node.name;
2501 return null; 2554 return null;
2502 } 2555 }
2503 } 2556 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698