| 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 d471cf172fdd353a3b8c5c0f26e32344c60d7476..0ac90d1221440b8ecb0dca375acc38e66520d28f 100644
|
| --- a/tests/compiler/dart2js/type_checker_test.dart
|
| +++ b/tests/compiler/dart2js/type_checker_test.dart
|
| @@ -10,15 +10,11 @@ import 'package:expect/expect.dart';
|
| import 'package:compiler/src/dart_types.dart';
|
| import 'package:compiler/src/diagnostics/messages.dart';
|
| import 'package:compiler/src/elements/elements.dart';
|
| -import 'package:compiler/src/elements/modelx.dart' show
|
| - ClassElementX,
|
| - CompilationUnitElementX,
|
| - ElementX,
|
| - FunctionElementX;
|
| +import 'package:compiler/src/elements/modelx.dart'
|
| + show ClassElementX, CompilationUnitElementX, ElementX, FunctionElementX;
|
| import 'package:compiler/src/io/source_file.dart';
|
| -import 'package:compiler/src/resolution/tree_elements.dart' show
|
| - TreeElements,
|
| - TreeElementMapping;
|
| +import 'package:compiler/src/resolution/tree_elements.dart'
|
| + show TreeElements, TreeElementMapping;
|
| import 'package:compiler/src/parser/element_listener.dart';
|
| import 'package:compiler/src/tree/tree.dart';
|
| import 'package:compiler/src/typechecker.dart';
|
| @@ -33,42 +29,44 @@ final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
|
| final MessageKind UNDEFINED_GETTER = MessageKind.UNDEFINED_GETTER;
|
|
|
| main() {
|
| - List tests = [testSimpleTypes,
|
| - testReturn,
|
| - testFor,
|
| - testSyncForIn,
|
| - testAsyncForIn,
|
| - testWhile,
|
| - testTry,
|
| - testSwitch,
|
| - testEnumSwitch,
|
| - testOperators,
|
| - testConstructorInvocationArgumentCount,
|
| - testConstructorInvocationArgumentTypes,
|
| - testMethodInvocationArgumentCount,
|
| - testMethodInvocations,
|
| - testMethodInvocationsInClass,
|
| - testGetterSetterInvocation,
|
| - // testNewExpression,
|
| - testConditionalExpression,
|
| - testIfStatement,
|
| - testThis,
|
| - testSuper,
|
| - testOperatorsAssignability,
|
| - testFieldInitializers,
|
| - testTypeVariableExpressions,
|
| - testTypeVariableLookup1,
|
| - testTypeVariableLookup2,
|
| - testTypeVariableLookup3,
|
| - testFunctionTypeLookup,
|
| - testTypedefLookup,
|
| - testTypeLiteral,
|
| - testInitializers,
|
| - testTypePromotionHints,
|
| - testFunctionCall,
|
| - testCascade,
|
| - testAwait,
|
| - testAsyncReturn];
|
| + List tests = [
|
| + testSimpleTypes,
|
| + testReturn,
|
| + testFor,
|
| + testSyncForIn,
|
| + testAsyncForIn,
|
| + testWhile,
|
| + testTry,
|
| + testSwitch,
|
| + testEnumSwitch,
|
| + testOperators,
|
| + testConstructorInvocationArgumentCount,
|
| + testConstructorInvocationArgumentTypes,
|
| + testMethodInvocationArgumentCount,
|
| + testMethodInvocations,
|
| + testMethodInvocationsInClass,
|
| + testGetterSetterInvocation,
|
| + // testNewExpression,
|
| + testConditionalExpression,
|
| + testIfStatement,
|
| + testThis,
|
| + testSuper,
|
| + testOperatorsAssignability,
|
| + testFieldInitializers,
|
| + testTypeVariableExpressions,
|
| + testTypeVariableLookup1,
|
| + testTypeVariableLookup2,
|
| + testTypeVariableLookup3,
|
| + testFunctionTypeLookup,
|
| + testTypedefLookup,
|
| + testTypeLiteral,
|
| + testInitializers,
|
| + testTypePromotionHints,
|
| + testFunctionCall,
|
| + testCascade,
|
| + testAwait,
|
| + testAsyncReturn
|
| + ];
|
| asyncTest(() => Future.forEach(tests, (test) => setup(test)));
|
| }
|
|
|
| @@ -130,7 +128,6 @@ testFor(MockCompiler compiler) {
|
| // check("for (String s in true) {}", MessageKind.UNDEFINED_METHOD);
|
| }
|
|
|
| -
|
| testSyncForIn(MockCompiler compiler) {
|
| String script = """
|
| class HasUntypedIterator {
|
| @@ -180,111 +177,217 @@ class Class {
|
| foo.ensureResolved(compiler.resolution);
|
| FunctionElement method = foo.lookupLocalMember('forIn');
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in <String>[]) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in []) {}
|
| }""");
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in new HasUntypedIterator()) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in new HasUntypedIterator()) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in new HasUntypedIterator()) {}
|
| }""");
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in new HasIntIterator()) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in new HasIntIterator()) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in new HasIntIterator()) {}
|
| }""");
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in new HasNoIterator()) {}
|
| - }""", warnings: MessageKind.UNDEFINED_GETTER);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + warnings: MessageKind.UNDEFINED_GETTER);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in new HasNoIterator()) {}
|
| - }""", warnings: MessageKind.UNDEFINED_GETTER);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + warnings: MessageKind.UNDEFINED_GETTER);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in new HasNoIterator()) {}
|
| - }""", warnings: MessageKind.UNDEFINED_GETTER);
|
| + }""",
|
| + warnings: MessageKind.UNDEFINED_GETTER);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in new HasCustomIntIterator()) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in new HasCustomIntIterator()) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in new HasCustomIntIterator()) {}
|
| }""");
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (var e in new HasCustomNoCurrentIterator()) {}
|
| - }""", hints: MessageKind.UNDEFINED_GETTER);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + hints: MessageKind.UNDEFINED_GETTER);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (String e in new HasCustomNoCurrentIterator()) {}
|
| - }""", hints: MessageKind.UNDEFINED_GETTER);
|
| - analyzeIn(compiler, method, """{
|
| + }""",
|
| + hints: MessageKind.UNDEFINED_GETTER);
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (int e in new HasCustomNoCurrentIterator()) {}
|
| - }""", hints: MessageKind.UNDEFINED_GETTER);
|
| + }""",
|
| + hints: MessageKind.UNDEFINED_GETTER);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| var localDyn;
|
| for (localDyn in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| String localString;
|
| for (localString in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| int localInt;
|
| for (localInt in <String>[]) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (topLevelDyn in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (topLevelString in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (topLevelInt in <String>[]) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (instanceDyn in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (instanceString in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (instanceInt in <String>[]) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (staticDyn in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (staticString in <String>[]) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| for (staticInt in <String>[]) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| }
|
|
|
| testAsyncForIn(MockCompiler compiler) {
|
| @@ -313,119 +416,201 @@ class Class {
|
| foo.ensureResolved(compiler.resolution);
|
| FunctionElement method = foo.lookupLocalMember('forIn');
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| var stream;
|
| await for (var e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| var stream;
|
| await for (String e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| var stream;
|
| await for (int e in stream) {}
|
| }""");
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| await for (var e in []) {}
|
| - }""", hints: MessageKind.NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (var e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (String e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (int e in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| CustomStream<String> stream;
|
| await for (var e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| CustomStream<String> stream;
|
| await for (String e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| CustomStream<String> stream;
|
| await for (int e in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| StringStream stream;
|
| await for (var e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| StringStream stream;
|
| await for (String e in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| StringStream stream;
|
| await for (int e in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| var localDyn;
|
| await for (localDyn in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| String localString;
|
| await for (localString in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| int localInt;
|
| await for (localInt in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (topLevelDyn in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (topLevelString in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (topLevelInt in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (instanceDyn in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (instanceString in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (instanceInt in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
|
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (staticDyn in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (staticString in stream) {}
|
| }""");
|
| - analyzeIn(compiler, method, """{
|
| + analyzeIn(
|
| + compiler,
|
| + method,
|
| + """{
|
| Stream<String> stream;
|
| await for (staticInt in stream) {}
|
| - }""", hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| + }""",
|
| + hints: MessageKind.FORIN_NOT_ASSIGNABLE);
|
| }
|
|
|
| -
|
| testWhile(MockCompiler compiler) {
|
| check(String code, {warnings}) {
|
| analyze(compiler, code, warnings: warnings);
|
| @@ -456,14 +641,13 @@ testTry(MockCompiler compiler) {
|
| check("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
|
| check("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
|
| check("try {} on String catch (e) { int i = e; } finally {}",
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
| check("try {} catch (e, s) { int i = e; int j = s; } finally {}",
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
| check("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
|
| - warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
|
|
| -
|
| testSwitch(MockCompiler compiler) {
|
| check(String code, {warnings}) {
|
| analyze(compiler, code, warnings: warnings);
|
| @@ -471,13 +655,12 @@ testSwitch(MockCompiler compiler) {
|
|
|
| check("switch (0) { case 1: break; case 2: break; }");
|
| check("switch (0) { case 1: int i = ''; break; case 2: break; }",
|
| - warnings: NOT_ASSIGNABLE);
|
| - check("switch (0) { case '': break; }",
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
| + check("switch (0) { case '': break; }", warnings: NOT_ASSIGNABLE);
|
| check("switch ('') { case 1: break; case 2: break; }",
|
| - warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| check("switch (1.5) { case 1: break; case 2: break; }",
|
| - warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
|
|
| testEnumSwitch(MockCompiler compiler) {
|
| @@ -525,42 +708,56 @@ case Enum.B: break;
|
| case Enum.C: break;
|
| }""");
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.B: break;
|
| case Enum.C: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.A: break;
|
| case Enum.C: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.A: break;
|
| case Enum.B: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.A: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.B: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| case Enum.C: break;
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
|
|
| - check("""
|
| + check(
|
| + """
|
| switch (Enum.A) {
|
| -}""", warnings: MessageKind.MISSING_ENUM_CASES);
|
| +}""",
|
| + warnings: MessageKind.MISSING_ENUM_CASES);
|
| }
|
|
|
| testOperators(MockCompiler compiler) {
|
| @@ -574,22 +771,22 @@ testOperators(MockCompiler compiler) {
|
| check("{ var i = 1 ${op} 2; }");
|
| check("{ var i = 1; i ${op}= 2; }");
|
| check("{ int i; var j = (i = true) ${op} 2; }",
|
| - warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| + warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| check("{ int i; var j = 1 ${op} (i = true); }",
|
| - warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
| for (final op in ['-', '~']) {
|
| check("{ var i = ${op}1; }");
|
| check("{ int i; var j = ${op}(i = true); }",
|
| - warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| + warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| }
|
| for (final op in ['++', '--']) {
|
| check("{ int i = 1; int j = i${op}; }");
|
| check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
|
| check("{ bool b = true; bool j = b${op}; }",
|
| - warnings: MessageKind.UNDEFINED_OPERATOR);
|
| + warnings: MessageKind.UNDEFINED_OPERATOR);
|
| check("{ bool b = true; int j = ${op}b; }",
|
| - warnings: MessageKind.UNDEFINED_OPERATOR);
|
| + warnings: MessageKind.UNDEFINED_OPERATOR);
|
| }
|
| for (final op in ['||', '&&']) {
|
| check("{ bool b = (true ${op} false); }");
|
| @@ -601,17 +798,15 @@ testOperators(MockCompiler compiler) {
|
| check("{ bool b = 1 ${op} 2; }");
|
| check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
|
| check("{ int i; bool b = (i = true) ${op} 2; }",
|
| - warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| + warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
|
| check("{ int i; bool b = 1 ${op} (i = true); }",
|
| - warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
| for (final op in ['==', '!=']) {
|
| check("{ bool b = 1 ${op} 2; }");
|
| check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
|
| - check("{ int i; bool b = (i = true) ${op} 2; }",
|
| - warnings: NOT_ASSIGNABLE);
|
| - check("{ int i; bool b = 1 ${op} (i = true); }",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("{ int i; bool b = (i = true) ${op} 2; }", warnings: NOT_ASSIGNABLE);
|
| + check("{ int i; bool b = 1 ${op} (i = true); }", warnings: NOT_ASSIGNABLE);
|
| }
|
| }
|
|
|
| @@ -655,31 +850,27 @@ void testConstructorInvocationArgumentTypes(MockCompiler compiler) {
|
| check("new C1(42);");
|
| check("new C1('string');");
|
| check("new C2(42);");
|
| - check("new C2('string');",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("new C2('string');", warnings: NOT_ASSIGNABLE);
|
| check("new C3(42);");
|
| - check("new C3('string');",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("new C3('string');", warnings: NOT_ASSIGNABLE);
|
| check("new C3.named(42);");
|
| - check("new C3.named('string');",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("new C3.named('string');", warnings: NOT_ASSIGNABLE);
|
| }
|
|
|
| void testMethodInvocationArgumentCount(MockCompiler compiler) {
|
| compiler.parseScript(CLASS_WITH_METHODS);
|
|
|
| check(String text, [expectedWarnings]) {
|
| - analyze(compiler,
|
| - "{ ClassWithMethods c; $text }",
|
| - warnings: expectedWarnings);
|
| + analyze(compiler, "{ ClassWithMethods c; $text }",
|
| + warnings: expectedWarnings);
|
| }
|
|
|
| check("c.untypedNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
|
| check("c.untypedOneArgumentMethod();", MessageKind.MISSING_ARGUMENT);
|
| check("c.untypedOneArgumentMethod(1, 1);", MessageKind.ADDITIONAL_ARGUMENT);
|
| check("c.untypedTwoArgumentMethod();", MessageKind.MISSING_ARGUMENT);
|
| - check("c.untypedTwoArgumentMethod(1, 2, 3);",
|
| - MessageKind.ADDITIONAL_ARGUMENT);
|
| + check(
|
| + "c.untypedTwoArgumentMethod(1, 2, 3);", MessageKind.ADDITIONAL_ARGUMENT);
|
| check("c.intNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
|
| check("c.intOneArgumentMethod();", MessageKind.MISSING_ARGUMENT);
|
| check("c.intOneArgumentMethod(1, 1);", MessageKind.ADDITIONAL_ARGUMENT);
|
| @@ -691,40 +882,39 @@ void testMethodInvocationArgumentCount(MockCompiler compiler) {
|
| check("c.intOneArgumentOneOptionalMethod(0);");
|
| check("c.intOneArgumentOneOptionalMethod(0, 1);");
|
| check("c.intOneArgumentOneOptionalMethod(0, 1, 2);",
|
| - [MessageKind.ADDITIONAL_ARGUMENT]);
|
| + [MessageKind.ADDITIONAL_ARGUMENT]);
|
| check("c.intOneArgumentOneOptionalMethod(0, 1, c: 2);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intOneArgumentOneOptionalMethod(0, b: 1);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| - check("c.intOneArgumentOneOptionalMethod(a: 0, b: 1);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND,
|
| - MessageKind.NAMED_ARGUMENT_NOT_FOUND,
|
| - MessageKind.MISSING_ARGUMENT]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + check("c.intOneArgumentOneOptionalMethod(a: 0, b: 1);", [
|
| + MessageKind.NAMED_ARGUMENT_NOT_FOUND,
|
| + MessageKind.NAMED_ARGUMENT_NOT_FOUND,
|
| + MessageKind.MISSING_ARGUMENT
|
| + ]);
|
|
|
| check("c.intTwoOptionalMethod();");
|
| check("c.intTwoOptionalMethod(0);");
|
| check("c.intTwoOptionalMethod(0, 1);");
|
| check("c.intTwoOptionalMethod(0, 1, 2);", [MessageKind.ADDITIONAL_ARGUMENT]);
|
| - check("c.intTwoOptionalMethod(a: 0);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + check(
|
| + "c.intTwoOptionalMethod(a: 0);", [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intTwoOptionalMethod(0, b: 1);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
|
|
| check("c.intOneArgumentOneNamedMethod();", [MessageKind.MISSING_ARGUMENT]);
|
| check("c.intOneArgumentOneNamedMethod(0);");
|
| check("c.intOneArgumentOneNamedMethod(0, b: 1);");
|
| - check("c.intOneArgumentOneNamedMethod(b: 1);",
|
| - [MessageKind.MISSING_ARGUMENT]);
|
| + check(
|
| + "c.intOneArgumentOneNamedMethod(b: 1);", [MessageKind.MISSING_ARGUMENT]);
|
| check("c.intOneArgumentOneNamedMethod(0, b: 1, c: 2);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intOneArgumentOneNamedMethod(0, 1);",
|
| - [MessageKind.ADDITIONAL_ARGUMENT]);
|
| + [MessageKind.ADDITIONAL_ARGUMENT]);
|
| check("c.intOneArgumentOneNamedMethod(0, 1, c: 2);",
|
| - [MessageKind.ADDITIONAL_ARGUMENT,
|
| - MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intOneArgumentOneNamedMethod(a: 1, b: 1);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND,
|
| - MessageKind.MISSING_ARGUMENT]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND, MessageKind.MISSING_ARGUMENT]);
|
|
|
| check("c.intTwoNamedMethod();");
|
| check("c.intTwoNamedMethod(a: 0);");
|
| @@ -734,26 +924,25 @@ void testMethodInvocationArgumentCount(MockCompiler compiler) {
|
| check("c.intTwoNamedMethod(0);", [MessageKind.ADDITIONAL_ARGUMENT]);
|
| check("c.intTwoNamedMethod(c: 2);", [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intTwoNamedMethod(a: 0, c: 2);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intTwoNamedMethod(a: 0, b: 1, c: 2);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intTwoNamedMethod(c: 2, b: 1, a: 0);",
|
| - [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| check("c.intTwoNamedMethod(0, b: 1);", [MessageKind.ADDITIONAL_ARGUMENT]);
|
| check("c.intTwoNamedMethod(0, 1);",
|
| - [MessageKind.ADDITIONAL_ARGUMENT,
|
| - MessageKind.ADDITIONAL_ARGUMENT]);
|
| + [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.ADDITIONAL_ARGUMENT]);
|
| check("c.intTwoNamedMethod(0, c: 2);",
|
| - [MessageKind.ADDITIONAL_ARGUMENT,
|
| - MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| + [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
|
| }
|
|
|
| void testMethodInvocations(MockCompiler compiler) {
|
| compiler.parseScript(CLASS_WITH_METHODS);
|
|
|
| - check(String text, [expectedWarnings]){
|
| - analyze(compiler,
|
| - """{
|
| + check(String text, [expectedWarnings]) {
|
| + analyze(
|
| + compiler,
|
| + """{
|
| ClassWithMethods c;
|
| SubClass d;
|
| var e;
|
| @@ -762,7 +951,8 @@ void testMethodInvocations(MockCompiler compiler) {
|
| int localMethod(String str) { return 0; }
|
| $text
|
| }
|
| - """, warnings: expectedWarnings);
|
| + """,
|
| + warnings: expectedWarnings);
|
| }
|
|
|
| check("int k = c.untypedNoArgumentMethod();");
|
| @@ -786,21 +976,16 @@ void testMethodInvocations(MockCompiler compiler) {
|
| check("ClassWithMethods x = d.untypedTwoArgumentMethod(i, d);");
|
|
|
| check("int k = c.intNoArgumentMethod();");
|
| - check("ClassWithMethods x = c.intNoArgumentMethod();",
|
| - NOT_ASSIGNABLE);
|
| + check("ClassWithMethods x = c.intNoArgumentMethod();", NOT_ASSIGNABLE);
|
|
|
| check("int k = c.intOneArgumentMethod(c);", NOT_ASSIGNABLE);
|
| - check("ClassWithMethods x = c.intOneArgumentMethod(1);",
|
| - NOT_ASSIGNABLE);
|
| - check("int k = c.intOneArgumentMethod('string');",
|
| - NOT_ASSIGNABLE);
|
| + check("ClassWithMethods x = c.intOneArgumentMethod(1);", NOT_ASSIGNABLE);
|
| + check("int k = c.intOneArgumentMethod('string');", NOT_ASSIGNABLE);
|
| check("int k = c.intOneArgumentMethod(i);");
|
|
|
| - check("int k = c.intTwoArgumentMethod(1, 'string');",
|
| - NOT_ASSIGNABLE);
|
| + check("int k = c.intTwoArgumentMethod(1, 'string');", NOT_ASSIGNABLE);
|
| check("int k = c.intTwoArgumentMethod(i, j);");
|
| - check("ClassWithMethods x = c.intTwoArgumentMethod(i, j);",
|
| - NOT_ASSIGNABLE);
|
| + check("ClassWithMethods x = c.intTwoArgumentMethod(i, j);", NOT_ASSIGNABLE);
|
|
|
| check("c.functionField();");
|
| check("d.functionField();");
|
| @@ -815,27 +1000,21 @@ void testMethodInvocations(MockCompiler compiler) {
|
| check("c.untypedField(1);");
|
| check("d.untypedField('string');");
|
|
|
| -
|
| - check("c.intOneArgumentOneOptionalMethod('');",
|
| - NOT_ASSIGNABLE);
|
| + check("c.intOneArgumentOneOptionalMethod('');", NOT_ASSIGNABLE);
|
| check("c.intOneArgumentOneOptionalMethod('', '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check("c.intTwoOptionalMethod('');", NOT_ASSIGNABLE);
|
| - check("c.intTwoOptionalMethod('', '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("c.intTwoOptionalMethod('', '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| - check("c.intOneArgumentOneNamedMethod('');",
|
| - NOT_ASSIGNABLE);
|
| + check("c.intOneArgumentOneNamedMethod('');", NOT_ASSIGNABLE);
|
| check("c.intOneArgumentOneNamedMethod('', b: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check("c.intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
|
| check("c.intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
|
| - check("c.intTwoNamedMethod(a: '', b: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| - check("c.intTwoNamedMethod(b: '', a: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("c.intTwoNamedMethod(a: '', b: '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("c.intTwoNamedMethod(b: '', a: '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // Invocation of dynamic variable.
|
| check("e();");
|
| @@ -865,17 +1044,14 @@ void testMethodInvocations(MockCompiler compiler) {
|
| check("(String foo){}('string');");
|
| check("int k = int bar(String foo){ return 0; }('string');");
|
| check("int k = String bar(String foo){ return foo; }('string');",
|
| - NOT_ASSIGNABLE);
|
| + NOT_ASSIGNABLE);
|
|
|
| // Static invocations.
|
| - check("ClassWithMethods.staticMethod();",
|
| - MessageKind.MISSING_ARGUMENT);
|
| - check("ClassWithMethods.staticMethod(1);",
|
| - NOT_ASSIGNABLE);
|
| + check("ClassWithMethods.staticMethod();", MessageKind.MISSING_ARGUMENT);
|
| + check("ClassWithMethods.staticMethod(1);", NOT_ASSIGNABLE);
|
| check("ClassWithMethods.staticMethod('string');");
|
| check("int k = ClassWithMethods.staticMethod('string');");
|
| - check("String k = ClassWithMethods.staticMethod('string');",
|
| - NOT_ASSIGNABLE);
|
| + check("String k = ClassWithMethods.staticMethod('string');", NOT_ASSIGNABLE);
|
|
|
| // Invocation on dynamic variable.
|
| check("e.foo();");
|
| @@ -904,20 +1080,20 @@ Future testMethodInvocationsInClass(MockCompiler compiler) {
|
| Element d = SubClass.lookupLocalMember('method');
|
| assert(d != null);
|
|
|
| - check(Element element, String text, [expectedWarnings]){
|
| - analyzeIn(compiler,
|
| - element,
|
| - """{
|
| + check(Element element, String text, [expectedWarnings]) {
|
| + analyzeIn(
|
| + compiler,
|
| + element,
|
| + """{
|
| var e;
|
| int i;
|
| int j;
|
| int localMethod(String str) { return 0; }
|
| $text
|
| }""",
|
| - warnings: expectedWarnings);
|
| + warnings: expectedWarnings);
|
| }
|
|
|
| -
|
| check(c, "int k = untypedNoArgumentMethod();");
|
| check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
|
| check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
|
| @@ -939,21 +1115,17 @@ Future testMethodInvocationsInClass(MockCompiler compiler) {
|
| check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
|
|
|
| check(c, "int k = intNoArgumentMethod();");
|
| - check(c, "ClassWithMethods x = intNoArgumentMethod();",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "ClassWithMethods x = intNoArgumentMethod();", NOT_ASSIGNABLE);
|
|
|
| check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
|
| - check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
|
| - NOT_ASSIGNABLE);
|
| - check(c, "int k = intOneArgumentMethod('string');",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "ClassWithMethods x = intOneArgumentMethod(1);", NOT_ASSIGNABLE);
|
| + check(c, "int k = intOneArgumentMethod('string');", NOT_ASSIGNABLE);
|
| check(c, "int k = intOneArgumentMethod(i);");
|
|
|
| - check(c, "int k = intTwoArgumentMethod(1, 'string');",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "int k = intTwoArgumentMethod(1, 'string');", NOT_ASSIGNABLE);
|
| check(c, "int k = intTwoArgumentMethod(i, j);");
|
| - check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
|
| - NOT_ASSIGNABLE);
|
| + check(
|
| + c, "ClassWithMethods x = intTwoArgumentMethod(i, j);", NOT_ASSIGNABLE);
|
|
|
| check(c, "functionField();");
|
| check(d, "functionField();");
|
| @@ -968,27 +1140,23 @@ Future testMethodInvocationsInClass(MockCompiler compiler) {
|
| check(c, "untypedField(1);");
|
| check(d, "untypedField('string');");
|
|
|
| -
|
| - check(c, "intOneArgumentOneOptionalMethod('');",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "intOneArgumentOneOptionalMethod('');", NOT_ASSIGNABLE);
|
| check(c, "intOneArgumentOneOptionalMethod('', '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
|
| - check(c, "intTwoOptionalMethod('', '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check(c, "intTwoOptionalMethod('', '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| - check(c, "intOneArgumentOneNamedMethod('');",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "intOneArgumentOneNamedMethod('');", NOT_ASSIGNABLE);
|
| check(c, "intOneArgumentOneNamedMethod('', b: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
|
| check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
|
| check(c, "intTwoNamedMethod(a: '', b: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| check(c, "intTwoNamedMethod(b: '', a: '');",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // Invocation of dynamic variable.
|
| check(c, "e();");
|
| @@ -1018,22 +1186,20 @@ Future testMethodInvocationsInClass(MockCompiler compiler) {
|
| check(c, "(String foo){}('string');");
|
| check(c, "int k = int bar(String foo){ return 0; }('string');");
|
| check(c, "int k = String bar(String foo){ return foo; }('string');",
|
| - NOT_ASSIGNABLE);
|
| + NOT_ASSIGNABLE);
|
|
|
| // Static invocations.
|
| - check(c, "staticMethod();",
|
| - MessageKind.MISSING_ARGUMENT);
|
| - check(c, "staticMethod(1);",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "staticMethod();", MessageKind.MISSING_ARGUMENT);
|
| + check(c, "staticMethod(1);", NOT_ASSIGNABLE);
|
| check(c, "staticMethod('string');");
|
| check(c, "int k = staticMethod('string');");
|
| - check(c, "String k = staticMethod('string');",
|
| - NOT_ASSIGNABLE);
|
| + check(c, "String k = staticMethod('string');", NOT_ASSIGNABLE);
|
| check(d, "staticMethod();", MessageKind.UNDEFINED_METHOD);
|
| check(d, "staticMethod(1);", MessageKind.UNDEFINED_METHOD);
|
| check(d, "staticMethod('string');", MessageKind.UNDEFINED_METHOD);
|
| check(d, "int k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
|
| - check(d, "String k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
|
| + check(
|
| + d, "String k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
|
|
|
| // Invocation on dynamic variable.
|
| check(c, "e.foo();");
|
| @@ -1046,16 +1212,17 @@ Future testMethodInvocationsInClass(MockCompiler compiler) {
|
| check(c, "foo('string');", MessageKind.UNDEFINED_METHOD);
|
| check(c, "foo(a: 'string');", MessageKind.UNDEFINED_METHOD);
|
| check(c, "foo(a: localMethod(1));",
|
| - [MessageKind.UNDEFINED_METHOD, NOT_ASSIGNABLE]);
|
| + [MessageKind.UNDEFINED_METHOD, NOT_ASSIGNABLE]);
|
| });
|
| }
|
|
|
| void testFunctionCall(MockCompiler compiler) {
|
| compiler.parseScript(CLASS_WITH_METHODS);
|
|
|
| - check(String text, [expectedWarnings]){
|
| - analyze(compiler,
|
| - """{
|
| + check(String text, [expectedWarnings]) {
|
| + analyze(
|
| + compiler,
|
| + """{
|
| ClassWithMethods x;
|
| int localMethod(String str) { return 0; }
|
| String2Int string2int;
|
| @@ -1063,7 +1230,8 @@ void testFunctionCall(MockCompiler compiler) {
|
| SubFunction subFunction;
|
| $text
|
| }
|
| - """, warnings: expectedWarnings);
|
| + """,
|
| + warnings: expectedWarnings);
|
| }
|
|
|
| check("int k = localMethod.call('');");
|
| @@ -1156,10 +1324,8 @@ testConditionalExpression(MockCompiler compiler) {
|
| check("null ? 1 : 2;");
|
| check("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
|
| check("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
|
| - check("{ int i; true ? i = 2.7 : 2; }",
|
| - warnings: NOT_ASSIGNABLE);
|
| - check("{ int i; true ? 2 : i = 2.7; }",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("{ int i; true ? i = 2.7 : 2; }", warnings: NOT_ASSIGNABLE);
|
| + check("{ int i; true ? 2 : i = 2.7; }", warnings: NOT_ASSIGNABLE);
|
| check("{ int i; i = true ? 2.7 : 2; }");
|
|
|
| compiler.parseScript("""
|
| @@ -1176,14 +1342,12 @@ testIfStatement(MockCompiler compiler) {
|
|
|
| check("if (true) {}");
|
| check("if (null) {}");
|
| - check("if (0) {}",
|
| - warnings: NOT_ASSIGNABLE);
|
| - check("if ('') {}",
|
| - warnings: NOT_ASSIGNABLE);
|
| + check("if (0) {}", warnings: NOT_ASSIGNABLE);
|
| + check("if ('') {}", warnings: NOT_ASSIGNABLE);
|
| check("{ int i = 27; if (true) { i = 2.7; } else {} }",
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
| check("{ int i = 27; if (true) {} else { i = 2.7; } }",
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
| }
|
|
|
| testThis(MockCompiler compiler) {
|
| @@ -1387,19 +1551,14 @@ testOperatorsAssignability(MockCompiler compiler) {
|
| check('z = z $o z;');
|
| check('z = a $o z;', NOT_ASSIGNABLE);
|
| check('z = z $o b;', NOT_ASSIGNABLE);
|
| - check('z = a $o b;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| - check('a = a $o b;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE,
|
| - NOT_ASSIGNABLE]);
|
| + check('z = a $o b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check('a = a $o b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
|
|
| check('z = !z;');
|
| check('z = !a;', NOT_ASSIGNABLE);
|
| check('a = !z;', NOT_ASSIGNABLE);
|
| - check('a = !a;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| -
|
| + check('a = !a;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // Tests against MismatchA.
|
|
|
| @@ -1422,15 +1581,13 @@ testOperatorsAssignability(MockCompiler compiler) {
|
| check('b = a++;', NOT_ASSIGNABLE);
|
| // 1 is not applicable to operator +.
|
| // `++a` of type int is not assignable to `b`.
|
| - check('b = ++a;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check('b = ++a;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // 1 is not applicable to operator +.
|
| check('b = a[0]++;', NOT_ASSIGNABLE);
|
| // 1 is not applicable to operator +.
|
| // `++a[0]` of type int is not assignable to `b`.
|
| - check('b = ++a[0];',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check('b = ++a[0];', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // Tests against: MismatchA operator -(int other) => this;
|
|
|
| @@ -1468,9 +1625,7 @@ testOperatorsAssignability(MockCompiler compiler) {
|
| check('a[""] += b;', NOT_ASSIGNABLE);
|
| // `c` is not applicable to operator [] on `a`.
|
| // `c` is not applicable to operator []= on `a`.
|
| - check('a[c] += b;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| -
|
| + check('a[c] += b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| // Tests against MismatchB.
|
|
|
| @@ -1487,12 +1642,10 @@ testOperatorsAssignability(MockCompiler compiler) {
|
| // `b` is not assignable to `a[0]`.
|
| check('a[0] += b;', NOT_ASSIGNABLE);
|
| // `0` is not applicable to operator + on `a[0]`.
|
| - check('a[0] += "";',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check('a[0] += "";', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| // `true` is not applicable to operator + on `a[0]`.
|
| // `true` is not assignable to `a[0]`.
|
| - check('a[0] += true;',
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check('a[0] += true;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| }
|
|
|
| Future testFieldInitializers(MockCompiler compiler) {
|
| @@ -1503,13 +1656,14 @@ Future testFieldInitializers(MockCompiler compiler) {
|
| return Future.wait([
|
| check("""int i = 0;"""),
|
| check("""int i = '';""", NOT_ASSIGNABLE),
|
| -
|
| check("""class Class {
|
| int i = 0;
|
| }"""),
|
| - check("""class Class {
|
| + check(
|
| + """class Class {
|
| int i = '';
|
| - }""", NOT_ASSIGNABLE),
|
| + }""",
|
| + NOT_ASSIGNABLE),
|
| ]);
|
| }
|
|
|
| @@ -1717,21 +1871,25 @@ Future testInitializers(MockCompiler compiler) {
|
| Class(int this.a);
|
| }
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(int this.a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Class {
|
| var a;
|
| Class(int a) : this.a = a;
|
| }
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(int a) : this.a = a;
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
|
|
| // Check this-calls.
|
| check(r'''class Class {
|
| @@ -1740,24 +1898,28 @@ Future testInitializers(MockCompiler compiler) {
|
| Class.named(int a) : this(a);
|
| }
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(this.a);
|
| Class.named(int a) : this(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Class {
|
| String a;
|
| Class(var a) : this.a = a;
|
| Class.named(int a) : this(a);
|
| }
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(String a) : this.a = a;
|
| Class.named(int a) : this(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
|
|
| // Check super-calls.
|
| check(r'''class Super {
|
| @@ -1768,14 +1930,16 @@ Future testInitializers(MockCompiler compiler) {
|
| Class.named(int a) : super(a);
|
| }
|
| '''),
|
| - check(r'''class Super {
|
| + check(
|
| + r'''class Super {
|
| String a;
|
| Super(this.a);
|
| }
|
| class Class extends Super {
|
| Class.named(int a) : super(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Super {
|
| String a;
|
| Super(var a) : this.a = a;
|
| @@ -1784,14 +1948,16 @@ Future testInitializers(MockCompiler compiler) {
|
| Class.named(int a) : super(a);
|
| }
|
| '''),
|
| - check(r'''class Super {
|
| + check(
|
| + r'''class Super {
|
| String a;
|
| Super(String a) : this.a = a;
|
| }
|
| class Class extends Super {
|
| Class.named(int a) : super(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
|
|
| // Check super-calls involving generics.
|
| check(r'''class Super<T> {
|
| @@ -1802,14 +1968,16 @@ Future testInitializers(MockCompiler compiler) {
|
| Class.named(int a) : super(a);
|
| }
|
| '''),
|
| - check(r'''class Super<T> {
|
| + check(
|
| + r'''class Super<T> {
|
| T a;
|
| Super(this.a);
|
| }
|
| class Class extends Super<String> {
|
| Class.named(int a) : super(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Super<T> {
|
| T a;
|
| Super(var a) : this.a = a;
|
| @@ -1818,14 +1986,16 @@ Future testInitializers(MockCompiler compiler) {
|
| Class.named(int a) : super(a);
|
| }
|
| '''),
|
| - check(r'''class Super<T> {
|
| + check(
|
| + r'''class Super<T> {
|
| T a;
|
| Super(T a) : this.a = a;
|
| }
|
| class Class extends Super<String> {
|
| Class.named(int a) : super(a);
|
| }
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
|
|
| // Check instance creations.
|
| check(r'''class Class {
|
| @@ -1834,24 +2004,28 @@ Future testInitializers(MockCompiler compiler) {
|
| }
|
| method(int a) => new Class(a);
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(this.a);
|
| }
|
| method(int a) => new Class(a);
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Class {
|
| String a;
|
| Class(var a) : this.a = a;
|
| }
|
| method(int a) => new Class(a);
|
| '''),
|
| - check(r'''class Class {
|
| + check(
|
| + r'''class Class {
|
| String a;
|
| Class(String a) : this.a = a;
|
| }
|
| method(int a) => new Class(a);
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
|
|
| // Check instance creations involving generics.
|
| check(r'''class Class<T> {
|
| @@ -1860,24 +2034,28 @@ Future testInitializers(MockCompiler compiler) {
|
| }
|
| method(int a) => new Class<String>(a);
|
| '''),
|
| - check(r'''class Class<T> {
|
| + check(
|
| + r'''class Class<T> {
|
| T a;
|
| Class(this.a);
|
| }
|
| method(int a) => new Class<String>(a);
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| check(r'''class Class<T> {
|
| T a;
|
| Class(var a) : this.a = a;
|
| }
|
| method(int a) => new Class<String>(a);
|
| '''),
|
| - check(r'''class Class<T> {
|
| + check(
|
| + r'''class Class<T> {
|
| T a;
|
| Class(String a) : this.a = a;
|
| }
|
| method(int a) => new Class<String>(a);
|
| - ''', NOT_ASSIGNABLE),
|
| + ''',
|
| + NOT_ASSIGNABLE),
|
| ]);
|
| }
|
|
|
| @@ -1925,8 +2103,7 @@ void testGetterSetterInvocation(MockCompiler compiler) {
|
| // String is not assignable to int (the argument type of the operator + on the
|
| // getter) and num (the result type of the operation) is not assignable to
|
| // String (the type of the setter).
|
| - check("variable += '';",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("variable += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check("c.instanceField = '';");
|
| check("int v = c.instanceField;");
|
| @@ -1938,8 +2115,7 @@ void testGetterSetterInvocation(MockCompiler compiler) {
|
| // String is not assignable to int (the argument type of the operator + on the
|
| // getter) and num (the result type of the operation) is not assignable to
|
| // String (the type of the setter).
|
| - check("c.instanceField += '';",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("c.instanceField += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check("Class.staticField = '';");
|
| check("int v = Class.staticField;");
|
| @@ -1951,8 +2127,7 @@ void testGetterSetterInvocation(MockCompiler compiler) {
|
| // String is not assignable to int (the argument type of the operator + on the
|
| // getter) and num (the result type of the operation) is not assignable to
|
| // String (the type of the setter).
|
| - check("Class.staticField += '';",
|
| - [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
| + check("Class.staticField += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
|
|
|
| check("int v = c.overriddenField;");
|
| check("c.overriddenField = 0;");
|
| @@ -2003,143 +2178,170 @@ testTypePromotionHints(MockCompiler compiler) {
|
| ''');
|
|
|
| check(String text, {warnings, hints, infos}) {
|
| - analyze(compiler,
|
| - '{ $text }',
|
| - warnings: warnings,
|
| - hints: hints,
|
| - infos: infos);
|
| + analyze(compiler, '{ $text }',
|
| + warnings: warnings, hints: hints, infos: infos);
|
| }
|
|
|
| - check(r'''
|
| + check(
|
| + r'''
|
| A a = new B();
|
| if (a is C) {
|
| var x = a.c;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
|
| + infos: []);
|
|
|
| - check(r'''
|
| + check(
|
| + r'''
|
| A a = new B();
|
| if (a is C) {
|
| var x = '${a.c}${a.c}';
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER,
|
| - MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER],
|
| + hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
|
| + infos: []);
|
|
|
| - check(r'''
|
| + check(
|
| + r'''
|
| A a = new B();
|
| if (a is C) {
|
| var x = '${a.d}${a.d}'; // Type promotion wouldn't help.
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER,
|
| - MessageKind.UNDEFINED_GETTER],
|
| - hints: [],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER],
|
| + hints: [],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| D<int> d = new E();
|
| if (d is E) { // Suggest E<int>.
|
| var x = d.e;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| - {'shownTypeSuggestion': 'E<int>'})],
|
| - infos: []);
|
| + warnings: [
|
| + MessageKind.UNDEFINED_GETTER
|
| + ],
|
| + hints: [
|
| + checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| + {'shownTypeSuggestion': 'E<int>'})
|
| + ],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| D<int> d = new F();
|
| if (d is F) { // Suggest F<int, dynamic>.
|
| var x = d.f;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| - {'shownTypeSuggestion': 'F<int, dynamic>'})],
|
| - infos: []);
|
| + warnings: [
|
| + MessageKind.UNDEFINED_GETTER
|
| + ],
|
| + hints: [
|
| + checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| + {'shownTypeSuggestion': 'F<int, dynamic>'})
|
| + ],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| D<int> d = new G();
|
| if (d is G) { // Suggest G<int>.
|
| var x = d.f;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| - {'shownTypeSuggestion': 'G<int>'})],
|
| - infos: []);
|
| + warnings: [
|
| + MessageKind.UNDEFINED_GETTER
|
| + ],
|
| + hints: [
|
| + checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
|
| + {'shownTypeSuggestion': 'G<int>'})
|
| + ],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| F<double, int> f = new G();
|
| if (f is G) { // Cannot suggest a more specific type.
|
| var x = f.g;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.NOT_MORE_SPECIFIC],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [MessageKind.NOT_MORE_SPECIFIC],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| D<int> d = new E();
|
| if (d is E) {
|
| var x = d.f; // Type promotion wouldn't help.
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| A a = new B();
|
| if (a is B) {
|
| a = null;
|
| var x = a.b;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.POTENTIAL_MUTATION],
|
| - infos: [MessageKind.POTENTIAL_MUTATION_HERE]);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [MessageKind.POTENTIAL_MUTATION],
|
| + infos: [MessageKind.POTENTIAL_MUTATION_HERE]);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| A a = new B();
|
| if (a is B) {
|
| a = null;
|
| var x = a.c; // Type promotion wouldn't help.
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| A a = new B();
|
| local() { a = new A(); }
|
| if (a is B) {
|
| var x = a.b;
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE],
|
| - infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE],
|
| + infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| A a = new B();
|
| local() { a = new A(); }
|
| if (a is B) {
|
| var x = a.c; // Type promotion wouldn't help.
|
| }''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [],
|
| - infos: []);
|
| + warnings: [MessageKind.UNDEFINED_GETTER],
|
| + hints: [],
|
| + infos: []);
|
|
|
| - check('''
|
| + check(
|
| + '''
|
| A a = new B();
|
| if (a is B) {
|
| var x = () => a;
|
| var y = a.b;
|
| }
|
| a = new A();''',
|
| - warnings: [MessageKind.UNDEFINED_GETTER],
|
| - hints: [MessageKind.ACCESSED_IN_CLOSURE],
|
| - infos: [MessageKind.ACCESSED_IN_CLOSURE_HERE,
|
| - MessageKind.POTENTIAL_MUTATION_HERE]);
|
| -
|
| - check('''
|
| + warnings: [
|
| + MessageKind.UNDEFINED_GETTER
|
| + ],
|
| + hints: [
|
| + MessageKind.ACCESSED_IN_CLOSURE
|
| + ],
|
| + infos: [
|
| + MessageKind.ACCESSED_IN_CLOSURE_HERE,
|
| + MessageKind.POTENTIAL_MUTATION_HERE
|
| + ]);
|
| +
|
| + check(
|
| + '''
|
| A a = new B();
|
| if (a is B) {
|
| var x = () => a;
|
| @@ -2174,11 +2376,8 @@ void testCascade(MockCompiler compiler) {
|
| ''');
|
|
|
| check(String text, {warnings, hints, infos}) {
|
| - analyze(compiler,
|
| - '{ $text }',
|
| - warnings: warnings,
|
| - hints: hints,
|
| - infos: infos);
|
| + analyze(compiler, '{ $text }',
|
| + warnings: warnings, hints: hints, infos: infos);
|
| }
|
|
|
| check('A a = new A()..a;');
|
| @@ -2189,134 +2388,106 @@ void testCascade(MockCompiler compiler) {
|
|
|
| check('A a = new A()..b..c..a;');
|
|
|
| - check('B b = new A()..a;',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('B b = new A()..a;', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('B b = new A()..b;',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('B b = new A()..b;', warnings: NOT_ASSIGNABLE);
|
|
|
| check('B b = new A().b;');
|
|
|
| check('new A().b..b;');
|
|
|
| - check('new A().b..a;',
|
| - warnings: UNDEFINED_GETTER);
|
| + check('new A().b..a;', warnings: UNDEFINED_GETTER);
|
|
|
| check('B b = new A().b..c;');
|
|
|
| - check('C c = new A().b..c;',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('C c = new A().b..c;', warnings: NOT_ASSIGNABLE);
|
|
|
| check('A a = new A()..a = new A();');
|
|
|
| check('A a = new A()..b = new B();');
|
|
|
| - check('B b = new A()..b = new B();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('B b = new A()..b = new B();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('A a = new A()..b = new A();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('A a = new A()..b = new A();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('AFunc a = new C().afunc();');
|
|
|
| - check('AFunc a = new C()..afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('AFunc a = new C()..afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('C c = new C()..afunc();');
|
|
|
| check('A a = new C().afunc()();');
|
|
|
| - check('A a = new C()..afunc()();',
|
| - warnings: NOT_ASSIGNABLE);
|
| -
|
| - check('AFunc a = new C()..afunc()();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('A a = new C()..afunc()();', warnings: NOT_ASSIGNABLE);
|
|
|
| + check('AFunc a = new C()..afunc()();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('FuncFunc f = new A().funcfunc();');
|
|
|
| - check('A a = new A().funcfunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('A a = new A().funcfunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('FuncFunc f = new A()..funcfunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('FuncFunc f = new A()..funcfunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('A a = new A()..funcfunc();');
|
|
|
| - check('FuncFunc f = new A()..funcfunc()();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('FuncFunc f = new A()..funcfunc()();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('A a = new A()..funcfunc()();');
|
|
|
| - check('FuncFunc f = new A()..funcfunc()()();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('FuncFunc f = new A()..funcfunc()()();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('A a = new A()..funcfunc()()();');
|
|
|
| -
|
| check('''A a;
|
| a = new A()..a = a = new A()..c.afunc();''');
|
|
|
| check('''A a = new A()..b = new B()..c.afunc();''');
|
|
|
| - check('''A a = new A()..b = new A()..c.afunc();''',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('''A a = new A()..b = new A()..c.afunc();''', warnings: NOT_ASSIGNABLE);
|
|
|
| check('''A a = new A()..b = new A()..c.afunc()();''',
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
|
|
| check('''A a = new A()..b = new A()..c.afunc()().b;''',
|
| - warnings: NOT_ASSIGNABLE);
|
| + warnings: NOT_ASSIGNABLE);
|
|
|
| - check('A a = new A().afunc()()[0].afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('A a = new A().afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('C c = new A().afunc()()[0].afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('C c = new A().afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('AFunc a = new A().afunc()()[0].afunc();');
|
|
|
| check('A a = new A()..afunc()()[0].afunc();');
|
|
|
| - check('C c = new A()..afunc()()[0].afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('C c = new A()..afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('AFunc a = new A()..afunc()()[0].afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('AFunc a = new A()..afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('A a = new A().afunc()()[0]..afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('A a = new A().afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('C c = new A().afunc()()[0]..afunc();');
|
|
|
| - check('AFunc a = new A().afunc()()[0]..afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('AFunc a = new A().afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('A a = new A()..afunc()()[0]..afunc();');
|
|
|
| - check('C c = new A()..afunc()()[0]..afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('C c = new A()..afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('AFunc a = new A()..afunc()()[0]..afunc();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('AFunc a = new A()..afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
|
|
|
| - check('new A()[0] = new A();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('new A()[0] = new A();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('new A()[0] = new C();');
|
|
|
| - check('new A().a[0] = new A();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('new A().a[0] = new A();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('new A().a[0] = new C();');
|
|
|
| - check('new A()..a[0] = new A();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('new A()..a[0] = new A();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('new A()..a[0] = new C();');
|
|
|
| - check('new A()..afunc()()[0] = new A();',
|
| - warnings: NOT_ASSIGNABLE);
|
| + check('new A()..afunc()()[0] = new A();', warnings: NOT_ASSIGNABLE);
|
|
|
| check('new A()..afunc()()[0] = new C();');
|
| }
|
| @@ -2352,6 +2523,7 @@ testAsyncReturn(MockCompiler compiler) {
|
| Future check(String code, [expectedWarnings]) {
|
| return analyzeTopLevel(code, expectedWarnings);
|
| }
|
| +
|
| return Future.wait([
|
| check("Future<int> foo() async { return; }"),
|
| check("Future<int> foo() async { return null; }"),
|
| @@ -2360,35 +2532,33 @@ testAsyncReturn(MockCompiler compiler) {
|
| check("Future<int> foo() async { return new Future.value(); }"),
|
| check("Future<int> foo() async { return new Future<int>.value(); }"),
|
| check("Future<int> foo() async { return new Future<String>.value(); }",
|
| - NOT_ASSIGNABLE),
|
| + NOT_ASSIGNABLE),
|
| check("""
|
| Future<int> foo() async { return new Future<Future<int>>.value(); }
|
| """),
|
| check("void foo() async { return; }"),
|
| check("void foo() async { return 0; }", MessageKind.RETURN_VALUE_IN_VOID),
|
| check("void foo() async { return new Future.value(); }",
|
| - MessageKind.RETURN_VALUE_IN_VOID),
|
| + MessageKind.RETURN_VALUE_IN_VOID),
|
| check("int foo() async { return; }"),
|
| check("int foo() async { return 0; }", NOT_ASSIGNABLE),
|
| - check("int foo() async { return new Future<int>.value(); }",
|
| - NOT_ASSIGNABLE),
|
| -
|
| + check(
|
| + "int foo() async { return new Future<int>.value(); }", NOT_ASSIGNABLE),
|
| check("Future<int> foo() async => null;"),
|
| check("Future<int> foo() async => 0;"),
|
| check("Future<int> foo() async => '';", NOT_ASSIGNABLE),
|
| check("Future<int> foo() async => new Future.value();"),
|
| check("Future<int> foo() async => new Future<int>.value();"),
|
| check("Future<int> foo() async => new Future<String>.value();",
|
| - NOT_ASSIGNABLE),
|
| + NOT_ASSIGNABLE),
|
| check("""
|
| Future<int> foo() async => new Future<Future<int>>.value();
|
| """),
|
| check("void foo() async => 0;", MessageKind.RETURN_VALUE_IN_VOID),
|
| check("void foo() async => new Future.value();",
|
| - MessageKind.RETURN_VALUE_IN_VOID),
|
| + MessageKind.RETURN_VALUE_IN_VOID),
|
| check("int foo() async => 0;", NOT_ASSIGNABLE),
|
| - check("int foo() async => new Future<int>.value();",
|
| - NOT_ASSIGNABLE),
|
| + check("int foo() async => new Future<int>.value();", NOT_ASSIGNABLE),
|
| check("Iterable<int> foo() sync* { return; }"),
|
| check("Stream<int> foo() async* { return; }"),
|
| ]);
|
| @@ -2437,7 +2607,7 @@ String returnWithType(String type, expression) {
|
| }
|
|
|
| Node parseExpression(String text) =>
|
| - parseBodyCode(text, (parser, token) => parser.parseExpression(token));
|
| + parseBodyCode(text, (parser, token) => parser.parseExpression(token));
|
|
|
| const Map<String, String> ALT_SOURCE = const <String, String>{
|
| 'num': r'''
|
| @@ -2474,8 +2644,8 @@ const Map<String, String> ALT_SOURCE = const <String, String>{
|
| };
|
|
|
| Future setup(test(MockCompiler compiler)) {
|
| - MockCompiler compiler = new MockCompiler.internal(
|
| - coreSource: ALT_SOURCE, enableAsyncAwait: true);
|
| + MockCompiler compiler =
|
| + new MockCompiler.internal(coreSource: ALT_SOURCE, enableAsyncAwait: true);
|
| return compiler.init("import 'dart:async';").then((_) => test(compiler));
|
| }
|
|
|
| @@ -2488,7 +2658,7 @@ DartType analyzeType(MockCompiler compiler, String text) {
|
|
|
| analyzeTopLevel(String text, [expectedWarnings]) {
|
| if (expectedWarnings == null) expectedWarnings = [];
|
| - if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
|
| + if (expectedWarnings is! List) expectedWarnings = [expectedWarnings];
|
|
|
| MockCompiler compiler = new MockCompiler.internal(enableAsyncAwait: true);
|
| compiler.diagnosticHandler = createHandler(compiler, text);
|
| @@ -2504,8 +2674,8 @@ analyzeTopLevel(String text, [expectedWarnings]) {
|
| TreeElements mapping;
|
| // Resolve all declarations and members.
|
| for (Link<Element> elements = topLevelElements;
|
| - !elements.isEmpty;
|
| - elements = elements.tail) {
|
| + !elements.isEmpty;
|
| + elements = elements.tail) {
|
| element = elements.head;
|
| if (element.isClass) {
|
| ClassElementX classElement = element;
|
| @@ -2542,30 +2712,28 @@ analyzeTopLevel(String text, [expectedWarnings]) {
|
| * a list of [MessageKind]s. If [hints] and [infos] are [:null:] the
|
| * corresponding message kinds are ignored.
|
| */
|
| -analyze(MockCompiler compiler,
|
| - String text,
|
| - {errors, warnings, List hints, List infos,
|
| - bool flushDeferred: false}) {
|
| +analyze(MockCompiler compiler, String text,
|
| + {errors, warnings, List hints, List infos, bool flushDeferred: false}) {
|
| if (warnings == null) warnings = [];
|
| - if (warnings is !List) warnings = [warnings];
|
| + if (warnings is! List) warnings = [warnings];
|
| if (errors == null) errors = [];
|
| - if (errors is !List) errors = [errors];
|
| + if (errors is! List) errors = [errors];
|
|
|
| compiler.diagnosticHandler = createHandler(compiler, text);
|
|
|
| Token tokens = scan(text);
|
| - NodeListener listener = new NodeListener(
|
| - const ScannerOptions(), compiler.reporter, null);
|
| + NodeListener listener =
|
| + new NodeListener(const ScannerOptions(), compiler.reporter, null);
|
| Parser parser = new Parser(listener, new MockParserOptions());
|
| parser.parseStatement(tokens);
|
| Node node = listener.popNode();
|
| - Element compilationUnit =
|
| - new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
|
| + Element compilationUnit = new CompilationUnitElementX(
|
| + new Script(null, null, null), compiler.mainApp);
|
| Element function = new MockElement(compilationUnit);
|
| TreeElements elements = compiler.resolveNodeStatement(node, function);
|
| compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
|
| - TypeCheckerVisitor checker = new TypeCheckerVisitor(
|
| - compiler, elements, compiler.types);
|
| + TypeCheckerVisitor checker =
|
| + new TypeCheckerVisitor(compiler, elements, compiler.types);
|
| DiagnosticCollector collector = compiler.diagnosticCollector;
|
| collector.clear();
|
| checker.analyze(node);
|
| @@ -2584,31 +2752,29 @@ void generateOutput(MockCompiler compiler, String text) {
|
| int begin = message.begin;
|
| int end = message.end;
|
| SourceFile sourceFile = new StringSourceFile.fromName('analysis', text);
|
| - print(sourceFile.getLocationMessage(message.message.toString(),
|
| - begin, end));
|
| + print(
|
| + sourceFile.getLocationMessage(message.message.toString(), begin, end));
|
| }
|
| }
|
|
|
| -analyzeIn(MockCompiler compiler,
|
| - FunctionElement element,
|
| - String text,
|
| - {warnings, hints}) {
|
| +analyzeIn(MockCompiler compiler, FunctionElement element, String text,
|
| + {warnings, hints}) {
|
| if (warnings == null) warnings = [];
|
| - if (warnings is !List) warnings = [warnings];
|
| + if (warnings is! List) warnings = [warnings];
|
| if (hints == null) hints = [];
|
| - if (hints is !List) hints = [hints];
|
| + if (hints is! List) hints = [hints];
|
|
|
| compiler.resolver.resolve(element);
|
| Token tokens = scan(text);
|
| - NodeListener listener = new NodeListener(
|
| - const ScannerOptions(), compiler.reporter, null);
|
| + NodeListener listener =
|
| + new NodeListener(const ScannerOptions(), compiler.reporter, null);
|
| Parser parser = new Parser(listener, new MockParserOptions(),
|
| asyncAwaitKeywordsEnabled: element.asyncMarker != AsyncMarker.SYNC);
|
| parser.parseStatement(tokens);
|
| Node node = listener.popNode();
|
| TreeElements elements = compiler.resolveNodeStatement(node, element);
|
| - TypeCheckerVisitor checker = new TypeCheckerVisitor(
|
| - compiler, elements, compiler.types);
|
| + TypeCheckerVisitor checker =
|
| + new TypeCheckerVisitor(compiler, elements, compiler.types);
|
| DiagnosticCollector collector = compiler.diagnosticCollector;
|
| collector.clear();
|
| checker.analyze(node);
|
|
|