Separately handle InterfaceType and FunctionType while collecting free type parameters.
FuntionType(s) with summary2 are not Element + typeArguments,
they are just types.
R=brianwilkerson@google.com
Change-Id: I52887e6b31cd4e2f9749ff67943159f3c93722fe
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/100888
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index aa034dc..f1ed12b 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -11,6 +11,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_system.dart' as public;
import 'package:analyzer/error/listener.dart' show ErrorReporter;
+import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
import 'package:analyzer/src/dart/element/type.dart';
@@ -323,6 +324,9 @@
Set<DartType> visitedTypes = new HashSet<DartType>();
void appendParameters(DartType type) {
+ if (type == null) {
+ return;
+ }
if (visitedTypes.contains(type)) {
return;
}
@@ -330,6 +334,13 @@
if (type is TypeParameterType && all.contains(type)) {
parameters ??= <TypeParameterType>[];
parameters.add(type);
+ } else if (AnalysisDriver.useSummary2) {
+ if (type is FunctionType) {
+ appendParameters(type.returnType);
+ type.parameters.map((p) => p.type).forEach(appendParameters);
+ } else if (type is InterfaceType) {
+ type.typeArguments.forEach(appendParameters);
+ }
} else if (type is ParameterizedType) {
type.typeArguments.forEach(appendParameters);
}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
index 030f70b..9d25dc4 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code.dart
@@ -5134,17 +5134,12 @@
}
test_typeAliasCannotReferenceItself_typeVariableBounds() async {
- var expectedErrors = <ExpectedError>[
- error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 30),
- ];
- if (!AnalysisDriver.useSummary2) {
- expectedErrors.add(
- error(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 22, 3),
- );
- }
await assertErrorsInCode('''
typedef A<T extends A<int>>();
-''', expectedErrors);
+''', [
+ error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 30),
+ error(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 22, 3),
+ ]);
}
test_typeArgumentNotMatchingBounds_const() async {