| 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 35553f6059607735ebe14b8ae7b023444b25d6d2..5866870795b4c6b7889adaf99ac693c3d05011d2 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| @@ -750,18 +750,34 @@ class CodeGenerator extends Object
|
| }
|
|
|
| @override
|
| - visitFunctionTypeAlias(FunctionTypeAlias node) {
|
| - FunctionTypeAliasElement element = node.element;
|
| + visitFunctionTypeAlias(FunctionTypeAlias node) => _emitTypedef(node);
|
| +
|
| + @override
|
| + visitGenericTypeAlias(GenericTypeAlias node) => _emitTypedef(node);
|
| +
|
| + JS.Statement _emitTypedef(TypeAlias node) {
|
| + var element = node.element as FunctionTypeAliasElement;
|
| + FunctionType type;
|
| + var typeFormals = element.typeParameters;
|
| + if (element is GenericTypeAliasElement) {
|
| + type = element.function.type;
|
| + } else {
|
| + type = element.type;
|
| + if (typeFormals.isNotEmpty) {
|
| + // Skip past the type formals, we'll add them back below, so these
|
| + // type parameter names will end up in scope in the generated JS.
|
| + type = type.instantiate(typeFormals.map((f) => f.type).toList());
|
| + }
|
| + }
|
|
|
| JS.Expression body = annotate(
|
| _callHelper('typedef(#, () => #)', [
|
| js.string(element.name, "'"),
|
| - _emitType(element.type, nameType: false, lowerTypedef: true)
|
| + _emitType(type, nameType: false, lowerTypedef: true)
|
| ]),
|
| node,
|
| element);
|
|
|
| - var typeFormals = element.typeParameters;
|
| if (typeFormals.isNotEmpty) {
|
| return _defineClassTypeArguments(element, typeFormals,
|
| js.statement('const # = #;', [element.name, body]));
|
| @@ -771,12 +787,6 @@ class CodeGenerator extends Object
|
| }
|
|
|
| @override
|
| - visitGenericTypeAlias(GenericTypeAlias node) {
|
| - throw new UnimplementedError('Generic type aliases are not implemented. '
|
| - 'See https://github.com/dart-lang/sdk/issues/27971');
|
| - }
|
| -
|
| - @override
|
| JS.Expression visitTypeName(TypeName node) {
|
| if (node.type == null) {
|
| // TODO(jmesserly): if the type fails to resolve, should we generate code
|
| @@ -3037,7 +3047,7 @@ class CodeGenerator extends Object
|
| }
|
|
|
| var typeFormals = type.typeFormals;
|
| - if (typeFormals.isNotEmpty && !lowerTypedef) {
|
| + 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
|
|
|