Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |