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

Unified Diff: pkg/analyzer/lib/src/dart/element/type.dart

Issue 1685273002: fixes #25740, substitute type parameter bound taking into account outer scope type params (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: merge Created 4 years, 10 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
Index: pkg/analyzer/lib/src/dart/element/type.dart
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 181716c66a83bd36ddac5dfa3521597ef27853d6..0ba7afedc1fe83c109ae409e29dc9f6f26935937 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -144,8 +144,7 @@ class DynamicTypeImpl extends TypeImpl {
/**
* Constructor used by [CircularTypeImpl].
*/
- DynamicTypeImpl._circular()
- : super(instance.element, Keyword.DYNAMIC.syntax);
+ DynamicTypeImpl._circular() : super(instance.element, Keyword.DYNAMIC.syntax);
@override
int get hashCode => 1;
@@ -487,11 +486,24 @@ class FunctionTypeImpl extends TypeImpl implements FunctionType {
@override
List<TypeParameterElement> get typeFormals {
- if (_isInstantiated) {
+ if (_isInstantiated || element == null) {
+ return TypeParameterElement.EMPTY_LIST;
+ }
+ List<TypeParameterElement> baseTypeFormals = element.typeParameters;
+ int formalCount = baseTypeFormals.length;
+ if (formalCount == 0) {
return TypeParameterElement.EMPTY_LIST;
- } else {
- return element?.typeParameters ?? TypeParameterElement.EMPTY_LIST;
}
+
+ // Create type formals with specialized bounds.
+ // For example `<U extends T>` where T comes from an outer scope.
+ List<TypeParameterElement> result =
+ new List<TypeParameterElement>(formalCount);
+
+ for (int i = 0; i < formalCount; i++) {
+ result[i] = TypeParameterMember.from(baseTypeFormals[i], this);
+ }
+ return result;
}
@override
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/member.dart ('k') | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698