Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart |
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
index 3b7e5e927effbf4c1e1bb2a9b071f99959e57e78..dfdf537bc85e95d31de7498359ccb17f1e9aabf6 100644 |
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
@@ -2992,6 +2992,41 @@ class CodeGenerator extends Object |
bool nameType: true, |
bool hoistType: true, |
definite: false}) { |
+ var parts = _emitFunctionTypeParts(type, |
+ parameters: parameters, |
+ lowerTypedef: lowerTypedef, |
+ nameType: nameType, |
+ hoistType: hoistType); |
+ var helper = definite ? 'definiteFunctionType' : 'functionType'; |
+ var fullType = _callHelper('${helper}(#)', [parts]); |
+ if (!nameType) return fullType; |
+ return _typeTable.nameType(type, fullType, |
+ hoistType: hoistType, definite: definite); |
+ } |
+ |
+ JS.Expression _emitAnnotatedFunctionType( |
+ FunctionType type, List<Annotation> metadata, |
+ {List<FormalParameter> parameters, |
+ bool lowerTypedef: false, |
+ bool nameType: true, |
+ bool hoistType: true, |
+ bool definite: false}) { |
+ var result = _emitFunctionType(type, |
+ parameters: parameters, |
+ lowerTypedef: lowerTypedef, |
+ nameType: nameType, |
+ hoistType: hoistType, |
+ definite: definite); |
+ return _emitAnnotatedResult(result, metadata); |
+ } |
+ |
+ /// Emit the pieces of a function type, as an array of return type, |
+ /// regular args, and optional/named args. |
+ List<JS.Expression> _emitFunctionTypeParts(FunctionType type, |
+ {List<FormalParameter> parameters, |
+ bool lowerTypedef: false, |
+ bool nameType: true, |
+ bool hoistType: true}) { |
var parameterTypes = type.normalParameterTypes; |
var optionalTypes = type.optionalParameterTypes; |
var namedTypes = type.namedParameterTypes; |
@@ -3017,51 +3052,25 @@ class CodeGenerator extends Object |
typeParts = [rt, ra]; |
} |
- JS.Expression fullType; |
var typeFormals = type.typeFormals; |
- String helperCall; |
if (typeFormals.isNotEmpty) { |
+ // TODO(jmesserly): this is a suboptimal representation for universal |
+ // function types (as callable functions). See discussion at |
+ // https://github.com/dart-lang/sdk/issues/27333 |
var tf = _emitTypeFormals(typeFormals); |
- |
- addTypeFormalsAsParameters(List<JS.Expression> elements) { |
- var names = _typeTable.discharge(typeFormals); |
- var array = new JS.ArrayInitializer(elements); |
- return names.isEmpty |
- ? js.call('(#) => #', [tf, array]) |
- : js.call('(#) => {#; return #;}', [tf, names, array]); |
- } |
- |
- typeParts = [addTypeFormalsAsParameters(typeParts)]; |
- |
- helperCall = definite ? 'gFnType(#)' : 'gFnTypeFuzzy(#)'; |
- // If any explicit bounds were passed, emit them. |
- if (typeFormals.any((t) => t.bound != null)) { |
- var bounds = typeFormals.map((t) => _emitType(t.type.bound)).toList(); |
- typeParts.add(addTypeFormalsAsParameters(bounds)); |
+ var names = _typeTable.discharge(typeFormals); |
+ var parts = new JS.ArrayInitializer(typeParts); |
+ if (names.isEmpty) { |
+ typeParts = [ |
+ js.call('(#) => #', [tf, parts]) |
+ ]; |
+ } else { |
+ typeParts = [ |
+ js.call('(#) => {#; return #;}', [tf, names, parts]) |
+ ]; |
} |
- } else { |
- helperCall = definite ? 'fnType(#)' : 'fnTypeFuzzy(#)'; |
} |
- fullType = _callHelper(helperCall, [typeParts]); |
- if (!nameType) return fullType; |
- return _typeTable.nameType(type, fullType, |
- hoistType: hoistType, definite: definite); |
- } |
- |
- JS.Expression _emitAnnotatedFunctionType( |
- FunctionType type, List<Annotation> metadata, |
- {List<FormalParameter> parameters, |
- bool lowerTypedef: false, |
- bool nameType: true, |
- bool hoistType: true, |
- bool definite: false}) { |
- var result = _emitFunctionType(type, |
- parameters: parameters, |
- lowerTypedef: lowerTypedef, |
- nameType: nameType, |
- hoistType: hoistType, |
- definite: definite); |
- return _emitAnnotatedResult(result, metadata); |
+ return typeParts; |
} |
/// Emits an expression that lets you access statics on a [type] from code. |