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

Side by Side Diff: tests/compiler/dart2js/type_checker_test.dart

Issue 1750143005: Move more messages. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Undo change to analyze_test_test.dart Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:async_helper/async_helper.dart'; 7 import 'package:async_helper/async_helper.dart';
8 import 'package:expect/expect.dart'; 8 import 'package:expect/expect.dart';
9 9
10 import 'package:compiler/src/dart_types.dart'; 10 import 'package:compiler/src/dart_types.dart';
(...skipping 11 matching lines...) Expand all
22 import 'package:compiler/src/parser/element_listener.dart'; 22 import 'package:compiler/src/parser/element_listener.dart';
23 import 'package:compiler/src/tree/tree.dart'; 23 import 'package:compiler/src/tree/tree.dart';
24 import 'package:compiler/src/typechecker.dart'; 24 import 'package:compiler/src/typechecker.dart';
25 import 'package:compiler/src/script.dart'; 25 import 'package:compiler/src/script.dart';
26 import 'package:compiler/src/util/util.dart'; 26 import 'package:compiler/src/util/util.dart';
27 27
28 import 'mock_compiler.dart'; 28 import 'mock_compiler.dart';
29 import 'parser_helper.dart'; 29 import 'parser_helper.dart';
30 30
31 final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE; 31 final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
32 final MessageKind MEMBER_NOT_FOUND = MessageKind.MEMBER_NOT_FOUND; 32 final MessageKind UNDEFINED_GETTER = MessageKind.UNDEFINED_GETTER;
33 33
34 main() { 34 main() {
35 List tests = [testSimpleTypes, 35 List tests = [testSimpleTypes,
36 testReturn, 36 testReturn,
37 testFor, 37 testFor,
38 testSyncForIn, 38 testSyncForIn,
39 testAsyncForIn, 39 testAsyncForIn,
40 testWhile, 40 testWhile,
41 testTry, 41 testTry,
42 testSwitch, 42 testSwitch,
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 check("for (;null;) {}"); 119 check("for (;null;) {}");
120 check("for (;0;) {}", warnings: NOT_ASSIGNABLE); 120 check("for (;0;) {}", warnings: NOT_ASSIGNABLE);
121 check("for (;'';) {}", warnings: NOT_ASSIGNABLE); 121 check("for (;'';) {}", warnings: NOT_ASSIGNABLE);
122 122
123 // Foreach tests 123 // Foreach tests
124 // TODO(karlklose): for each is not yet implemented. 124 // TODO(karlklose): for each is not yet implemented.
125 // check("{ List<String> strings = ['1','2','3']; " + 125 // check("{ List<String> strings = ['1','2','3']; " +
126 // "for (String s in strings) {} }"); 126 // "for (String s in strings) {} }");
127 // check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }", 127 // check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
128 // NOT_ASSIGNABLE); 128 // NOT_ASSIGNABLE);
129 // check("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND); 129 // check("for (String s in true) {}", MessageKind.UNDEFINED_METHOD);
130 } 130 }
131 131
132 132
133 testSyncForIn(MockCompiler compiler) { 133 testSyncForIn(MockCompiler compiler) {
134 String script = """ 134 String script = """
135 class HasUntypedIterator { 135 class HasUntypedIterator {
136 get iterator => null; 136 get iterator => null;
137 } 137 }
138 138
139 class HasIntIterator { 139 class HasIntIterator {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 }"""); 207 }""");
208 analyzeIn(compiler, method, """{ 208 analyzeIn(compiler, method, """{
209 for (String e in new HasIntIterator()) {} 209 for (String e in new HasIntIterator()) {}
210 }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); 210 }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
211 analyzeIn(compiler, method, """{ 211 analyzeIn(compiler, method, """{
212 for (int e in new HasIntIterator()) {} 212 for (int e in new HasIntIterator()) {}
213 }"""); 213 }""");
214 214
215 analyzeIn(compiler, method, """{ 215 analyzeIn(compiler, method, """{
216 for (var e in new HasNoIterator()) {} 216 for (var e in new HasNoIterator()) {}
217 }""", warnings: MessageKind.MEMBER_NOT_FOUND); 217 }""", warnings: MessageKind.UNDEFINED_GETTER);
218 analyzeIn(compiler, method, """{ 218 analyzeIn(compiler, method, """{
219 for (String e in new HasNoIterator()) {} 219 for (String e in new HasNoIterator()) {}
220 }""", warnings: MessageKind.MEMBER_NOT_FOUND); 220 }""", warnings: MessageKind.UNDEFINED_GETTER);
221 analyzeIn(compiler, method, """{ 221 analyzeIn(compiler, method, """{
222 for (int e in new HasNoIterator()) {} 222 for (int e in new HasNoIterator()) {}
223 }""", warnings: MessageKind.MEMBER_NOT_FOUND); 223 }""", warnings: MessageKind.UNDEFINED_GETTER);
224 224
225 analyzeIn(compiler, method, """{ 225 analyzeIn(compiler, method, """{
226 for (var e in new HasCustomIntIterator()) {} 226 for (var e in new HasCustomIntIterator()) {}
227 }"""); 227 }""");
228 analyzeIn(compiler, method, """{ 228 analyzeIn(compiler, method, """{
229 for (String e in new HasCustomIntIterator()) {} 229 for (String e in new HasCustomIntIterator()) {}
230 }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE); 230 }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
231 analyzeIn(compiler, method, """{ 231 analyzeIn(compiler, method, """{
232 for (int e in new HasCustomIntIterator()) {} 232 for (int e in new HasCustomIntIterator()) {}
233 }"""); 233 }""");
234 234
235 analyzeIn(compiler, method, """{ 235 analyzeIn(compiler, method, """{
236 for (var e in new HasCustomNoCurrentIterator()) {} 236 for (var e in new HasCustomNoCurrentIterator()) {}
237 }""", hints: MessageKind.MEMBER_NOT_FOUND); 237 }""", hints: MessageKind.UNDEFINED_GETTER);
238 analyzeIn(compiler, method, """{ 238 analyzeIn(compiler, method, """{
239 for (String e in new HasCustomNoCurrentIterator()) {} 239 for (String e in new HasCustomNoCurrentIterator()) {}
240 }""", hints: MessageKind.MEMBER_NOT_FOUND); 240 }""", hints: MessageKind.UNDEFINED_GETTER);
241 analyzeIn(compiler, method, """{ 241 analyzeIn(compiler, method, """{
242 for (int e in new HasCustomNoCurrentIterator()) {} 242 for (int e in new HasCustomNoCurrentIterator()) {}
243 }""", hints: MessageKind.MEMBER_NOT_FOUND); 243 }""", hints: MessageKind.UNDEFINED_GETTER);
244 244
245 analyzeIn(compiler, method, """{ 245 analyzeIn(compiler, method, """{
246 var localDyn; 246 var localDyn;
247 for (localDyn in <String>[]) {} 247 for (localDyn in <String>[]) {}
248 }"""); 248 }""");
249 analyzeIn(compiler, method, """{ 249 analyzeIn(compiler, method, """{
250 String localString; 250 String localString;
251 for (localString in <String>[]) {} 251 for (localString in <String>[]) {}
252 }"""); 252 }""");
253 analyzeIn(compiler, method, """{ 253 analyzeIn(compiler, method, """{
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 check(String code, {warnings}) { 566 check(String code, {warnings}) {
567 analyze(compiler, code, warnings: warnings); 567 analyze(compiler, code, warnings: warnings);
568 } 568 }
569 569
570 // TODO(karlklose): add the DartC tests for operators when we can parse 570 // TODO(karlklose): add the DartC tests for operators when we can parse
571 // classes with operators. 571 // classes with operators.
572 for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) { 572 for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) {
573 check("{ var i = 1 ${op} 2; }"); 573 check("{ var i = 1 ${op} 2; }");
574 check("{ var i = 1; i ${op}= 2; }"); 574 check("{ var i = 1; i ${op}= 2; }");
575 check("{ int i; var j = (i = true) ${op} 2; }", 575 check("{ int i; var j = (i = true) ${op} 2; }",
576 warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]); 576 warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
577 check("{ int i; var j = 1 ${op} (i = true); }", 577 check("{ int i; var j = 1 ${op} (i = true); }",
578 warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]); 578 warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
579 } 579 }
580 for (final op in ['-', '~']) { 580 for (final op in ['-', '~']) {
581 check("{ var i = ${op}1; }"); 581 check("{ var i = ${op}1; }");
582 check("{ int i; var j = ${op}(i = true); }", 582 check("{ int i; var j = ${op}(i = true); }",
583 warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]); 583 warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
584 } 584 }
585 for (final op in ['++', '--']) { 585 for (final op in ['++', '--']) {
586 check("{ int i = 1; int j = i${op}; }"); 586 check("{ int i = 1; int j = i${op}; }");
587 check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE); 587 check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
588 check("{ bool b = true; bool j = b${op}; }", 588 check("{ bool b = true; bool j = b${op}; }",
589 warnings: MessageKind.OPERATOR_NOT_FOUND); 589 warnings: MessageKind.UNDEFINED_OPERATOR);
590 check("{ bool b = true; int j = ${op}b; }", 590 check("{ bool b = true; int j = ${op}b; }",
591 warnings: MessageKind.OPERATOR_NOT_FOUND); 591 warnings: MessageKind.UNDEFINED_OPERATOR);
592 } 592 }
593 for (final op in ['||', '&&']) { 593 for (final op in ['||', '&&']) {
594 check("{ bool b = (true ${op} false); }"); 594 check("{ bool b = (true ${op} false); }");
595 check("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE); 595 check("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
596 check("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE); 596 check("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
597 check("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE); 597 check("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
598 } 598 }
599 for (final op in ['>', '<', '<=', '>=']) { 599 for (final op in ['>', '<', '<=', '>=']) {
600 check("{ bool b = 1 ${op} 2; }"); 600 check("{ bool b = 1 ${op} 2; }");
601 check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE); 601 check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
602 check("{ int i; bool b = (i = true) ${op} 2; }", 602 check("{ int i; bool b = (i = true) ${op} 2; }",
603 warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]); 603 warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
604 check("{ int i; bool b = 1 ${op} (i = true); }", 604 check("{ int i; bool b = 1 ${op} (i = true); }",
605 warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]); 605 warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
606 } 606 }
607 for (final op in ['==', '!=']) { 607 for (final op in ['==', '!=']) {
608 check("{ bool b = 1 ${op} 2; }"); 608 check("{ bool b = 1 ${op} 2; }");
609 check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE); 609 check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
610 check("{ int i; bool b = (i = true) ${op} 2; }", 610 check("{ int i; bool b = (i = true) ${op} 2; }",
611 warnings: NOT_ASSIGNABLE); 611 warnings: NOT_ASSIGNABLE);
612 check("{ int i; bool b = 1 ${op} (i = true); }", 612 check("{ int i; bool b = 1 ${op} (i = true); }",
613 warnings: NOT_ASSIGNABLE); 613 warnings: NOT_ASSIGNABLE);
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 check(c, "localMethod();", MessageKind.MISSING_ARGUMENT); 998 check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
999 check(c, "localMethod(1);", NOT_ASSIGNABLE); 999 check(c, "localMethod(1);", NOT_ASSIGNABLE);
1000 check(c, "localMethod('string');"); 1000 check(c, "localMethod('string');");
1001 check(c, "int k = localMethod('string');"); 1001 check(c, "int k = localMethod('string');");
1002 check(c, "String k = localMethod('string');", NOT_ASSIGNABLE); 1002 check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
1003 1003
1004 // Invocation on parenthesized expressions. 1004 // Invocation on parenthesized expressions.
1005 check(c, "(e)();"); 1005 check(c, "(e)();");
1006 check(c, "(e)(1);"); 1006 check(c, "(e)(1);");
1007 check(c, "(e)('string');"); 1007 check(c, "(e)('string');");
1008 check(c, "(foo)();", MEMBER_NOT_FOUND); 1008 check(c, "(foo)();", UNDEFINED_GETTER);
1009 check(c, "(foo)(1);", MEMBER_NOT_FOUND); 1009 check(c, "(foo)(1);", UNDEFINED_GETTER);
1010 check(c, "(foo)('string');", MEMBER_NOT_FOUND); 1010 check(c, "(foo)('string');", UNDEFINED_GETTER);
1011 1011
1012 // Invocations on function expressions. 1012 // Invocations on function expressions.
1013 check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT); 1013 check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
1014 check(c, "(foo){}(1);"); 1014 check(c, "(foo){}(1);");
1015 check(c, "(foo){}('string');"); 1015 check(c, "(foo){}('string');");
1016 check(c, "(int foo){}('string');", NOT_ASSIGNABLE); 1016 check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
1017 check(c, "(String foo){}('string');"); 1017 check(c, "(String foo){}('string');");
1018 check(c, "int k = int bar(String foo){ return 0; }('string');"); 1018 check(c, "int k = int bar(String foo){ return 0; }('string');");
1019 check(c, "int k = String bar(String foo){ return foo; }('string');", 1019 check(c, "int k = String bar(String foo){ return foo; }('string');",
1020 NOT_ASSIGNABLE); 1020 NOT_ASSIGNABLE);
1021 1021
1022 // Static invocations. 1022 // Static invocations.
1023 check(c, "staticMethod();", 1023 check(c, "staticMethod();",
1024 MessageKind.MISSING_ARGUMENT); 1024 MessageKind.MISSING_ARGUMENT);
1025 check(c, "staticMethod(1);", 1025 check(c, "staticMethod(1);",
1026 NOT_ASSIGNABLE); 1026 NOT_ASSIGNABLE);
1027 check(c, "staticMethod('string');"); 1027 check(c, "staticMethod('string');");
1028 check(c, "int k = staticMethod('string');"); 1028 check(c, "int k = staticMethod('string');");
1029 check(c, "String k = staticMethod('string');", 1029 check(c, "String k = staticMethod('string');",
1030 NOT_ASSIGNABLE); 1030 NOT_ASSIGNABLE);
1031 check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND); 1031 check(d, "staticMethod();", MessageKind.UNDEFINED_METHOD);
1032 check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND); 1032 check(d, "staticMethod(1);", MessageKind.UNDEFINED_METHOD);
1033 check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND); 1033 check(d, "staticMethod('string');", MessageKind.UNDEFINED_METHOD);
1034 check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND); 1034 check(d, "int k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
1035 check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND) ; 1035 check(d, "String k = staticMethod('string');", MessageKind.UNDEFINED_METHOD) ;
1036 1036
1037 // Invocation on dynamic variable. 1037 // Invocation on dynamic variable.
1038 check(c, "e.foo();"); 1038 check(c, "e.foo();");
1039 check(c, "e.foo(1);"); 1039 check(c, "e.foo(1);");
1040 check(c, "e.foo('string');"); 1040 check(c, "e.foo('string');");
1041 1041
1042 // Invocation on unresolved variable. 1042 // Invocation on unresolved variable.
1043 check(c, "foo();", MessageKind.METHOD_NOT_FOUND); 1043 check(c, "foo();", MessageKind.UNDEFINED_METHOD);
1044 check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND); 1044 check(c, "foo(1);", MessageKind.UNDEFINED_METHOD);
1045 check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND); 1045 check(c, "foo('string');", MessageKind.UNDEFINED_METHOD);
1046 check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND); 1046 check(c, "foo(a: 'string');", MessageKind.UNDEFINED_METHOD);
1047 check(c, "foo(a: localMethod(1));", 1047 check(c, "foo(a: localMethod(1));",
1048 [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]); 1048 [MessageKind.UNDEFINED_METHOD, NOT_ASSIGNABLE]);
1049 }); 1049 });
1050 } 1050 }
1051 1051
1052 void testFunctionCall(MockCompiler compiler) { 1052 void testFunctionCall(MockCompiler compiler) {
1053 compiler.parseScript(CLASS_WITH_METHODS); 1053 compiler.parseScript(CLASS_WITH_METHODS);
1054 1054
1055 check(String text, [expectedWarnings]){ 1055 check(String text, [expectedWarnings]){
1056 analyze(compiler, 1056 analyze(compiler,
1057 """{ 1057 """{
1058 ClassWithMethods x; 1058 ClassWithMethods x;
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
1519 compiler.parseScript(script); 1519 compiler.parseScript(script);
1520 ClassElement foo = compiler.mainApp.find("Foo"); 1520 ClassElement foo = compiler.mainApp.find("Foo");
1521 foo.ensureResolved(compiler.resolution); 1521 foo.ensureResolved(compiler.resolution);
1522 Element method = foo.lookupLocalMember('method'); 1522 Element method = foo.lookupLocalMember('method');
1523 1523
1524 analyzeIn(compiler, method, "{ Type type = T; }"); 1524 analyzeIn(compiler, method, "{ Type type = T; }");
1525 analyzeIn(compiler, method, "{ T type = T; }", warnings: NOT_ASSIGNABLE); 1525 analyzeIn(compiler, method, "{ T type = T; }", warnings: NOT_ASSIGNABLE);
1526 analyzeIn(compiler, method, "{ int type = T; }", warnings: NOT_ASSIGNABLE); 1526 analyzeIn(compiler, method, "{ int type = T; }", warnings: NOT_ASSIGNABLE);
1527 1527
1528 analyzeIn(compiler, method, "{ String typeName = T.toString(); }"); 1528 analyzeIn(compiler, method, "{ String typeName = T.toString(); }");
1529 analyzeIn(compiler, method, "{ T.foo; }", warnings: MEMBER_NOT_FOUND); 1529 analyzeIn(compiler, method, "{ T.foo; }", warnings: UNDEFINED_GETTER);
1530 analyzeIn(compiler, method, "{ T.foo = 0; }", 1530 analyzeIn(compiler, method, "{ T.foo = 0; }",
1531 warnings: MessageKind.SETTER_NOT_FOUND); 1531 warnings: MessageKind.UNDEFINED_SETTER);
1532 analyzeIn(compiler, method, "{ T.foo(); }", 1532 analyzeIn(compiler, method, "{ T.foo(); }",
1533 warnings: MessageKind.METHOD_NOT_FOUND); 1533 warnings: MessageKind.UNDEFINED_METHOD);
1534 analyzeIn(compiler, method, "{ T + 1; }", 1534 analyzeIn(compiler, method, "{ T + 1; }",
1535 warnings: MessageKind.OPERATOR_NOT_FOUND); 1535 warnings: MessageKind.UNDEFINED_OPERATOR);
1536 } 1536 }
1537 1537
1538 void testTypeVariableLookup1(MockCompiler compiler) { 1538 void testTypeVariableLookup1(MockCompiler compiler) {
1539 String script = """ 1539 String script = """
1540 class Foo { 1540 class Foo {
1541 int field; 1541 int field;
1542 void method(int argument) {} 1542 void method(int argument) {}
1543 int operator +(Foo foo) {} 1543 int operator +(Foo foo) {}
1544 int get getter => 21; 1544 int get getter => 21;
1545 } 1545 }
(...skipping 13 matching lines...) Expand all
1559 test(String expression, [message]) { 1559 test(String expression, [message]) {
1560 analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message); 1560 analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message);
1561 } 1561 }
1562 1562
1563 test('s.field'); 1563 test('s.field');
1564 test('s.method(1)'); 1564 test('s.method(1)');
1565 test('s + s'); 1565 test('s + s');
1566 test('s.getter'); 1566 test('s.getter');
1567 1567
1568 test('t.toString'); 1568 test('t.toString');
1569 test('t.field', MEMBER_NOT_FOUND); 1569 test('t.field', UNDEFINED_GETTER);
1570 test('t.method(1)', MessageKind.METHOD_NOT_FOUND); 1570 test('t.method(1)', MessageKind.UNDEFINED_METHOD);
1571 test('t + t', MessageKind.OPERATOR_NOT_FOUND); 1571 test('t + t', MessageKind.UNDEFINED_OPERATOR);
1572 test('t.getter', MEMBER_NOT_FOUND); 1572 test('t.getter', UNDEFINED_GETTER);
1573 1573
1574 test('s.field = "hest"', NOT_ASSIGNABLE); 1574 test('s.field = "hest"', NOT_ASSIGNABLE);
1575 test('s.method("hest")', NOT_ASSIGNABLE); 1575 test('s.method("hest")', NOT_ASSIGNABLE);
1576 test('s + "hest"', NOT_ASSIGNABLE); 1576 test('s + "hest"', NOT_ASSIGNABLE);
1577 test('String v = s.getter', NOT_ASSIGNABLE); 1577 test('String v = s.getter', NOT_ASSIGNABLE);
1578 } 1578 }
1579 1579
1580 void testTypeVariableLookup2(MockCompiler compiler) { 1580 void testTypeVariableLookup2(MockCompiler compiler) {
1581 String script = """ 1581 String script = """
1582 class Foo { 1582 class Foo {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 compiler.parseScript(script); 1616 compiler.parseScript(script);
1617 ClassElement classTest = compiler.mainApp.find("Test"); 1617 ClassElement classTest = compiler.mainApp.find("Test");
1618 classTest.ensureResolved(compiler.resolution); 1618 classTest.ensureResolved(compiler.resolution);
1619 FunctionElement methodTest = classTest.lookupLocalMember("test"); 1619 FunctionElement methodTest = classTest.lookupLocalMember("test");
1620 1620
1621 test(String expression, [message]) { 1621 test(String expression, [message]) {
1622 analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message); 1622 analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message);
1623 } 1623 }
1624 1624
1625 test('s.toString'); 1625 test('s.toString');
1626 test('s.field', MEMBER_NOT_FOUND); 1626 test('s.field', UNDEFINED_GETTER);
1627 test('s.method(1)', MessageKind.METHOD_NOT_FOUND); 1627 test('s.method(1)', MessageKind.UNDEFINED_METHOD);
1628 test('s + s', MessageKind.OPERATOR_NOT_FOUND); 1628 test('s + s', MessageKind.UNDEFINED_OPERATOR);
1629 test('s.getter', MEMBER_NOT_FOUND); 1629 test('s.getter', UNDEFINED_GETTER);
1630 } 1630 }
1631 1631
1632 void testFunctionTypeLookup(MockCompiler compiler) { 1632 void testFunctionTypeLookup(MockCompiler compiler) {
1633 check(String code, {warnings}) { 1633 check(String code, {warnings}) {
1634 analyze(compiler, code, warnings: warnings); 1634 analyze(compiler, code, warnings: warnings);
1635 } 1635 }
1636 1636
1637 check('(int f(int)) => f.toString;'); 1637 check('(int f(int)) => f.toString;');
1638 check('(int f(int)) => f.toString();'); 1638 check('(int f(int)) => f.toString();');
1639 check('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND); 1639 check('(int f(int)) => f.foo;', warnings: UNDEFINED_GETTER);
1640 check('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND); 1640 check('(int f(int)) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
1641 } 1641 }
1642 1642
1643 void testTypedefLookup(MockCompiler compiler) { 1643 void testTypedefLookup(MockCompiler compiler) {
1644 check(String code, {warnings}) { 1644 check(String code, {warnings}) {
1645 analyze(compiler, code, warnings: warnings); 1645 analyze(compiler, code, warnings: warnings);
1646 } 1646 }
1647 1647
1648 compiler.parseScript("typedef int F(int);"); 1648 compiler.parseScript("typedef int F(int);");
1649 check('(F f) => f.toString;'); 1649 check('(F f) => f.toString;');
1650 check('(F f) => f.toString();'); 1650 check('(F f) => f.toString();');
1651 check('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND); 1651 check('(F f) => f.foo;', warnings: UNDEFINED_GETTER);
1652 check('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND); 1652 check('(F f) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
1653 } 1653 }
1654 1654
1655 void testTypeLiteral(MockCompiler compiler) { 1655 void testTypeLiteral(MockCompiler compiler) {
1656 check(String code, {warnings}) { 1656 check(String code, {warnings}) {
1657 analyze(compiler, code, warnings: warnings); 1657 analyze(compiler, code, warnings: warnings);
1658 } 1658 }
1659 1659
1660 final String source = r"""class Class { 1660 final String source = r"""class Class {
1661 static var field = null; 1661 static var field = null;
1662 static method() {} 1662 static method() {}
(...skipping 13 matching lines...) Expand all
1676 // Check access as argument. 1676 // Check access as argument.
1677 check('m(Type val) => m(int);'); 1677 check('m(Type val) => m(int);');
1678 check('m(int val) => m(int);', warnings: NOT_ASSIGNABLE); 1678 check('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
1679 1679
1680 // Check access as argument in member access. 1680 // Check access as argument in member access.
1681 check('m(Type val) => m(int).foo;'); 1681 check('m(Type val) => m(int).foo;');
1682 check('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE); 1682 check('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
1683 1683
1684 // Check static property access. 1684 // Check static property access.
1685 check('m() => Class.field;'); 1685 check('m() => Class.field;');
1686 check('m() => (Class).field;', warnings: MEMBER_NOT_FOUND); 1686 check('m() => (Class).field;', warnings: UNDEFINED_GETTER);
1687 1687
1688 // Check static method access. 1688 // Check static method access.
1689 check('m() => Class.method();'); 1689 check('m() => Class.method();');
1690 check('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND); 1690 check('m() => (Class).method();', warnings: MessageKind.UNDEFINED_METHOD);
1691 1691
1692 // Check access in invocation. 1692 // Check access in invocation.
1693 check('m() => Class();', warnings: MessageKind.NOT_CALLABLE); 1693 check('m() => Class();', warnings: MessageKind.NOT_CALLABLE);
1694 check('m() => dynamic();', warnings: MessageKind.NOT_CALLABLE); 1694 check('m() => dynamic();', warnings: MessageKind.NOT_CALLABLE);
1695 } 1695 }
1696 1696
1697 Future testInitializers(MockCompiler compiler) { 1697 Future testInitializers(MockCompiler compiler) {
1698 Future check(String text, [expectedWarnings]) { 1698 Future check(String text, [expectedWarnings]) {
1699 return analyzeTopLevel(text, expectedWarnings); 1699 return analyzeTopLevel(text, expectedWarnings);
1700 } 1700 }
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 check("Class.staticField += 0;", NOT_ASSIGNABLE); 1949 check("Class.staticField += 0;", NOT_ASSIGNABLE);
1950 // String is not assignable to int (the argument type of the operator + on the 1950 // String is not assignable to int (the argument type of the operator + on the
1951 // getter) and num (the result type of the operation) is not assignable to 1951 // getter) and num (the result type of the operation) is not assignable to
1952 // String (the type of the setter). 1952 // String (the type of the setter).
1953 check("Class.staticField += '';", 1953 check("Class.staticField += '';",
1954 [NOT_ASSIGNABLE, NOT_ASSIGNABLE]); 1954 [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
1955 1955
1956 check("int v = c.overriddenField;"); 1956 check("int v = c.overriddenField;");
1957 check("c.overriddenField = 0;"); 1957 check("c.overriddenField = 0;");
1958 check("int v = c.getterField;"); 1958 check("int v = c.getterField;");
1959 check("c.getterField = 0;", MessageKind.SETTER_NOT_FOUND); 1959 check("c.getterField = 0;", MessageKind.UNDEFINED_SETTER);
1960 check("int v = c.setterField;", MessageKind.GETTER_NOT_FOUND); 1960 check("int v = c.setterField;",
1961 MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
1961 check("c.setterField = 0;"); 1962 check("c.setterField = 0;");
1962 1963
1963 check("int v = gc.overriddenField;"); 1964 check("int v = gc.overriddenField;");
1964 check("gc.overriddenField = 0;"); 1965 check("gc.overriddenField = 0;");
1965 check("int v = gc.setterField;"); 1966 check("int v = gc.setterField;");
1966 check("gc.setterField = 0;"); 1967 check("gc.setterField = 0;");
1967 check("int v = gc.getterField;"); 1968 check("int v = gc.getterField;");
1968 check("gc.getterField = 0;", MessageKind.SETTER_NOT_FOUND); 1969 check("gc.getterField = 0;", MessageKind.UNDEFINED_SETTER);
1969 1970
1970 check("int v = sc.overriddenField;"); 1971 check("int v = sc.overriddenField;");
1971 check("sc.overriddenField = 0;"); 1972 check("sc.overriddenField = 0;");
1972 check("int v = sc.getterField;"); 1973 check("int v = sc.getterField;");
1973 check("sc.getterField = 0;"); 1974 check("sc.getterField = 0;");
1974 check("int v = sc.setterField;", MessageKind.GETTER_NOT_FOUND); 1975 check("int v = sc.setterField;",
1976 MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
1975 check("sc.setterField = 0;"); 1977 check("sc.setterField = 0;");
1976 } 1978 }
1977 1979
1978 testTypePromotionHints(MockCompiler compiler) { 1980 testTypePromotionHints(MockCompiler compiler) {
1979 compiler.parseScript(r'''class A { 1981 compiler.parseScript(r'''class A {
1980 var a = "a"; 1982 var a = "a";
1981 } 1983 }
1982 class B extends A { 1984 class B extends A {
1983 var b = "b"; 1985 var b = "b";
1984 } 1986 }
(...skipping 20 matching lines...) Expand all
2005 warnings: warnings, 2007 warnings: warnings,
2006 hints: hints, 2008 hints: hints,
2007 infos: infos); 2009 infos: infos);
2008 } 2010 }
2009 2011
2010 check(r''' 2012 check(r'''
2011 A a = new B(); 2013 A a = new B();
2012 if (a is C) { 2014 if (a is C) {
2013 var x = a.c; 2015 var x = a.c;
2014 }''', 2016 }''',
2015 warnings: [MessageKind.MEMBER_NOT_FOUND], 2017 warnings: [MessageKind.UNDEFINED_GETTER],
2016 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], 2018 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
2017 infos: []); 2019 infos: []);
2018 2020
2019 check(r''' 2021 check(r'''
2020 A a = new B(); 2022 A a = new B();
2021 if (a is C) { 2023 if (a is C) {
2022 var x = '${a.c}${a.c}'; 2024 var x = '${a.c}${a.c}';
2023 }''', 2025 }''',
2024 warnings: [MessageKind.MEMBER_NOT_FOUND, 2026 warnings: [MessageKind.UNDEFINED_GETTER,
2025 MessageKind.MEMBER_NOT_FOUND], 2027 MessageKind.UNDEFINED_GETTER],
2026 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], 2028 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
2027 infos: []); 2029 infos: []);
2028 2030
2029 check(r''' 2031 check(r'''
2030 A a = new B(); 2032 A a = new B();
2031 if (a is C) { 2033 if (a is C) {
2032 var x = '${a.d}${a.d}'; // Type promotion wouldn't help. 2034 var x = '${a.d}${a.d}'; // Type promotion wouldn't help.
2033 }''', 2035 }''',
2034 warnings: [MessageKind.MEMBER_NOT_FOUND, 2036 warnings: [MessageKind.UNDEFINED_GETTER,
2035 MessageKind.MEMBER_NOT_FOUND], 2037 MessageKind.UNDEFINED_GETTER],
2036 hints: [], 2038 hints: [],
2037 infos: []); 2039 infos: []);
2038 2040
2039 check(''' 2041 check('''
2040 D<int> d = new E(); 2042 D<int> d = new E();
2041 if (d is E) { // Suggest E<int>. 2043 if (d is E) { // Suggest E<int>.
2042 var x = d.e; 2044 var x = d.e;
2043 }''', 2045 }''',
2044 warnings: [MessageKind.MEMBER_NOT_FOUND], 2046 warnings: [MessageKind.UNDEFINED_GETTER],
2045 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, 2047 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
2046 {'shownTypeSuggestion': 'E<int>'})], 2048 {'shownTypeSuggestion': 'E<int>'})],
2047 infos: []); 2049 infos: []);
2048 2050
2049 check(''' 2051 check('''
2050 D<int> d = new F(); 2052 D<int> d = new F();
2051 if (d is F) { // Suggest F<int, dynamic>. 2053 if (d is F) { // Suggest F<int, dynamic>.
2052 var x = d.f; 2054 var x = d.f;
2053 }''', 2055 }''',
2054 warnings: [MessageKind.MEMBER_NOT_FOUND], 2056 warnings: [MessageKind.UNDEFINED_GETTER],
2055 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, 2057 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
2056 {'shownTypeSuggestion': 'F<int, dynamic>'})], 2058 {'shownTypeSuggestion': 'F<int, dynamic>'})],
2057 infos: []); 2059 infos: []);
2058 2060
2059 check(''' 2061 check('''
2060 D<int> d = new G(); 2062 D<int> d = new G();
2061 if (d is G) { // Suggest G<int>. 2063 if (d is G) { // Suggest G<int>.
2062 var x = d.f; 2064 var x = d.f;
2063 }''', 2065 }''',
2064 warnings: [MessageKind.MEMBER_NOT_FOUND], 2066 warnings: [MessageKind.UNDEFINED_GETTER],
2065 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, 2067 hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
2066 {'shownTypeSuggestion': 'G<int>'})], 2068 {'shownTypeSuggestion': 'G<int>'})],
2067 infos: []); 2069 infos: []);
2068 2070
2069 check(''' 2071 check('''
2070 F<double, int> f = new G(); 2072 F<double, int> f = new G();
2071 if (f is G) { // Cannot suggest a more specific type. 2073 if (f is G) { // Cannot suggest a more specific type.
2072 var x = f.g; 2074 var x = f.g;
2073 }''', 2075 }''',
2074 warnings: [MessageKind.MEMBER_NOT_FOUND], 2076 warnings: [MessageKind.UNDEFINED_GETTER],
2075 hints: [MessageKind.NOT_MORE_SPECIFIC], 2077 hints: [MessageKind.NOT_MORE_SPECIFIC],
2076 infos: []); 2078 infos: []);
2077 2079
2078 check(''' 2080 check('''
2079 D<int> d = new E(); 2081 D<int> d = new E();
2080 if (d is E) { 2082 if (d is E) {
2081 var x = d.f; // Type promotion wouldn't help. 2083 var x = d.f; // Type promotion wouldn't help.
2082 }''', 2084 }''',
2083 warnings: [MessageKind.MEMBER_NOT_FOUND], 2085 warnings: [MessageKind.UNDEFINED_GETTER],
2084 hints: [], 2086 hints: [],
2085 infos: []); 2087 infos: []);
2086 2088
2087 check(''' 2089 check('''
2088 A a = new B(); 2090 A a = new B();
2089 if (a is B) { 2091 if (a is B) {
2090 a = null; 2092 a = null;
2091 var x = a.b; 2093 var x = a.b;
2092 }''', 2094 }''',
2093 warnings: [MessageKind.MEMBER_NOT_FOUND], 2095 warnings: [MessageKind.UNDEFINED_GETTER],
2094 hints: [MessageKind.POTENTIAL_MUTATION], 2096 hints: [MessageKind.POTENTIAL_MUTATION],
2095 infos: [MessageKind.POTENTIAL_MUTATION_HERE]); 2097 infos: [MessageKind.POTENTIAL_MUTATION_HERE]);
2096 2098
2097 check(''' 2099 check('''
2098 A a = new B(); 2100 A a = new B();
2099 if (a is B) { 2101 if (a is B) {
2100 a = null; 2102 a = null;
2101 var x = a.c; // Type promotion wouldn't help. 2103 var x = a.c; // Type promotion wouldn't help.
2102 }''', 2104 }''',
2103 warnings: [MessageKind.MEMBER_NOT_FOUND], 2105 warnings: [MessageKind.UNDEFINED_GETTER],
2104 hints: [], 2106 hints: [],
2105 infos: []); 2107 infos: []);
2106 2108
2107 check(''' 2109 check('''
2108 A a = new B(); 2110 A a = new B();
2109 local() { a = new A(); } 2111 local() { a = new A(); }
2110 if (a is B) { 2112 if (a is B) {
2111 var x = a.b; 2113 var x = a.b;
2112 }''', 2114 }''',
2113 warnings: [MessageKind.MEMBER_NOT_FOUND], 2115 warnings: [MessageKind.UNDEFINED_GETTER],
2114 hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE], 2116 hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE],
2115 infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]); 2117 infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]);
2116 2118
2117 check(''' 2119 check('''
2118 A a = new B(); 2120 A a = new B();
2119 local() { a = new A(); } 2121 local() { a = new A(); }
2120 if (a is B) { 2122 if (a is B) {
2121 var x = a.c; // Type promotion wouldn't help. 2123 var x = a.c; // Type promotion wouldn't help.
2122 }''', 2124 }''',
2123 warnings: [MessageKind.MEMBER_NOT_FOUND], 2125 warnings: [MessageKind.UNDEFINED_GETTER],
2124 hints: [], 2126 hints: [],
2125 infos: []); 2127 infos: []);
2126 2128
2127 check(''' 2129 check('''
2128 A a = new B(); 2130 A a = new B();
2129 if (a is B) { 2131 if (a is B) {
2130 var x = () => a; 2132 var x = () => a;
2131 var y = a.b; 2133 var y = a.b;
2132 } 2134 }
2133 a = new A();''', 2135 a = new A();''',
2134 warnings: [MessageKind.MEMBER_NOT_FOUND], 2136 warnings: [MessageKind.UNDEFINED_GETTER],
2135 hints: [MessageKind.ACCESSED_IN_CLOSURE], 2137 hints: [MessageKind.ACCESSED_IN_CLOSURE],
2136 infos: [MessageKind.ACCESSED_IN_CLOSURE_HERE, 2138 infos: [MessageKind.ACCESSED_IN_CLOSURE_HERE,
2137 MessageKind.POTENTIAL_MUTATION_HERE]); 2139 MessageKind.POTENTIAL_MUTATION_HERE]);
2138 2140
2139 check(''' 2141 check('''
2140 A a = new B(); 2142 A a = new B();
2141 if (a is B) { 2143 if (a is B) {
2142 var x = () => a; 2144 var x = () => a;
2143 var y = a.c; // Type promotion wouldn't help. 2145 var y = a.c; // Type promotion wouldn't help.
2144 } 2146 }
2145 a = new A();''', 2147 a = new A();''',
2146 warnings: [MessageKind.MEMBER_NOT_FOUND], 2148 warnings: [MessageKind.UNDEFINED_GETTER],
2147 hints: [], 2149 hints: [],
2148 infos: []); 2150 infos: []);
2149 } 2151 }
2150 2152
2151 void testCascade(MockCompiler compiler) { 2153 void testCascade(MockCompiler compiler) {
2152 compiler.parseScript(r'''typedef A AFunc(); 2154 compiler.parseScript(r'''typedef A AFunc();
2153 typedef Function FuncFunc(); 2155 typedef Function FuncFunc();
2154 class A { 2156 class A {
2155 A a; 2157 A a;
2156 B b; 2158 B b;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2190 warnings: NOT_ASSIGNABLE); 2192 warnings: NOT_ASSIGNABLE);
2191 2193
2192 check('B b = new A()..b;', 2194 check('B b = new A()..b;',
2193 warnings: NOT_ASSIGNABLE); 2195 warnings: NOT_ASSIGNABLE);
2194 2196
2195 check('B b = new A().b;'); 2197 check('B b = new A().b;');
2196 2198
2197 check('new A().b..b;'); 2199 check('new A().b..b;');
2198 2200
2199 check('new A().b..a;', 2201 check('new A().b..a;',
2200 warnings: MEMBER_NOT_FOUND); 2202 warnings: UNDEFINED_GETTER);
2201 2203
2202 check('B b = new A().b..c;'); 2204 check('B b = new A().b..c;');
2203 2205
2204 check('C c = new A().b..c;', 2206 check('C c = new A().b..c;',
2205 warnings: NOT_ASSIGNABLE); 2207 warnings: NOT_ASSIGNABLE);
2206 2208
2207 check('A a = new A()..a = new A();'); 2209 check('A a = new A()..a = new A();');
2208 2210
2209 check('A a = new A()..b = new B();'); 2211 check('A a = new A()..b = new B();');
2210 2212
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
2606 TreeElements elements = compiler.resolveNodeStatement(node, element); 2608 TreeElements elements = compiler.resolveNodeStatement(node, element);
2607 TypeCheckerVisitor checker = new TypeCheckerVisitor( 2609 TypeCheckerVisitor checker = new TypeCheckerVisitor(
2608 compiler, elements, compiler.types); 2610 compiler, elements, compiler.types);
2609 DiagnosticCollector collector = compiler.diagnosticCollector; 2611 DiagnosticCollector collector = compiler.diagnosticCollector;
2610 collector.clear(); 2612 collector.clear();
2611 checker.analyze(node); 2613 checker.analyze(node);
2612 generateOutput(compiler, text); 2614 generateOutput(compiler, text);
2613 compareWarningKinds(text, warnings, collector.warnings); 2615 compareWarningKinds(text, warnings, collector.warnings);
2614 compareWarningKinds(text, hints, collector.hints); 2616 compareWarningKinds(text, hints, collector.hints);
2615 } 2617 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698