Index: tests/compiler/dart2js/type_checker_test.dart |
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart |
index c906192782576149201a27214f03c9c8b9d737ca..61955d443ea1e89edff531993e03abcb9fe1a8fd 100644 |
--- a/tests/compiler/dart2js/type_checker_test.dart |
+++ b/tests/compiler/dart2js/type_checker_test.dart |
@@ -34,6 +34,7 @@ main() { |
List tests = [testSimpleTypes, |
testReturn, |
testFor, |
+ testSyncForIn, |
testWhile, |
testTry, |
testSwitch, |
@@ -126,6 +127,164 @@ testFor(MockCompiler compiler) { |
// check("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND); |
} |
+ |
+testSyncForIn(MockCompiler compiler) { |
+ String script = """ |
+class HasUntypedIterator { |
+ get iterator => null; |
+} |
+ |
+class HasIntIterator { |
+ Iterator<int> get iterator => null; |
+} |
+ |
+class HasNoIterator { |
+} |
+ |
+class HasCustomIntIterator { |
+ CustomIntIterator get iterator => null; |
+} |
+ |
+class CustomIntIterator { |
+ int current; |
+} |
+ |
+class HasCustomNoCurrentIterator { |
+ CustomNoCurrentIterator get iterator => null; |
+} |
+ |
+class CustomNoCurrentIterator { |
+} |
+ |
+var topLevelDyn; |
+String topLevelString; |
+int topLevelInt; |
+ |
+class Class { |
+ void forIn() {} |
+ |
+ var instanceDyn; |
+ String instanceString; |
+ int instanceInt; |
+ |
+ static var staticDyn; |
+ static String staticString; |
+ static int staticInt; |
+} |
+"""; |
+ compiler.parseScript(script); |
+ ClassElement foo = compiler.mainApp.find("Class"); |
+ foo.ensureResolved(compiler); |
+ FunctionElement method = foo.lookupLocalMember('forIn'); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in <String>[]) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in []) {} |
+ }"""); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in new HasUntypedIterator()) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in new HasUntypedIterator()) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in new HasUntypedIterator()) {} |
+ }"""); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in new HasIntIterator()) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in new HasIntIterator()) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in new HasIntIterator()) {} |
+ }"""); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in new HasNoIterator()) {} |
+ }""", warnings: MessageKind.MEMBER_NOT_FOUND); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in new HasNoIterator()) {} |
+ }""", warnings: MessageKind.MEMBER_NOT_FOUND); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in new HasNoIterator()) {} |
+ }""", warnings: MessageKind.MEMBER_NOT_FOUND); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in new HasCustomIntIterator()) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in new HasCustomIntIterator()) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in new HasCustomIntIterator()) {} |
+ }"""); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (var e in new HasCustomNoCurrentIterator()) {} |
+ }""", hints: MessageKind.MEMBER_NOT_FOUND); |
+ analyzeIn(compiler, method, """{ |
+ for (String e in new HasCustomNoCurrentIterator()) {} |
+ }""", hints: MessageKind.MEMBER_NOT_FOUND); |
+ analyzeIn(compiler, method, """{ |
+ for (int e in new HasCustomNoCurrentIterator()) {} |
+ }""", hints: MessageKind.MEMBER_NOT_FOUND); |
+ |
+ analyzeIn(compiler, method, """{ |
+ var localDyn; |
+ for (localDyn in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ String localString; |
+ for (localString in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ int localInt; |
+ for (localInt in <String>[]) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (topLevelDyn in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (topLevelString in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (topLevelInt in <String>[]) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (instanceDyn in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (instanceString in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (instanceInt in <String>[]) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+ |
+ analyzeIn(compiler, method, """{ |
+ for (staticDyn in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (staticString in <String>[]) {} |
+ }"""); |
+ analyzeIn(compiler, method, """{ |
+ for (staticInt in <String>[]) {} |
+ }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
+} |
+ |
+ |
testWhile(MockCompiler compiler) { |
check(String code, {warnings}) { |
analyze(compiler, code, warnings: warnings); |
@@ -614,7 +773,7 @@ Future testMethodInvocationsInClass(MockCompiler compiler) { |
int localMethod(String str) { return 0; } |
$text |
}""", |
- expectedWarnings); |
+ warnings: expectedWarnings); |
} |
@@ -894,7 +1053,7 @@ testThis(MockCompiler compiler) { |
ClassElement foo = compiler.mainApp.find("Foo"); |
foo.ensureResolved(compiler); |
Element method = foo.lookupLocalMember('method'); |
- analyzeIn(compiler, method, "{ int i = this; }", NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, "{ int i = this; }", warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ Object o = this; }"); |
analyzeIn(compiler, method, "{ Foo f = this; }"); |
} |
@@ -914,7 +1073,8 @@ testSuper(MockCompiler compiler) { |
ClassElement B = compiler.mainApp.find("B"); |
B.ensureResolved(compiler); |
Element method = B.lookupLocalMember('method'); |
- analyzeIn(compiler, method, "{ int i = super.field; }", NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, "{ int i = super.field; }", |
+ warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ Object o = super.field; }"); |
analyzeIn(compiler, method, "{ String s = super.field; }"); |
} |
@@ -1222,14 +1382,17 @@ void testTypeVariableExpressions(MockCompiler compiler) { |
Element method = foo.lookupLocalMember('method'); |
analyzeIn(compiler, method, "{ Type type = T; }"); |
- analyzeIn(compiler, method, "{ T type = T; }", NOT_ASSIGNABLE); |
- analyzeIn(compiler, method, "{ int type = T; }", NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, "{ T type = T; }", warnings: NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, "{ int type = T; }", warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ String typeName = T.toString(); }"); |
- analyzeIn(compiler, method, "{ T.foo; }", MEMBER_NOT_FOUND); |
- analyzeIn(compiler, method, "{ T.foo = 0; }", MessageKind.SETTER_NOT_FOUND); |
- analyzeIn(compiler, method, "{ T.foo(); }", MessageKind.METHOD_NOT_FOUND); |
- analyzeIn(compiler, method, "{ T + 1; }", MessageKind.OPERATOR_NOT_FOUND); |
+ analyzeIn(compiler, method, "{ T.foo; }", warnings: MEMBER_NOT_FOUND); |
+ analyzeIn(compiler, method, "{ T.foo = 0; }", |
+ warnings: MessageKind.SETTER_NOT_FOUND); |
+ analyzeIn(compiler, method, "{ T.foo(); }", |
+ warnings: MessageKind.METHOD_NOT_FOUND); |
+ analyzeIn(compiler, method, "{ T + 1; }", |
+ warnings: MessageKind.OPERATOR_NOT_FOUND); |
} |
void testTypeVariableLookup1(MockCompiler compiler) { |
@@ -1254,7 +1417,7 @@ class Test<S extends Foo, T> { |
FunctionElement methodTest = classTest.lookupLocalMember("test"); |
test(String expression, [message]) { |
- analyzeIn(compiler, methodTest, "{ $expression; }", message); |
+ analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message); |
} |
test('s.field'); |
@@ -1294,7 +1457,7 @@ class Test<S extends T, T extends Foo> { |
FunctionElement methodTest = classTest.lookupLocalMember("test"); |
test(String expression, [message]) { |
- analyzeIn(compiler, methodTest, "{ $expression; }", message); |
+ analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message); |
} |
test('s.field'); |
@@ -1316,7 +1479,7 @@ class Test<S extends T, T extends S> { |
FunctionElement methodTest = classTest.lookupLocalMember("test"); |
test(String expression, [message]) { |
- analyzeIn(compiler, methodTest, "{ $expression; }", message); |
+ analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message); |
} |
test('s.toString'); |
@@ -2027,18 +2190,19 @@ testAwait(MockCompiler compiler) { |
FunctionElement method = foo.lookupLocalMember('method'); |
analyzeIn(compiler, method, "{ await 0; }"); |
analyzeIn(compiler, method, "{ int i = await 0; }"); |
- analyzeIn(compiler, method, "{ String s = await 0; }", NOT_ASSIGNABLE); |
+ analyzeIn(compiler, method, "{ String s = await 0; }", |
+ warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ await asyncInt(); }"); |
analyzeIn(compiler, method, "{ int i = await asyncInt(); }"); |
analyzeIn(compiler, method, "{ String s = await asyncInt(); }", |
- NOT_ASSIGNABLE); |
+ warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ Foo f = self(); }"); |
analyzeIn(compiler, method, "{ Foo f = await self(); }"); |
analyzeIn(compiler, method, "{ Foo f = await self().asyncInt(); }", |
- NOT_ASSIGNABLE); |
+ warnings: NOT_ASSIGNABLE); |
analyzeIn(compiler, method, "{ int i = await self().asyncInt(); }"); |
analyzeIn(compiler, method, "{ String s = await self().asyncInt(); }", |
- NOT_ASSIGNABLE); |
+ warnings: NOT_ASSIGNABLE); |
} |
testAsyncReturn(MockCompiler compiler) { |
@@ -2283,9 +2447,11 @@ void generateOutput(MockCompiler compiler, String text) { |
analyzeIn(MockCompiler compiler, |
FunctionElement element, |
String text, |
- [expectedWarnings]) { |
- if (expectedWarnings == null) expectedWarnings = []; |
- if (expectedWarnings is !List) expectedWarnings = [expectedWarnings]; |
+ {warnings, hints}) { |
+ if (warnings == null) warnings = []; |
+ if (warnings is !List) warnings = [warnings]; |
+ if (hints == null) hints = []; |
+ if (hints is !List) hints = [hints]; |
compiler.resolver.resolve(element); |
Token tokens = scan(text); |
@@ -2301,5 +2467,6 @@ analyzeIn(MockCompiler compiler, |
compiler.clearMessages(); |
checker.analyze(node); |
generateOutput(compiler, text); |
- compareWarningKinds(text, expectedWarnings, compiler.warnings); |
+ compareWarningKinds(text, warnings, compiler.warnings); |
+ compareWarningKinds(text, hints, compiler.hints); |
} |