| Index: lib/src/codegen/js_codegen.dart
|
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
|
| index a559435c57d6764fd4dc1fe720ab5df941c5bd07..55731d2e74ff4fb5290e6dd956894c5a4d9ceea8 100644
|
| --- a/lib/src/codegen/js_codegen.dart
|
| +++ b/lib/src/codegen/js_codegen.dart
|
| @@ -647,8 +647,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| if (inheritedElement != null &&
|
| inheritedElement.type == element.type) continue;
|
| var memberName = _elementMemberName(element);
|
| - var parts =
|
| - _emitFunctionTypeParts(element.type, dynamicIsBottom: false);
|
| + var parts = _emitFunctionTypeParts(element.type);
|
| var property =
|
| new JS.Property(memberName, new JS.ArrayInitializer(parts));
|
| if (node.isStatic) {
|
| @@ -664,8 +663,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| for (ConstructorDeclaration node in ctors) {
|
| var memberName = _constructorName(node.element);
|
| var element = node.element;
|
| - var parts =
|
| - _emitFunctionTypeParts(element.type, dynamicIsBottom: false);
|
| + var parts = _emitFunctionTypeParts(element.type);
|
| var property =
|
| new JS.Property(memberName, new JS.ArrayInitializer(parts));
|
| tCtors.add(property);
|
| @@ -1185,10 +1183,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| if (lazy) {
|
| return js.call('dart.fn(#, () => #)', [clos, _emitFunctionRTTI(type)]);
|
| }
|
| - return js.call('dart.fn(#, #)', [
|
| - clos,
|
| - _emitFunctionTypeParts(type, dynamicIsBottom: false)
|
| - ]);
|
| + return js.call('dart.fn(#, #)', [clos, _emitFunctionTypeParts(type)]);
|
| }
|
| throw 'Function has non function type: $type';
|
| }
|
| @@ -1321,18 +1316,16 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| JS.TemporaryId _getTemp(Object key, String name) =>
|
| _temps.putIfAbsent(key, () => new JS.TemporaryId(name));
|
|
|
| - JS.ArrayInitializer _emitTypeNames(List<DartType> types,
|
| - {dynamicIsBottom: false}) {
|
| - var build = (t) => _emitTypeName(t, dynamicIsBottom: dynamicIsBottom);
|
| + JS.ArrayInitializer _emitTypeNames(List<DartType> types) {
|
| + var build = (t) => _emitTypeName(t);
|
| return new JS.ArrayInitializer(types.map(build).toList());
|
| }
|
|
|
| - JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types,
|
| - {dynamicIsBottom: false}) {
|
| + JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) {
|
| var properties = <JS.Property>[];
|
| types.forEach((name, type) {
|
| var key = _propertyName(name);
|
| - var value = _emitTypeName(type, dynamicIsBottom: dynamicIsBottom);
|
| + var value = _emitTypeName(type);
|
| properties.add(new JS.Property(key, value));
|
| });
|
| return new JS.ObjectInitializer(properties);
|
| @@ -1340,33 +1333,29 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
|
|
| /// Emit the pieces of a function type, as an array of return type,
|
| /// regular args, and optional/named args.
|
| - /// If [dynamicIsBottom] is true, then dynamics in argument positions
|
| - /// will be lowered to bottom instead of Object.
|
| - List<JS.Expression> _emitFunctionTypeParts(FunctionType type,
|
| - {bool dynamicIsBottom: true}) {
|
| + List<JS.Expression> _emitFunctionTypeParts(FunctionType type) {
|
| var returnType = type.returnType;
|
| var parameterTypes = type.normalParameterTypes;
|
| var optionalTypes = type.optionalParameterTypes;
|
| var namedTypes = type.namedParameterTypes;
|
| var rt = _emitTypeName(returnType);
|
| - var ra = _emitTypeNames(parameterTypes, dynamicIsBottom: dynamicIsBottom);
|
| + var ra = _emitTypeNames(parameterTypes);
|
| if (!namedTypes.isEmpty) {
|
| assert(optionalTypes.isEmpty);
|
| - var na =
|
| - _emitTypeProperties(namedTypes, dynamicIsBottom: dynamicIsBottom);
|
| + var na = _emitTypeProperties(namedTypes);
|
| return [rt, ra, na];
|
| }
|
| if (!optionalTypes.isEmpty) {
|
| assert(namedTypes.isEmpty);
|
| - var oa = _emitTypeNames(optionalTypes, dynamicIsBottom: dynamicIsBottom);
|
| + var oa = _emitTypeNames(optionalTypes);
|
| return [rt, ra, oa];
|
| }
|
| return [rt, ra];
|
| }
|
|
|
| JS.Expression _emitFunctionRTTI(FunctionType type) {
|
| - var parts = _emitFunctionTypeParts(type, dynamicIsBottom: false);
|
| - return js.call('dart.functionType(#)', [parts]);
|
| + var parts = _emitFunctionTypeParts(type);
|
| + return js.call('dart.definiteFunctionType(#)', [parts]);
|
| }
|
|
|
| /// Emits a Dart [type] into code.
|
| @@ -1375,15 +1364,14 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| /// function type. Similarly if [lowerGeneric] is set, the `List$()` form
|
| /// will be used instead of `List`. These flags are used when generating
|
| /// the definitions for typedefs and generic types, respectively.
|
| - JS.Expression _emitTypeName(DartType type, {bool lowerTypedef: false,
|
| - bool lowerGeneric: false, bool dynamicIsBottom: false}) {
|
| + JS.Expression _emitTypeName(DartType type,
|
| + {bool lowerTypedef: false, bool lowerGeneric: false}) {
|
|
|
| // The void and dynamic types are not defined in core.
|
| if (type.isVoid) {
|
| return js.call('dart.void');
|
| } else if (type.isDynamic) {
|
| - if (dynamicIsBottom) return js.call('dart.bottom');
|
| - return _emitTypeName(types.objectType);
|
| + return js.call('dart.dynamic');
|
| } else if (type.isBottom) {
|
| return js.call('dart.bottom');
|
| }
|
|
|