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

Unified Diff: pkg/analyzer/lib/src/summary/link.dart

Issue 2931123002: Fix for resynthesizing generic functions during linking. (Closed)
Patch Set: Created 3 years, 6 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 | « no previous file | pkg/analyzer/test/src/summary/linker_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/summary/link.dart
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index ce8a61de425370a146f1454a69e60b464a0d368d..a9fe8221fc4b989450592c48b1797b53780088d0 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -242,6 +242,16 @@ EntityRefBuilder _createLinkedType(
// TODO(paulberry): do I need to store type arguments?
return result;
}
+ if (element is GenericFunctionTypeElement) {
+ result.entityKind = EntityRefKind.genericFunctionType;
+ result.syntheticReturnType = _createLinkedType(
+ type.returnType, compilationUnit, typeParameterContext);
+ result.syntheticParams = type.parameters
+ .map((ParameterElement param) => _serializeSyntheticParam(
+ param, compilationUnit, typeParameterContext))
+ .toList();
+ return result;
+ }
// TODO(paulberry): implement other cases.
throw new UnimplementedError('${element.runtimeType}');
}
@@ -1091,6 +1101,8 @@ abstract class CompilationUnitElementForLink
if (entity.paramReference != 0) {
return context.typeParameterContext
.getTypeParameterType(entity.paramReference);
+ } else if (entity.entityKind == EntityRefKind.genericFunctionType) {
+ return new GenericFunctionTypeElementForLink(this, context, entity).type;
} else if (entity.syntheticReturnType != null) {
// TODO(paulberry): implement.
throw new UnimplementedError();
@@ -3244,6 +3256,87 @@ class FunctionTypeAliasElementForLink extends Object
}
/**
+ * Element representing a generic function resynthesized from a summary during
+ * linking.
+ */
+class GenericFunctionTypeElementForLink extends Object
+ with
+ TypeParameterizedElementMixin,
+ ParameterParentElementForLink,
+ ReferenceableElementForLink
+ implements GenericFunctionTypeElement, ElementImpl {
+ @override
+ final CompilationUnitElementForLink enclosingUnit;
+
+ @override
+ final ElementImpl enclosingElement;
+
+ /**
+ * The linked representation of the generic function in the summary.
+ */
+ final EntityRef _entity;
+
+ DartType _returnType;
+ FunctionTypeImpl _type;
+
+ GenericFunctionTypeElementForLink(
+ this.enclosingUnit, this.enclosingElement, this._entity);
+
+ @override
+ DartType get asStaticType {
+ return enclosingUnit.enclosingElement._linker.typeProvider.typeType;
+ }
+
+ @override
+ ContextForLink get context => enclosingElement.context;
+
+ @override
+ TypeParameterizedElementMixin get enclosingTypeParameterContext {
+ return enclosingElement.typeParameterContext;
+ }
+
+ @override
+ String get identifier => name;
+
+ @override
+ List<int> get implicitFunctionTypeIndices => const <int>[];
+
+ @override
+ bool get isSynthetic => false;
+
+ @override
+ LibraryElementForLink get library => enclosingElement.library;
+
+ @override
+ String get name => '-';
+
+ @override
+ DartType get returnType => _returnType ??=
+ enclosingUnit.resolveTypeRef(this, _entity.syntheticReturnType);
+
+ @override
+ FunctionType get type {
+ return _type ??= new FunctionTypeImpl.elementWithNameAndArgs(
+ this, null, allEnclosingTypeParameterTypes, false);
+ }
+
+ @override
+ TypeParameterizedElementMixin get typeParameterContext => this;
+
+ @override
+ List<UnlinkedParam> get unlinkedParameters => _entity.syntheticParams;
+
+ @override
+ List<UnlinkedTypeParam> get unlinkedTypeParams => _entity.typeParameters;
+
+ @override
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+ @override
+ String toString() => '$enclosingElement.$name';
+}
+
+/**
* Element representing a generic typedef resynthesized from a summary during
* linking.
*/
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/linker_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698