Band-aid fix for issue #24191.
This is sufficient to avoid throwing an exception in the resolver,
which in turn will prevent the analysis server from going into an
infinite analysis loop.
I'll work on a more complete fix (which infers the proper type in all
cases) for the next release.
R=brianwilkerson@google.com
Review URL: https://codereview.chromium.org//1307353002 .
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 8110c8c..6792538 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -11227,7 +11227,11 @@
return null;
}
DartType eventType = onDataParameters[0].type;
- if (eventType.element == streamType.typeParameters[0]) {
+ // TODO(paulberry): checking that typeParameters.isNotEmpty is a
+ // band-aid fix for dartbug.com/24191. Figure out what the correct
+ // logic should be.
+ if (streamType.typeParameters.isNotEmpty &&
+ eventType.element == streamType.typeParameters[0]) {
return streamType.typeArguments[0];
}
}
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 64da228..9b057a7 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2898,6 +2898,22 @@
verify([source]);
}
+ void test_issue_24191() {
+ Source source = addSource('''
+import 'dart:async';
+
+class S extends Stream {}
+f(S s) async {
+ await for (var v in s) {
+ print(v);
+ }
+}
+''');
+ computeLibrarySourceErrors(source);
+ assertNoErrors(source);
+ verify([source]);
+ }
+
void test_listElementTypeNotAssignable() {
Source source = addSource(r'''
var v1 = <int> [42];
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 4034068..5963b56 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -236,6 +236,9 @@
// Stream
ClassElementImpl streamElement =
ElementFactory.classElement2("Stream", ["T"]);
+ streamElement.constructors = <ConstructorElement>[
+ ElementFactory.constructorElement2(streamElement, null)
+ ];
DartType returnType = streamSubscriptionElement.type
.substitute4(streamElement.type.typeArguments);
List<DartType> parameterTypes = <DartType>[