Read bounds of function type type parameters.
R=brianwilkerson@google.com
Change-Id: Icdb0c2e0c02c8f1299d4cf3f6198c26c330f61f8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101240
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 11afe36..6402f7d 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -956,13 +956,23 @@
} else if (kind == LinkedNodeTypeKind.function) {
var typeParameterDataList = linkedType.functionTypeParameters;
- var typeParameters = <TypeParameterElement>[];
- for (var typeParameterData in typeParameterDataList) {
+ var typeParametersLength = typeParameterDataList.length;
+ var typeParameters = List<TypeParameterElement>(typeParametersLength);
+ for (var i = 0; i < typeParametersLength; ++i) {
+ var typeParameterData = typeParameterDataList[i];
var element = TypeParameterElementImpl(typeParameterData.name, -1);
- typeParameters.add(element);
+ typeParameters[i] = element;
_typeParameters[_nextSyntheticTypeParameterId++] = element;
}
+ // Type parameters might use each other in bounds, including forward
+ // references. So, we read bounds after reading all type parameters.
+ for (var i = 0; i < typeParametersLength; ++i) {
+ var typeParameterData = typeParameterDataList[i];
+ TypeParameterElementImpl element = typeParameters[i];
+ element.bound = readType(typeParameterData.bound);
+ }
+
var returnType = readType(linkedType.functionReturnType);
var formalParameters = linkedType.functionFormalParameters.map((p) {
var type = readType(p.type);
@@ -970,7 +980,7 @@
return ParameterElementImpl.synthetic(p.name, type, kind);
}).toList();
- for (var i = 0; i < typeParameterDataList.length; ++i) {
+ for (var i = 0; i < typeParametersLength; ++i) {
_typeParameters.remove(--_nextSyntheticTypeParameterId);
}