| Index: pkg/analyzer/test/src/task/strong/checker_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| index a87577ccd9cc157a9a4f06e6d44678088088dc0d..09738bd19cc465d46b5df8ec364984d366c1ef7a 100644
|
| --- a/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| @@ -49,7 +49,7 @@ void main() {
|
| int i = 42;
|
|
|
| // Check the boolean conversion of the condition.
|
| - print((/*severe:STATIC_TYPE_ERROR*/i) ? false : true);
|
| + print(/*warning:NON_BOOL_CONDITION*/i ? false : true);
|
| print((/*info:DOWN_CAST_IMPLICIT*/obj) ? false : true);
|
| print((/*info:DYNAMIC_CAST*/dyn) ? false : true);
|
| }
|
| @@ -67,29 +67,28 @@ void main() {
|
| if (b) {}
|
| if (/*info:DYNAMIC_CAST*/dyn) {}
|
| if (/*info:DOWN_CAST_IMPLICIT*/obj) {}
|
| - if (/*severe:STATIC_TYPE_ERROR*/i) {}
|
| + if (/*warning:NON_BOOL_CONDITION*/i) {}
|
|
|
| while (b) {}
|
| while (/*info:DYNAMIC_CAST*/dyn) {}
|
| while (/*info:DOWN_CAST_IMPLICIT*/obj) {}
|
| - while (/*severe:STATIC_TYPE_ERROR*/i) {}
|
| + while (/*warning:NON_BOOL_CONDITION*/i) {}
|
|
|
| do {} while (b);
|
| do {} while (/*info:DYNAMIC_CAST*/dyn);
|
| do {} while (/*info:DOWN_CAST_IMPLICIT*/obj);
|
| - do {} while (/*severe:STATIC_TYPE_ERROR*/i);
|
| + do {} while (/*warning:NON_BOOL_CONDITION*/i);
|
|
|
| for (;b;) {}
|
| for (;/*info:DYNAMIC_CAST*/dyn;) {}
|
| for (;/*info:DOWN_CAST_IMPLICIT*/obj;) {}
|
| - for (;/*severe:STATIC_TYPE_ERROR*/i;) {}
|
| + for (;/*warning:NON_BOOL_CONDITION*/i;) {}
|
| }
|
| ''');
|
| });
|
|
|
| test('dynamic invocation', () {
|
| checkFile('''
|
| -
|
| class A {
|
| dynamic call(dynamic x) => x;
|
| }
|
| @@ -103,22 +102,24 @@ void main() {
|
| int x;
|
| double y;
|
| x = f(3);
|
| - x = /*severe:STATIC_TYPE_ERROR*/f.col(3.0);
|
| - y = /*severe:STATIC_TYPE_ERROR*/f(3);
|
| + x = /*warning:INVALID_ASSIGNMENT*/f.col(3.0);
|
| + y = /*warning:INVALID_ASSIGNMENT*/f(3);
|
| y = f.col(3.0);
|
| - f(/*severe:STATIC_TYPE_ERROR*/3.0);
|
| - f.col(/*severe:STATIC_TYPE_ERROR*/3);
|
| + f(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3.0);
|
| + f.col(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
|
| }
|
| {
|
| Function f = new B();
|
| int x;
|
| double y;
|
| x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
|
| - x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f.col(3.0);
|
| + x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE, info:INVALID_ASSIGNMENT*/f.col(3.0);
|
| y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
|
| y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f.col(3.0);
|
| - (/*info:DYNAMIC_INVOKE*/f(3.0));
|
| - (/*info:DYNAMIC_INVOKE*/f.col(3));
|
| + /*info:DYNAMIC_INVOKE*/f(3.0);
|
| + // Through type propagation, we know f is actually a B, hence the
|
| + // hint.
|
| + /*info:DYNAMIC_INVOKE*/f.col(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
|
| }
|
| {
|
| A f = new B();
|
| @@ -126,19 +127,19 @@ void main() {
|
| double y;
|
| x = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
|
| y = /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/f(3);
|
| - (/*info:DYNAMIC_INVOKE*/f(3.0));
|
| + /*info:DYNAMIC_INVOKE*/f(3.0);
|
| }
|
| {
|
| dynamic g = new B();
|
| - (/*info:DYNAMIC_INVOKE*/g.call(32.0));
|
| - (/*info:DYNAMIC_INVOKE*/g.col(42.0));
|
| - (/*info:DYNAMIC_INVOKE*/g.foo(42.0));
|
| - (/*info:DYNAMIC_INVOKE*/g./*info:UNDEFINED_GETTER*/x);
|
| + /*info:DYNAMIC_INVOKE*/g.call(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/32.0);
|
| + /*info:DYNAMIC_INVOKE*/g.col(42.0);
|
| + /*info:DYNAMIC_INVOKE*/g.foo(42.0);
|
| + /*info:DYNAMIC_INVOKE*/g./*info:UNDEFINED_GETTER*/x;
|
| A f = new B();
|
| - f.call(32.0);
|
| - (/*info:DYNAMIC_INVOKE*/f.col(42.0));
|
| - (/*info:DYNAMIC_INVOKE*/f.foo(42.0));
|
| - (/*info:DYNAMIC_INVOKE*/f./*warning:UNDEFINED_GETTER*/x);
|
| + f.call(/*info:ARGUMENT_TYPE_NOT_ASSIGNABLE*/32.0);
|
| + /*info:DYNAMIC_INVOKE*/f.col(42.0);
|
| + /*info:DYNAMIC_INVOKE*/f.foo(42.0);
|
| + /*info:DYNAMIC_INVOKE*/f./*warning:UNDEFINED_GETTER*/x;
|
| }
|
| }
|
| ''');
|
| @@ -157,7 +158,7 @@ void main() {
|
| class A {
|
| String x = "hello world";
|
|
|
| - void baz1(y) => x + /*info:DYNAMIC_CAST*/y;
|
| + void baz1(y) { x + /*info:DYNAMIC_CAST*/y; }
|
| static baz2(y) => /*info:DYNAMIC_INVOKE*/y + y;
|
| }
|
|
|
| @@ -235,7 +236,7 @@ void main() {
|
| int x;
|
| String y;
|
|
|
| - A(this.x) : this.y = /*severe:STATIC_TYPE_ERROR*/42;
|
| + A(this.x) : this.y = /*warning:FIELD_INITIALIZER_NOT_ASSIGNABLE*/42;
|
|
|
| A.c1(p): this.x = /*info:DOWN_CAST_IMPLICIT*/z, this.y = /*info:DYNAMIC_CAST*/p;
|
|
|
| @@ -245,17 +246,17 @@ void main() {
|
| }
|
|
|
| class B extends A {
|
| - B() : super(/*severe:STATIC_TYPE_ERROR*/"hello");
|
| + B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
|
|
|
| - B.c2(int x, String y) : super.c2(/*severe:STATIC_TYPE_ERROR*/y,
|
| - /*severe:STATIC_TYPE_ERROR*/x);
|
| + B.c2(int x, String y) : super.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y,
|
| + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/x);
|
|
|
| B.c3(num x, Object y) : super.c3(x, /*info:DOWN_CAST_IMPLICIT*/y);
|
| }
|
|
|
| void main() {
|
| - A a = new A.c2(/*info:DOWN_CAST_IMPLICIT*/z, /*severe:STATIC_TYPE_ERROR*/z);
|
| - var b = new B.c2(/*severe:STATIC_TYPE_ERROR*/"hello", /*info:DOWN_CAST_IMPLICIT*/obj);
|
| + A a = new A.c2(/*info:DOWN_CAST_IMPLICIT*/z, /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z);
|
| + var b = new B.c2(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello", /*info:DOWN_CAST_IMPLICIT*/obj);
|
| }
|
| ''');
|
| });
|
| @@ -282,7 +283,7 @@ void main() {
|
| typedef int Foo();
|
| void foo() {}
|
| void main () {
|
| - Foo x = /*severe:STATIC_TYPE_ERROR*/foo();
|
| + Foo x = /*warning:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo();
|
| }
|
| ''');
|
| });
|
| @@ -352,9 +353,9 @@ void main() {
|
| B b;
|
| y = a;
|
| o = a;
|
| - i = /*severe:STATIC_TYPE_ERROR*/a;
|
| - d = /*severe:STATIC_TYPE_ERROR*/a;
|
| - n = /*severe:STATIC_TYPE_ERROR*/a;
|
| + i = /*warning:INVALID_ASSIGNMENT*/a;
|
| + d = /*warning:INVALID_ASSIGNMENT*/a;
|
| + n = /*warning:INVALID_ASSIGNMENT*/a;
|
| a = a;
|
| b = /*info:DOWN_CAST_IMPLICIT*/a;
|
| }
|
| @@ -379,12 +380,12 @@ void main() {
|
| C c;
|
| y = b;
|
| o = b;
|
| - i = /*severe:STATIC_TYPE_ERROR*/b;
|
| - d = /*severe:STATIC_TYPE_ERROR*/b;
|
| - n = /*severe:STATIC_TYPE_ERROR*/b;
|
| + i = /*warning:INVALID_ASSIGNMENT*/b;
|
| + d = /*warning:INVALID_ASSIGNMENT*/b;
|
| + n = /*warning:INVALID_ASSIGNMENT*/b;
|
| a = b;
|
| b = b;
|
| - c = /*severe:STATIC_TYPE_ERROR*/b;
|
| + c = /*warning:INVALID_ASSIGNMENT*/b;
|
| }
|
| ''');
|
| });
|
| @@ -411,12 +412,12 @@ void main() {
|
| {
|
| left = /*info:DOWN_CAST_IMPLICIT*/top;
|
| left = left;
|
| - left = /*severe:STATIC_TYPE_ERROR*/right;
|
| + left = /*warning:INVALID_ASSIGNMENT*/right;
|
| left = bot;
|
| }
|
| {
|
| right = /*info:DOWN_CAST_IMPLICIT*/top;
|
| - right = /*severe:STATIC_TYPE_ERROR*/left;
|
| + right = /*warning:INVALID_ASSIGNMENT*/left;
|
| right = right;
|
| right = bot;
|
| }
|
| @@ -444,7 +445,7 @@ void main() {
|
| Object globalTop(int x) => x;
|
| int globalLeft(int x) => x;
|
| Object globalRight(Object x) => x;
|
| - int _bot(Object x) => /*info:DOWN_CAST_IMPLICIT*/x;
|
| + int bot_(Object x) => /*info:DOWN_CAST_IMPLICIT*/x;
|
| int globalBot(Object x) => x as int;
|
|
|
| void main() {
|
| @@ -504,7 +505,7 @@ void main() {
|
| typedef B Bot(A x); // Bottom of the lattice
|
|
|
| B left(B x) => x;
|
| - B _bot(A x) => /*info:DOWN_CAST_IMPLICIT*/x;
|
| + B bot_(A x) => /*info:DOWN_CAST_IMPLICIT*/x;
|
| B bot(A x) => x as B;
|
| A top(B x) => x;
|
| A right(A x) => x;
|
| @@ -866,7 +867,7 @@ void main() {
|
| BToA top(AToB f) => f;
|
| AToB left(AToB f) => f;
|
| BToA right(BToA f) => f;
|
| - AToB _bot(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| + AToB bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| AToB bot(BToA f) => f as AToB;
|
|
|
| void main() {
|
| @@ -916,7 +917,7 @@ void main() {
|
| Function2<B, A> top(AToB f) => f;
|
| Function2<A, B> left(AToB f) => f;
|
| Function2<B, A> right(BToA f) => f;
|
| - Function2<A, B> _bot(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| + Function2<A, B> bot_(BToA f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| Function2<A, B> bot(BToA f) => f as Function2<A, B>;
|
|
|
| void main() {
|
| @@ -966,7 +967,7 @@ void main() {
|
| BToA top(Function2<A, B> f) => f;
|
| AToB left(Function2<A, B> f) => f;
|
| BToA right(Function2<B, A> f) => f;
|
| - AToB _bot(Function2<B, A> f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| + AToB bot_(Function2<B, A> f) => /*warning:DOWN_CAST_COMPOSITE*/f;
|
| AToB bot(Function2<B, A> f) => f as AToB;
|
|
|
| void main() {
|
| @@ -1071,91 +1072,91 @@ void main() {
|
|
|
| r = r;
|
| r = o;
|
| - r = /*severe:STATIC_TYPE_ERROR*/n;
|
| - r = /*severe:STATIC_TYPE_ERROR*/rr;
|
| + r = /*warning:INVALID_ASSIGNMENT*/n;
|
| + r = /*warning:INVALID_ASSIGNMENT*/rr;
|
| r = ro;
|
| r = rn;
|
| r = oo;
|
| - r = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - r = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + r = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + r = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| o = /*warning:DOWN_CAST_COMPOSITE*/r;
|
| o = o;
|
| - o = /*severe:STATIC_TYPE_ERROR*/n;
|
| - o = /*severe:STATIC_TYPE_ERROR*/rr;
|
| - o = /*severe:STATIC_TYPE_ERROR*/ro;
|
| - o = /*severe:STATIC_TYPE_ERROR*/rn;
|
| + o = /*warning:INVALID_ASSIGNMENT*/n;
|
| + o = /*warning:INVALID_ASSIGNMENT*/rr;
|
| + o = /*warning:INVALID_ASSIGNMENT*/ro;
|
| + o = /*warning:INVALID_ASSIGNMENT*/rn;
|
| o = oo;
|
| - o = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - o = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + o = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + o = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| - n = /*severe:STATIC_TYPE_ERROR*/r;
|
| - n = /*severe:STATIC_TYPE_ERROR*/o;
|
| + n = /*warning:INVALID_ASSIGNMENT*/r;
|
| + n = /*warning:INVALID_ASSIGNMENT*/o;
|
| n = n;
|
| - n = /*severe:STATIC_TYPE_ERROR*/rr;
|
| - n = /*severe:STATIC_TYPE_ERROR*/ro;
|
| - n = /*severe:STATIC_TYPE_ERROR*/rn;
|
| - n = /*severe:STATIC_TYPE_ERROR*/oo;
|
| + n = /*warning:INVALID_ASSIGNMENT*/rr;
|
| + n = /*warning:INVALID_ASSIGNMENT*/ro;
|
| + n = /*warning:INVALID_ASSIGNMENT*/rn;
|
| + n = /*warning:INVALID_ASSIGNMENT*/oo;
|
| n = nn;
|
| n = nnn;
|
|
|
| - rr = /*severe:STATIC_TYPE_ERROR*/r;
|
| - rr = /*severe:STATIC_TYPE_ERROR*/o;
|
| - rr = /*severe:STATIC_TYPE_ERROR*/n;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/r;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/o;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/n;
|
| rr = rr;
|
| rr = ro;
|
| - rr = /*severe:STATIC_TYPE_ERROR*/rn;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/rn;
|
| rr = oo;
|
| - rr = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - rr = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + rr = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| ro = /*warning:DOWN_CAST_COMPOSITE*/r;
|
| - ro = /*severe:STATIC_TYPE_ERROR*/o;
|
| - ro = /*severe:STATIC_TYPE_ERROR*/n;
|
| + ro = /*warning:INVALID_ASSIGNMENT*/o;
|
| + ro = /*warning:INVALID_ASSIGNMENT*/n;
|
| ro = /*warning:DOWN_CAST_COMPOSITE*/rr;
|
| ro = ro;
|
| - ro = /*severe:STATIC_TYPE_ERROR*/rn;
|
| + ro = /*warning:INVALID_ASSIGNMENT*/rn;
|
| ro = oo;
|
| - ro = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - ro = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + ro = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + ro = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| rn = /*warning:DOWN_CAST_COMPOSITE*/r;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/o;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/n;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/rr;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/ro;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/o;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/n;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/rr;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/ro;
|
| rn = rn;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/oo;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - rn = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/oo;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + rn = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| oo = /*warning:DOWN_CAST_COMPOSITE*/r;
|
| oo = /*warning:DOWN_CAST_COMPOSITE*/o;
|
| - oo = /*severe:STATIC_TYPE_ERROR*/n;
|
| + oo = /*warning:INVALID_ASSIGNMENT*/n;
|
| oo = /*warning:DOWN_CAST_COMPOSITE*/rr;
|
| oo = /*warning:DOWN_CAST_COMPOSITE*/ro;
|
| - oo = /*severe:STATIC_TYPE_ERROR*/rn;
|
| + oo = /*warning:INVALID_ASSIGNMENT*/rn;
|
| oo = oo;
|
| - oo = /*severe:STATIC_TYPE_ERROR*/nn;
|
| - oo = /*severe:STATIC_TYPE_ERROR*/nnn;
|
| + oo = /*warning:INVALID_ASSIGNMENT*/nn;
|
| + oo = /*warning:INVALID_ASSIGNMENT*/nnn;
|
|
|
| - nn = /*severe:STATIC_TYPE_ERROR*/r;
|
| - nn = /*severe:STATIC_TYPE_ERROR*/o;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/r;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/o;
|
| nn = /*warning:DOWN_CAST_COMPOSITE*/n;
|
| - nn = /*severe:STATIC_TYPE_ERROR*/rr;
|
| - nn = /*severe:STATIC_TYPE_ERROR*/ro;
|
| - nn = /*severe:STATIC_TYPE_ERROR*/rn;
|
| - nn = /*severe:STATIC_TYPE_ERROR*/oo;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/rr;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/ro;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/rn;
|
| + nn = /*warning:INVALID_ASSIGNMENT*/oo;
|
| nn = nn;
|
| nn = nnn;
|
|
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/r;
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/o;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/r;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/o;
|
| nnn = /*warning:DOWN_CAST_COMPOSITE*/n;
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/rr;
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/ro;
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/rn;
|
| - nnn = /*severe:STATIC_TYPE_ERROR*/oo;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/rr;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/ro;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/rn;
|
| + nnn = /*warning:INVALID_ASSIGNMENT*/oo;
|
| nnn = /*warning:DOWN_CAST_COMPOSITE*/nn;
|
| nnn = nnn;
|
| }
|
| @@ -1179,7 +1180,7 @@ void main() {
|
| {
|
| I2I f;
|
| f = new A();
|
| - f = /*severe:STATIC_TYPE_ERROR*/new B();
|
| + f = /*warning:INVALID_ASSIGNMENT*/new B();
|
| f = i2i;
|
| f = /*severe:STATIC_TYPE_ERROR*/n2n;
|
| f = /*warning:DOWN_CAST_COMPOSITE*/i2i as Object;
|
| @@ -1187,7 +1188,7 @@ void main() {
|
| }
|
| {
|
| N2N f;
|
| - f = /*severe:STATIC_TYPE_ERROR*/new A();
|
| + f = /*warning:INVALID_ASSIGNMENT*/new A();
|
| f = new B();
|
| f = /*severe:STATIC_TYPE_ERROR*/i2i;
|
| f = n2n;
|
| @@ -1197,18 +1198,18 @@ void main() {
|
| {
|
| A f;
|
| f = new A();
|
| - f = /*severe:STATIC_TYPE_ERROR*/new B();
|
| - f = /*severe:STATIC_TYPE_ERROR*/i2i;
|
| - f = /*severe:STATIC_TYPE_ERROR*/n2n;
|
| + f = /*warning:INVALID_ASSIGNMENT*/new B();
|
| + f = /*warning:INVALID_ASSIGNMENT*/i2i;
|
| + f = /*warning:INVALID_ASSIGNMENT*/n2n;
|
| f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
|
| f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
|
| }
|
| {
|
| B f;
|
| - f = /*severe:STATIC_TYPE_ERROR*/new A();
|
| + f = /*warning:INVALID_ASSIGNMENT*/new A();
|
| f = new B();
|
| - f = /*severe:STATIC_TYPE_ERROR*/i2i;
|
| - f = /*severe:STATIC_TYPE_ERROR*/n2n;
|
| + f = /*warning:INVALID_ASSIGNMENT*/i2i;
|
| + f = /*warning:INVALID_ASSIGNMENT*/n2n;
|
| f = /*info:DOWN_CAST_IMPLICIT*/i2i as Object;
|
| f = /*info:DOWN_CAST_IMPLICIT*/n2n as Function;
|
| }
|
| @@ -1230,7 +1231,7 @@ void main() {
|
|
|
| class A {
|
| void bar() => null;
|
| - void foo() => bar; // allowed
|
| + void foo() => bar(); // allowed
|
| }
|
| ''');
|
| });
|
| @@ -1257,8 +1258,8 @@ void main() {
|
| local = g; // valid
|
|
|
| // Non-generic function cannot subtype a generic one.
|
| - local = /*severe:STATIC_TYPE_ERROR*/(x) => null;
|
| - local = /*severe:STATIC_TYPE_ERROR*/nonGenericFn;
|
| + local = /*severe:STATIC_TYPE_ERROR, warning:INVALID_ASSIGNMENT*/(x) => null;
|
| + local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
|
| }
|
| {
|
| Iterable/*<R>*/ f/*<P, R>*/(List/*<P>*/ p) => null;
|
| @@ -1273,8 +1274,8 @@ void main() {
|
| local2 = /*warning:DOWN_CAST_COMPOSITE*/local;
|
|
|
| // Non-generic function cannot subtype a generic one.
|
| - local = /*severe:STATIC_TYPE_ERROR*/(x) => null;
|
| - local = /*severe:STATIC_TYPE_ERROR*/nonGenericFn;
|
| + local = /*severe:STATIC_TYPE_ERROR, warning:INVALID_ASSIGNMENT*/(x) => null;
|
| + local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
|
| }
|
| }
|
| ''');
|
| @@ -1313,6 +1314,7 @@ void main() {
|
| lOfDs = lOfDs;
|
| lOfDs = lOfOs;
|
| lOfDs = lOfAs;
|
| + lOfDs = new L(); // Reset type propagation.
|
| }
|
| {
|
| lOfOs = mOfDs;
|
| @@ -1321,14 +1323,16 @@ void main() {
|
| lOfOs = lOfDs;
|
| lOfOs = lOfOs;
|
| lOfOs = lOfAs;
|
| + lOfOs = new L<Object>(); // Reset type propagation.
|
| }
|
| {
|
| lOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
|
| - lOfAs = /*severe:STATIC_TYPE_ERROR*/mOfOs;
|
| + lOfAs = /*warning:INVALID_ASSIGNMENT*/mOfOs;
|
| lOfAs = mOfAs;
|
| lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
|
| lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
|
| lOfAs = lOfAs;
|
| + lOfAs = new L<A>(); // Reset type propagation.
|
| }
|
| {
|
| mOfDs = mOfDs;
|
| @@ -1337,6 +1341,7 @@ void main() {
|
| mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
|
| mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
|
| mOfDs = /*warning:DOWN_CAST_COMPOSITE*/lOfAs;
|
| + mOfDs = new M(); // Reset type propagation.
|
| }
|
| {
|
| mOfOs = mOfDs;
|
| @@ -1344,7 +1349,8 @@ void main() {
|
| mOfOs = mOfAs;
|
| mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
|
| mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
|
| - mOfOs = /*severe:STATIC_TYPE_ERROR*/lOfAs;
|
| + mOfOs = /*warning:INVALID_ASSIGNMENT*/lOfAs;
|
| + mOfOs = new M<Object>(); // Reset type propagation.
|
| }
|
| {
|
| mOfAs = /*warning:DOWN_CAST_COMPOSITE*/mOfDs;
|
| @@ -1354,7 +1360,6 @@ void main() {
|
| mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
|
| mOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfAs;
|
| }
|
| -
|
| }
|
| ''');
|
| });
|
| @@ -1367,9 +1372,9 @@ void main() {
|
| String s = "hello";
|
| {
|
| List<int> l = <int>[i];
|
| - l = <int>[/*severe:STATIC_TYPE_ERROR*/s];
|
| + l = <int>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
|
| l = <int>[/*info:DOWN_CAST_IMPLICIT*/n];
|
| - l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*severe:STATIC_TYPE_ERROR*/s];
|
| + l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
|
| }
|
| {
|
| List l = [i];
|
| @@ -1379,11 +1384,11 @@ void main() {
|
| }
|
| {
|
| Map<String, int> m = <String, int>{s: i};
|
| - m = <String, int>{s: /*severe:STATIC_TYPE_ERROR*/s};
|
| + m = <String, int>{s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
|
| m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n};
|
| m = <String, int>{s: i,
|
| s: /*info:DOWN_CAST_IMPLICIT*/n,
|
| - s: /*severe:STATIC_TYPE_ERROR*/s};
|
| + s: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
|
| }
|
| // TODO(leafp): We can't currently test for key errors since the
|
| // error marker binds to the entire entry.
|
| @@ -1406,7 +1411,9 @@ void main() {
|
| checkFile('''
|
| class A {
|
| static const num n = 3.0;
|
| - static const int i = /*info:ASSIGNMENT_CAST*/n;
|
| + // The severe error is from constant evaluation where we know the
|
| + // concrete type.
|
| + static const int /*severe:VARIABLE_TYPE_MISMATCH*/i = /*info:ASSIGNMENT_CAST*/n;
|
| final int fi;
|
| const A(num a) : this.fi = /*info:DOWN_CAST_IMPLICIT*/a;
|
| }
|
| @@ -1414,7 +1421,7 @@ void main() {
|
| const B(Object a) : super(/*info:DOWN_CAST_IMPLICIT*/a);
|
| }
|
| void foo(Object o) {
|
| - var a = const A(/*info:DOWN_CAST_IMPLICIT*/o);
|
| + var a = const A(/*info:DOWN_CAST_IMPLICIT, severe:CONST_WITH_NON_CONSTANT_ARGUMENT, severe:INVALID_CONSTANT*/o);
|
| }
|
| ''');
|
| });
|
| @@ -1435,7 +1442,7 @@ void main() {
|
| test('unbound redirecting constructor', () {
|
| checkFile('''
|
| class Foo {
|
| - Foo() : this.init();
|
| + Foo() : /*severe:REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR*/this.init();
|
| }
|
| ''');
|
| });
|
| @@ -1444,7 +1451,7 @@ void main() {
|
| checkFile('''
|
| class A {
|
| A(A x) {}
|
| - A.two() : this(/*severe:STATIC_TYPE_ERROR*/3);
|
| + A.two() : this(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
|
| }
|
| ''');
|
| });
|
| @@ -1453,7 +1460,7 @@ void main() {
|
| checkFile('''
|
| class A { A(A x) {} }
|
| class B extends A {
|
| - B() : super(/*severe:STATIC_TYPE_ERROR*/3);
|
| + B() : super(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
|
| }
|
| ''');
|
| });
|
| @@ -1513,7 +1520,7 @@ void main() {
|
| var _f3;
|
| get _f4 => null;
|
|
|
| - int _m1();
|
| + int _m1() => null;
|
| }
|
|
|
| class GrandChild extends main.Child {
|
| @@ -1521,7 +1528,8 @@ void main() {
|
| /*severe:INVALID_FIELD_OVERRIDE*/var _f3;
|
| var _f4;
|
|
|
| - /*severe:INVALID_METHOD_OVERRIDE*/String _m1();
|
| + /*severe:INVALID_METHOD_OVERRIDE*/String
|
| + /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/_m1() => null;
|
| }
|
| ''',
|
| name: '/helper.dart');
|
| @@ -1533,7 +1541,7 @@ void main() {
|
| var _f2;
|
| var _f4;
|
|
|
| - String _m1();
|
| + String _m1() => null;
|
| }
|
| ''');
|
| });
|
| @@ -1580,7 +1588,7 @@ void main() {
|
| /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
|
| }
|
|
|
| - class Child2 implements Base {
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implements Base {
|
| /*severe:INVALID_METHOD_OVERRIDE*/A get f1 => null;
|
| C get f2 => null;
|
| get f3 => null;
|
| @@ -1664,21 +1672,21 @@ void main() {
|
| class C extends B {}
|
|
|
| class Base {
|
| - B m1(B a);
|
| - B m2(B a);
|
| - B m3(B a);
|
| - B m4(B a);
|
| - B m5(B a);
|
| - B m6(B a);
|
| + B m1(B a) => null;
|
| + B m2(B a) => null;
|
| + B m3(B a) => null;
|
| + B m4(B a) => null;
|
| + B m5(B a) => null;
|
| + B m6(B a) => null;
|
| }
|
|
|
| class Child extends Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/A m1(A value) {}
|
| - /*severe:INVALID_METHOD_OVERRIDE*/C m2(C value) {}
|
| - /*severe:INVALID_METHOD_OVERRIDE*/A m3(C value) {}
|
| - C m4(A value) {}
|
| - m5(value) {}
|
| - /*severe:INVALID_METHOD_OVERRIDE*/dynamic m6(dynamic value) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/A m1(A value) => null;
|
| + /*severe:INVALID_METHOD_OVERRIDE*/C m2(C value) => null;
|
| + /*severe:INVALID_METHOD_OVERRIDE*/A m3(C value) => null;
|
| + C m4(A value) => null;
|
| + m5(value) => null;
|
| + /*severe:INVALID_METHOD_OVERRIDE*/dynamic m6(dynamic value) => null;
|
| }
|
| ''');
|
| });
|
| @@ -1693,7 +1701,8 @@ void main() {
|
| }
|
|
|
| class Derived<S extends A> extends Base<B> {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/S foo() => null;
|
| + /*severe:INVALID_METHOD_OVERRIDE*/S
|
| + /*warning:INVALID_METHOD_OVERRIDE_RETURN_TYPE*/foo() => null;
|
| }
|
|
|
| class Derived2<S extends B> extends Base<B> {
|
| @@ -1758,14 +1767,14 @@ void main() {
|
| dynamic x;
|
| if (x is int) {
|
| int y = x;
|
| - String z = /*severe:STATIC_TYPE_ERROR*/x;
|
| + String z = /*warning:INVALID_ASSIGNMENT*/x;
|
| }
|
| }
|
| g() {
|
| Object x;
|
| if (x is int) {
|
| int y = x;
|
| - String z = /*severe:STATIC_TYPE_ERROR*/x;
|
| + String z = /*warning:INVALID_ASSIGNMENT*/x;
|
| }
|
| }
|
| ''');
|
| @@ -1774,10 +1783,10 @@ void main() {
|
| test('unary operators', () {
|
| checkFile('''
|
| class A {
|
| - A operator ~() {}
|
| - A operator +(int x) {}
|
| - A operator -(int x) {}
|
| - A operator -() {}
|
| + A operator ~() => null;
|
| + A operator +(int x) => null;
|
| + A operator -(int x) => null;
|
| + A operator -() => null;
|
| }
|
|
|
| foo() => new A();
|
| @@ -1790,7 +1799,7 @@ void main() {
|
| ~a;
|
| (/*info:DYNAMIC_INVOKE*/~d);
|
|
|
| - !/*severe:STATIC_TYPE_ERROR*/a;
|
| + !/*warning:NON_BOOL_NEGATION_EXPRESSION*/a;
|
| !/*info:DYNAMIC_CAST*/d;
|
|
|
| -a;
|
| @@ -1811,22 +1820,22 @@ void main() {
|
| test('binary and index operators', () {
|
| checkFile('''
|
| class A {
|
| - A operator *(B b) {}
|
| - A operator /(B b) {}
|
| - A operator ~/(B b) {}
|
| - A operator %(B b) {}
|
| - A operator +(B b) {}
|
| - A operator -(B b) {}
|
| - A operator <<(B b) {}
|
| - A operator >>(B b) {}
|
| - A operator &(B b) {}
|
| - A operator ^(B b) {}
|
| - A operator |(B b) {}
|
| - A operator[](B b) {}
|
| + A operator *(B b) => null;
|
| + A operator /(B b) => null;
|
| + A operator ~/(B b) => null;
|
| + A operator %(B b) => null;
|
| + A operator +(B b) => null;
|
| + A operator -(B b) => null;
|
| + A operator <<(B b) => null;
|
| + A operator >>(B b) => null;
|
| + A operator &(B b) => null;
|
| + A operator ^(B b) => null;
|
| + A operator |(B b) => null;
|
| + A operator[](B b) => null;
|
| }
|
|
|
| class B {
|
| - A operator -(B b) {}
|
| + A operator -(B b) => null;
|
| }
|
|
|
| foo() => new A();
|
| @@ -1841,9 +1850,9 @@ void main() {
|
| a = a ~/ b;
|
| a = a % b;
|
| a = a + b;
|
| - a = a + /*severe:STATIC_TYPE_ERROR*/a;
|
| + a = a + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
|
| a = a - b;
|
| - b = /*severe:STATIC_TYPE_ERROR*/b - b;
|
| + b = /*warning:INVALID_ASSIGNMENT*/b - b;
|
| a = a << b;
|
| a = a >> b;
|
| a = a & b;
|
| @@ -1855,20 +1864,20 @@ void main() {
|
| int y = 42;
|
| x = x + x;
|
| x = x + /*info:DYNAMIC_CAST*/c;
|
| - x = x + /*severe:STATIC_TYPE_ERROR*/y;
|
| + x = x + /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y;
|
|
|
| bool p = true;
|
| p = p && p;
|
| p = p && /*info:DYNAMIC_CAST*/c;
|
| p = (/*info:DYNAMIC_CAST*/c) && p;
|
| p = (/*info:DYNAMIC_CAST*/c) && /*info:DYNAMIC_CAST*/c;
|
| - p = (/*severe:STATIC_TYPE_ERROR*/y) && p;
|
| + p = /*warning:NON_BOOL_OPERAND*/y && p;
|
| p = c == y;
|
|
|
| a = a[b];
|
| a = a[/*info:DYNAMIC_CAST*/c];
|
| c = (/*info:DYNAMIC_INVOKE*/c[b]);
|
| - a[/*severe:STATIC_TYPE_ERROR*/y];
|
| + a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/y];
|
| }
|
| ''');
|
| });
|
| @@ -1893,27 +1902,27 @@ void main() {
|
| test('compound assignments', () {
|
| checkFile('''
|
| class A {
|
| - A operator *(B b) {}
|
| - A operator /(B b) {}
|
| - A operator ~/(B b) {}
|
| - A operator %(B b) {}
|
| - A operator +(B b) {}
|
| - A operator -(B b) {}
|
| - A operator <<(B b) {}
|
| - A operator >>(B b) {}
|
| - A operator &(B b) {}
|
| - A operator ^(B b) {}
|
| - A operator |(B b) {}
|
| - D operator [](B index) {}
|
| - void operator []=(B index, D value) {}
|
| + A operator *(B b) => null;
|
| + A operator /(B b) => null;
|
| + A operator ~/(B b) => null;
|
| + A operator %(B b) => null;
|
| + A operator +(B b) => null;
|
| + A operator -(B b) => null;
|
| + A operator <<(B b) => null;
|
| + A operator >>(B b) => null;
|
| + A operator &(B b) => null;
|
| + A operator ^(B b) => null;
|
| + A operator |(B b) => null;
|
| + D operator [](B index) => null;
|
| + void operator []=(B index, D value) => null;
|
| }
|
|
|
| class B {
|
| - A operator -(B b) {}
|
| + A operator -(B b) => null;
|
| }
|
|
|
| class D {
|
| - D operator +(D d) {}
|
| + D operator +(D d) => null;
|
| }
|
|
|
| foo() => new A();
|
| @@ -1921,7 +1930,7 @@ void main() {
|
| test() {
|
| int x = 0;
|
| x += 5;
|
| - (/*severe:STATIC_TYPE_ERROR*/x += 3.14);
|
| + /*severe:STATIC_TYPE_ERROR*/x += 3.14;
|
|
|
| double y = 0.0;
|
| y += 5;
|
| @@ -1951,22 +1960,22 @@ void main() {
|
| a ~/= b;
|
| a %= b;
|
| a += b;
|
| - a += /*severe:STATIC_TYPE_ERROR*/a;
|
| + a += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/a;
|
| a -= b;
|
| - (/*severe:STATIC_TYPE_ERROR*/b -= b);
|
| + /*severe:STATIC_TYPE_ERROR*/b -= /*warning:INVALID_ASSIGNMENT*/b;
|
| a <<= b;
|
| a >>= b;
|
| a &= b;
|
| a ^= b;
|
| a |= b;
|
| - (/*info:DYNAMIC_INVOKE*/c += b);
|
| + /*info:DYNAMIC_INVOKE*/c += b;
|
|
|
| var d = new D();
|
| a[b] += d;
|
| a[/*info:DYNAMIC_CAST*/c] += d;
|
| - a[/*severe:STATIC_TYPE_ERROR*/z] += d;
|
| + a[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z] += d;
|
| a[b] += /*info:DYNAMIC_CAST*/c;
|
| - a[b] += /*severe:STATIC_TYPE_ERROR*/z;
|
| + a[b] += /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/z;
|
| /*info:DYNAMIC_INVOKE,info:DYNAMIC_INVOKE*/c[b] += d;
|
| }
|
| ''');
|
| @@ -2011,7 +2020,7 @@ void main() {
|
| checkFile('''
|
| foo() {
|
| for (int i = 0; i < 10; i++) {
|
| - i = /*severe:STATIC_TYPE_ERROR*/"hi";
|
| + i = /*warning:INVALID_ASSIGNMENT*/"hi";
|
| }
|
| }
|
| bar() {
|
| @@ -2043,35 +2052,43 @@ void main() {
|
| }
|
|
|
| class T1 extends Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/B get f => null;
|
| + /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B get
|
| + /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
|
| }
|
|
|
| class T2 extends Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/set f(B b) => null;
|
| + /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/set f(
|
| + /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
|
| }
|
|
|
| class T3 extends Base {
|
| - /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/final B f;
|
| + /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/final B
|
| + /*warning:FINAL_NOT_INITIALIZED, warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f;
|
| }
|
| class T4 extends Base {
|
| // two: one for the getter one for the setter.
|
| - /*severe:INVALID_FIELD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/B f;
|
| + /*severe:INVALID_FIELD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
|
| + /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
|
| }
|
|
|
| - class T5 implements Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/B get f => null;
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Base {
|
| + /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/B get
|
| + /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f => null;
|
| }
|
|
|
| - class T6 implements Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/set f(B b) => null;
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Base {
|
| + /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, severe:INVALID_METHOD_OVERRIDE*/set f(
|
| + /*warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/B b) => null;
|
| }
|
|
|
| - class T7 implements Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/final B f;
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T7 implements Base {
|
| + /*severe:INVALID_METHOD_OVERRIDE*/final B
|
| + /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE*/f = null;
|
| }
|
| class T8 implements Base {
|
| // two: one for the getter one for the setter.
|
| - /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/B f;
|
| + /*severe:INVALID_METHOD_OVERRIDE, severe:INVALID_METHOD_OVERRIDE*/B
|
| + /*warning:INVALID_GETTER_OVERRIDE_RETURN_TYPE, warning:INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE*/f;
|
| }
|
| ''');
|
| });
|
| @@ -2086,7 +2103,8 @@ void main() {
|
| }
|
|
|
| class Test extends Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2103,7 +2121,8 @@ void main() {
|
| }
|
|
|
| class Test extends Parent {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| /*severe:INVALID_FIELD_OVERRIDE*/int x;
|
| }
|
| ''');
|
| @@ -2123,7 +2142,8 @@ void main() {
|
|
|
| class Test extends Parent {
|
| // Reported only once
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2137,7 +2157,8 @@ void main() {
|
| m(A a) {}
|
| }
|
| class Parent extends Grandparent {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
|
|
| class Test extends Parent {
|
| @@ -2164,9 +2185,12 @@ void main() {
|
| int x;
|
| }
|
|
|
| - class T1 extends Base with /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
|
| - class T2 extends Base with /*severe:INVALID_METHOD_OVERRIDE*/M1, /*severe:INVALID_FIELD_OVERRIDE*/M2 {}
|
| - class T3 extends Base with /*severe:INVALID_FIELD_OVERRIDE*/M2, /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
|
| + with /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base
|
| + with /*severe:INVALID_METHOD_OVERRIDE*/M1, /*severe:INVALID_FIELD_OVERRIDE*/M2 {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base
|
| + with /*severe:INVALID_FIELD_OVERRIDE*/M2, /*severe:INVALID_METHOD_OVERRIDE*/M1 {}
|
| ''');
|
| });
|
|
|
| @@ -2188,7 +2212,9 @@ void main() {
|
| int x;
|
| }
|
|
|
| - class T1 extends Base with M1, /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/M2 {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
|
| + with M1,
|
| + /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_FIELD_OVERRIDE*/M2 {}
|
| ''');
|
| });
|
|
|
| @@ -2216,7 +2242,7 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Base
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
|
| with M1, /*severe:INVALID_METHOD_OVERRIDE*/M2, M3 {}
|
| ''');
|
| });
|
| @@ -2231,7 +2257,8 @@ void main() {
|
| }
|
|
|
| class T1 implements I {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2249,9 +2276,8 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| -
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I {}
|
| ''');
|
| });
|
|
|
| @@ -2268,8 +2294,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| + implements I {}
|
| ''');
|
| });
|
|
|
| @@ -2288,14 +2315,16 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| implements I1 {}
|
|
|
| class T2 extends Base implements I1 {
|
| /*severe:INVALID_METHOD_OVERRIDE,severe:INVALID_METHOD_OVERRIDE*/m(a) {}
|
| }
|
|
|
| - class T3 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/Base
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T3
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/Base
|
| implements I1 {}
|
|
|
| class T4 extends Object with Base implements I1 {
|
| @@ -2317,7 +2346,8 @@ void main() {
|
| abstract class I2 implements I1 {}
|
|
|
| class T1 implements I2 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2332,7 +2362,8 @@ void main() {
|
| abstract class I2 extends I1 {}
|
|
|
| class T1 implements I2 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2347,7 +2378,8 @@ void main() {
|
| abstract class I2 extends Object with M1 {}
|
|
|
| class T1 implements I2 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2362,7 +2394,8 @@ void main() {
|
| abstract class Base implements I1 {}
|
|
|
| class T1 extends Base {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2375,15 +2408,14 @@ void main() {
|
| m(A a);
|
| }
|
|
|
| - // See issue #25
|
| - /*pass should be warning:AnalyzerError*/class Base implements I1 {
|
| - }
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
|
| + implements I1 {}
|
|
|
| class T1 extends Base {
|
| // not reported technically because if the class is concrete,
|
| // it should implement all its interfaces and hence it is
|
| // sufficient to check overrides against it.
|
| - m(B a) {}
|
| + m(/*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2404,9 +2436,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| + implements I2 {}
|
| ''');
|
| });
|
| test('superclass of interface of child', () {
|
| @@ -2423,9 +2455,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| + implements I2 {}
|
| ''');
|
| });
|
| test('mixin of interface of child', () {
|
| @@ -2442,9 +2474,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| + implements I2 {}
|
| ''');
|
| });
|
| test('interface of abstract superclass', () {
|
| @@ -2461,8 +2493,8 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Base with /*severe:INVALID_METHOD_OVERRIDE*/M {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
|
| + with /*severe:INVALID_METHOD_OVERRIDE*/M {}
|
| ''');
|
| });
|
| test('interface of concrete superclass', () {
|
| @@ -2474,16 +2506,15 @@ void main() {
|
| m(A a);
|
| }
|
|
|
| - // See issue #25
|
| - /*pass should be warning:AnalyzerError*/class Base implements I1 {
|
| - }
|
| + class /*warning:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base
|
| + implements I1 {}
|
|
|
| class M {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 extends Base with M {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
|
| + with M {}
|
| ''');
|
| });
|
| });
|
| @@ -2503,9 +2534,8 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base implements I2 {}
|
| ''');
|
| });
|
| test('superclass of interface of child', () {
|
| @@ -2522,9 +2552,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| + implements I2 {}
|
| ''');
|
| });
|
| test('mixin of interface of child', () {
|
| @@ -2541,9 +2571,9 @@ void main() {
|
| m(B a) {}
|
| }
|
|
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| - implements I2 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| + implements I2 {}
|
| ''');
|
| });
|
| test('interface of abstract superclass', () {
|
| @@ -2556,7 +2586,8 @@ void main() {
|
| }
|
|
|
| abstract class Base implements I1 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
|
|
| class T1 extends Base {
|
| @@ -2579,7 +2610,8 @@ void main() {
|
| }
|
|
|
| class Base implements I1 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
|
|
| class T1 extends Base {
|
| @@ -2602,11 +2634,11 @@ void main() {
|
| m(A a);
|
| }
|
|
|
| - class Base {
|
| - }
|
| + class Base {}
|
|
|
| class T1 implements I2 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
| ''');
|
| });
|
| @@ -2621,20 +2653,21 @@ void main() {
|
| }
|
|
|
| class Base {
|
| - m(B a);
|
| + m(B a) {}
|
| }
|
|
|
| // Note: no error reported in `extends Base` to avoid duplicating
|
| // the error in T1.
|
| class T1 extends Base implements I1 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
|
|
| // If there is no error in the class, we do report the error at
|
| // the base class:
|
| - class T2 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| - implements I1 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| + implements I1 {}
|
| ''');
|
| });
|
|
|
| @@ -2648,16 +2681,17 @@ void main() {
|
| }
|
|
|
| class M {
|
| - m(B a);
|
| + m(B a) {}
|
| }
|
|
|
| class T1 extends Object with M implements I1 {
|
| - /*severe:INVALID_METHOD_OVERRIDE*/m(B a) {}
|
| + /*severe:INVALID_METHOD_OVERRIDE*/m(
|
| + /*warning:INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE*/B a) {}
|
| }
|
|
|
| - class T2 extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I1 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
|
| + extends Object with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| + implements I1 {}
|
| ''');
|
| });
|
|
|
| @@ -2677,16 +2711,15 @@ void main() {
|
| class Parent1 extends Grandparent {
|
| m(B a) {}
|
| }
|
| - class Parent2 extends Grandparent {
|
| - }
|
| + class Parent2 extends Grandparent {}
|
|
|
| // Note: otherwise both errors would be reported on this line
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Parent1
|
| - implements I1 {
|
| - }
|
| - class T2 /*severe:INVALID_METHOD_OVERRIDE*/extends Parent2
|
| - implements I1 {
|
| - }
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Parent1
|
| + implements I1 {}
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T2
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Parent2
|
| + implements I1 {}
|
| ''');
|
| });
|
|
|
| @@ -2710,11 +2743,10 @@ void main() {
|
| // Here we want to report both, because the error location is
|
| // different.
|
| // TODO(sigmund): should we merge these as well?
|
| - class T1 extends Object
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object
|
| with /*severe:INVALID_METHOD_OVERRIDE*/M1,
|
| /*severe:INVALID_METHOD_OVERRIDE*/M2
|
| - implements I1 {
|
| - }
|
| + implements I1 {}
|
| ''');
|
| });
|
|
|
| @@ -2738,10 +2770,10 @@ void main() {
|
| // Here we want to report both, because the error location is
|
| // different.
|
| // TODO(sigmund): should we merge these as well?
|
| - class T1 /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| + class /*warning:INCONSISTENT_METHOD_INHERITANCE*/T1
|
| + /*severe:INVALID_METHOD_OVERRIDE*/extends Base
|
| with /*severe:INVALID_METHOD_OVERRIDE*/M
|
| - implements I1 {
|
| - }
|
| + implements I1 {}
|
| ''');
|
| });
|
| });
|
| @@ -2810,24 +2842,27 @@ void main() {
|
|
|
| foo1() async => x;
|
| Future foo2() async => x;
|
| - Future<int> foo3() async => (/*info:DYNAMIC_CAST*/x);
|
| - Future<int> foo4() async => (new Future<int>.value(/*info:DYNAMIC_CAST*/x));
|
| - Future<int> foo5() async => (/*severe:STATIC_TYPE_ERROR*/new Future<String>.value(/*info:DYNAMIC_CAST*/x));
|
| + Future<int> foo3() async => /*info:DYNAMIC_CAST*/x;
|
| + Future<int> foo4() async => new Future<int>.value(/*info:DYNAMIC_CAST*/x);
|
| + Future<int> foo5() async =>
|
| + /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
|
|
|
| bar1() async { return x; }
|
| Future bar2() async { return x; }
|
| - Future<int> bar3() async { return (/*info:DYNAMIC_CAST*/x); }
|
| - Future<int> bar4() async { return (new Future<int>.value(/*info:DYNAMIC_CAST*/x)); }
|
| - Future<int> bar5() async { return (/*severe:STATIC_TYPE_ERROR*/new Future<String>.value(/*info:DYNAMIC_CAST*/x)); }
|
| + Future<int> bar3() async { return /*info:DYNAMIC_CAST*/x; }
|
| + Future<int> bar4() async { return new Future<int>.value(/*info:DYNAMIC_CAST*/x); }
|
| + Future<int> bar5() async {
|
| + return /*warning:RETURN_OF_INVALID_TYPE*/new Future<String>.value(/*info:DYNAMIC_CAST*/x);
|
| + }
|
|
|
| int y;
|
| Future<int> z;
|
|
|
| - void baz() async {
|
| + baz() async {
|
| int a = /*info:DYNAMIC_CAST*/await x;
|
| int b = await y;
|
| int c = await z;
|
| - String d = /*severe:STATIC_TYPE_ERROR*/await z;
|
| + String d = /*warning:INVALID_ASSIGNMENT*/await z;
|
| }
|
|
|
| Future<bool> get issue_264 async {
|
| @@ -2849,33 +2884,31 @@ void main() {
|
|
|
| bar1() async* { yield x; }
|
| Stream bar2() async* { yield x; }
|
| - Stream<int> bar3() async* { yield (/*info:DYNAMIC_CAST*/x); }
|
| - Stream<int> bar4() async* { yield (/*severe:STATIC_TYPE_ERROR*/new Stream<int>()); }
|
| + Stream<int> bar3() async* { yield /*info:DYNAMIC_CAST*/x; }
|
| + Stream<int> bar4() async* { yield /*warning:YIELD_OF_INVALID_TYPE*/new Stream<int>(); }
|
|
|
| - baz1() async* { yield* (/*info:DYNAMIC_CAST*/x); }
|
| - Stream baz2() async* { yield* (/*info:DYNAMIC_CAST*/x); }
|
| - Stream<int> baz3() async* { yield* (/*warning:DOWN_CAST_COMPOSITE*/x); }
|
| + baz1() async* { yield* /*info:DYNAMIC_CAST*/x; }
|
| + Stream baz2() async* { yield* /*info:DYNAMIC_CAST*/x; }
|
| + Stream<int> baz3() async* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
|
| Stream<int> baz4() async* { yield* new Stream<int>(); }
|
| - Stream<int> baz5() async* { yield* (/*info:INFERRED_TYPE_ALLOCATION*/new Stream()); }
|
| + Stream<int> baz5() async* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new Stream(); }
|
| ''');
|
| });
|
|
|
| test('sync*', () {
|
| checkFile('''
|
| - import 'dart:async';
|
| -
|
| dynamic x;
|
|
|
| bar1() sync* { yield x; }
|
| Iterable bar2() sync* { yield x; }
|
| - Iterable<int> bar3() sync* { yield (/*info:DYNAMIC_CAST*/x); }
|
| - Iterable<int> bar4() sync* { yield (/*severe:STATIC_TYPE_ERROR*/new Iterable<int>()); }
|
| -
|
| - baz1() sync* { yield* (/*info:DYNAMIC_CAST*/x); }
|
| - Iterable baz2() sync* { yield* (/*info:DYNAMIC_CAST*/x); }
|
| - Iterable<int> baz3() sync* { yield* (/*warning:DOWN_CAST_COMPOSITE*/x); }
|
| - Iterable<int> baz4() sync* { yield* new Iterable<int>(); }
|
| - Iterable<int> baz5() sync* { yield* (/*info:INFERRED_TYPE_ALLOCATION*/new Iterable()); }
|
| + Iterable<int> bar3() sync* { yield /*info:DYNAMIC_CAST*/x; }
|
| + Iterable<int> bar4() sync* { yield /*warning:YIELD_OF_INVALID_TYPE*/bar3(); }
|
| +
|
| + baz1() sync* { yield* /*info:DYNAMIC_CAST*/x; }
|
| + Iterable baz2() sync* { yield* /*info:DYNAMIC_CAST*/x; }
|
| + Iterable<int> baz3() sync* { yield* /*warning:DOWN_CAST_COMPOSITE*/x; }
|
| + Iterable<int> baz4() sync* { yield* bar3(); }
|
| + Iterable<int> baz5() sync* { yield* /*info:INFERRED_TYPE_ALLOCATION*/new List(); }
|
| ''');
|
| });
|
| });
|
|
|