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

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2832913003: fix #27971, implement generic function RTTI (Closed)
Patch Set: fix Created 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/browser/language_tests.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/browser/language_tests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698