| 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 3286d2131411599d24520ff3373b5a8790753544..11e697a6b4e499461bd9628c21ffe5483a105823 100644
|
| --- a/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| @@ -315,6 +315,16 @@ test() {
|
| ''');
|
| }
|
|
|
| + void test_constructorInvalid() {
|
| + // Regression test for https://github.com/dart-lang/sdk/issues/26695
|
| + checkFile('''
|
| +class A {
|
| + B({ /*error:FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR*/this.test: 1.0 }) {}
|
| + final double test = 0.0;
|
| +}
|
| +''');
|
| + }
|
| +
|
| void test_constructors() {
|
| checkFile('''
|
| const num z = 25;
|
| @@ -349,16 +359,6 @@ void main() {
|
| ''');
|
| }
|
|
|
| - void test_constructorInvalid() {
|
| - // Regression test for https://github.com/dart-lang/sdk/issues/26695
|
| - checkFile('''
|
| -class A {
|
| - B({ /*error:FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR*/this.test: 1.0 }) {}
|
| - final double test = 0.0;
|
| -}
|
| -''');
|
| - }
|
| -
|
| void test_conversionAndDynamicInvoke() {
|
| addFile(
|
| '''
|
| @@ -1911,11 +1911,233 @@ main() {
|
| addFile('num n; int i = /*info:ASSIGNMENT_CAST*/n;');
|
| check();
|
| // TODO(jmesserly): should not be emitting the hint as well as the error.
|
| + // It is a "strong mode hint" however, so it will not be user visible.
|
| addFile(
|
| 'num n; int i = /*info:ASSIGNMENT_CAST,error:INVALID_ASSIGNMENT*/n;');
|
| check(implicitCasts: false);
|
| }
|
|
|
| + void test_implicitDynamic_field() {
|
| + addFile(r'''
|
| +class C {
|
| + var /*error:IMPLICIT_DYNAMIC_FIELD*/x0;
|
| + var /*error:IMPLICIT_DYNAMIC_FIELD*/x1 = (<dynamic>[])[0];
|
| + var /*error:IMPLICIT_DYNAMIC_FIELD*/x2,
|
| + x3 = 42,
|
| + /*error:IMPLICIT_DYNAMIC_FIELD*/x4;
|
| + dynamic y0;
|
| + dynamic y1 = (<dynamic>[])[0];
|
| +}
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_function() {
|
| + addFile(r'''
|
| +/*=T*/ a/*<T>*/(/*=T*/ t) => t;
|
| +/*=T*/ b/*<T>*/() => null;
|
| +
|
| +void main/*<S>*/() {
|
| + dynamic d;
|
| + int i;
|
| + /*error:IMPLICIT_DYNAMIC_FUNCTION*/a(d);
|
| + a(42);
|
| + /*error:IMPLICIT_DYNAMIC_FUNCTION*/b();
|
| + d = /*error:IMPLICIT_DYNAMIC_FUNCTION*/b();
|
| + i = b();
|
| +
|
| + void f/*<T>*/(/*=T*/ t) {};
|
| + /*=T*/ g/*<T>*/() => null;
|
| +
|
| + /*error:IMPLICIT_DYNAMIC_FUNCTION*/f(d);
|
| + f(42);
|
| + /*error:IMPLICIT_DYNAMIC_FUNCTION*/g();
|
| + d = /*error:IMPLICIT_DYNAMIC_FUNCTION*/g();
|
| + i = g();
|
| +
|
| + /*error:IMPLICIT_DYNAMIC_INVOKE*/(/*<T>*/(/*=T*/ t) => t)(d);
|
| + (/*<T>*/(/*=T*/ t) => t)(42);
|
| + (/*<T>*/() => null as dynamic/*=T*/)/*<int>*/();
|
| +}
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| + void test_implicitDynamic_listLiteral() {
|
| + addFile(r'''
|
| +
|
| +var l0 = /*error:IMPLICIT_DYNAMIC_LIST_LITERAL*/[];
|
| +List l1 = /*error:IMPLICIT_DYNAMIC_LIST_LITERAL*/[];
|
| +List<dynamic> l2 = /*error:IMPLICIT_DYNAMIC_LIST_LITERAL*/[];
|
| +dynamic d = 42;
|
| +var l3 = /*error:IMPLICIT_DYNAMIC_LIST_LITERAL*/[d, d];
|
| +
|
| +var l4 = <dynamic>[];
|
| +var l5 = <int>[];
|
| +List<int> l6 = /*info:INFERRED_TYPE_LITERAL*/[];
|
| +var l7 = /*info:INFERRED_TYPE_LITERAL*/[42];
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_mapLiteral() {
|
| + addFile(r'''
|
| +var m0 = /*error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{};
|
| +Map m1 = /*error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{};
|
| +Map<dynamic, dynamic> m2 = /*error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{};
|
| +dynamic d = 42;
|
| +var m3 = /*error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{d: d};
|
| +var m4 = /*info:INFERRED_TYPE_LITERAL,error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{'x': d, 'y': d};
|
| +var m5 = /*info:INFERRED_TYPE_LITERAL,error:IMPLICIT_DYNAMIC_MAP_LITERAL*/{d: 'x'};
|
| +
|
| +var m6 = <dynamic, dynamic>{};
|
| +var m7 = <String, String>{};
|
| +Map<String, String> m8 = /*info:INFERRED_TYPE_LITERAL*/{};
|
| +var m9 = /*info:INFERRED_TYPE_LITERAL*/{'hi': 'there'};
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_method() {
|
| + addFile(r'''
|
| +class C {
|
| + /*=T*/ m/*<T>*/(/*=T*/ s) => s;
|
| + /*=T*/ n/*<T>*/() => null;
|
| +}
|
| +class D<E> {
|
| + /*=T*/ m/*<T>*/(/*=T*/ s) => s;
|
| + /*=T*/ n/*<T>*/() => null;
|
| +}
|
| +void f() {
|
| + dynamic d;
|
| + int i;
|
| + new C()./*error:IMPLICIT_DYNAMIC_METHOD*/m(d);
|
| + new C().m(42);
|
| + new C()./*error:IMPLICIT_DYNAMIC_METHOD*/n();
|
| + d = new C()./*error:IMPLICIT_DYNAMIC_METHOD*/n();
|
| + i = new C().n();
|
| +
|
| + new D<int>()./*error:IMPLICIT_DYNAMIC_METHOD*/m(d);
|
| + new D<int>().m(42);
|
| + new D<int>()./*error:IMPLICIT_DYNAMIC_METHOD*/n();
|
| + d = new D<int>()./*error:IMPLICIT_DYNAMIC_METHOD*/n();
|
| + i = new D<int>().n();
|
| +}
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_parameter() {
|
| + addFile(r'''
|
| +const dynamic DYNAMIC_VALUE = 42;
|
| +
|
| +// simple formal
|
| +void f0(/*error:IMPLICIT_DYNAMIC_PARAMETER*/x) {}
|
| +void f1(dynamic x) {}
|
| +
|
| +// default formal
|
| +void df0([/*error:IMPLICIT_DYNAMIC_PARAMETER*/x = DYNAMIC_VALUE]) {}
|
| +void df1([dynamic x = DYNAMIC_VALUE]) {}
|
| +void df2([/*info:INFERRED_TYPE*/x = 42]) {}
|
| +
|
| +// default formal (named)
|
| +void nf0({/*error:IMPLICIT_DYNAMIC_PARAMETER*/x: DYNAMIC_VALUE}) {}
|
| +void nf1({dynamic x: DYNAMIC_VALUE}) {}
|
| +void nf2({/*info:INFERRED_TYPE*/x: 42}) {}
|
| +
|
| +// field formal
|
| +class C {
|
| + var /*error:IMPLICIT_DYNAMIC_FIELD*/x;
|
| + C(this.x);
|
| +}
|
| +
|
| +// function typed formal
|
| +void ftf0(void x(/*error:IMPLICIT_DYNAMIC_PARAMETER*/y)) {}
|
| +void ftf1(void x(int y)) {}
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_return() {
|
| + addFile(r'''
|
| +// function
|
| +/*error:IMPLICIT_DYNAMIC_RETURN*/f0() {}
|
| +dynamic f1() { return 42; }
|
| +
|
| +// nested function
|
| +void main() {
|
| + /*error:IMPLICIT_DYNAMIC_RETURN*/g0() {}
|
| + dynamic g1() { return 42; }
|
| +}
|
| +
|
| +// methods
|
| +class B {
|
| + int m1() => 42;
|
| +}
|
| +class C extends B {
|
| + /*error:IMPLICIT_DYNAMIC_RETURN*/m0() => 123;
|
| + m1() => 123;
|
| + dynamic m2() => 'hi';
|
| +}
|
| +
|
| +// accessors
|
| +set x(int value) {}
|
| +/*error:IMPLICIT_DYNAMIC_RETURN*/get y0 => 42;
|
| +dynamic get y1 => 42;
|
| +
|
| +// function typed formals
|
| +void ftf0(/*error:IMPLICIT_DYNAMIC_RETURN*/f(int x)) {}
|
| +void ftf1(dynamic f(int x)) {}
|
| +
|
| +// function expressions
|
| +var fe0 = (int x) => x as dynamic;
|
| +var fe1 = (int x) => x;
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_type() {
|
| + addFile(r'''
|
| +class C<T> {}
|
| +class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {}
|
| +class M2<T> {}
|
| +class I<T> {}
|
| +class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C
|
| + with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2
|
| + implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {}
|
| +
|
| +C f(D d) {
|
| + D x = new /*error:IMPLICIT_DYNAMIC_TYPE*/D();
|
| + D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D();
|
| + D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D();
|
| + return new /*error:IMPLICIT_DYNAMIC_TYPE*/C();
|
| +}
|
| +
|
| +class A<T extends num> {}
|
| +class N1<T extends List<int>> {}
|
| +class N2<T extends Object> {}
|
| +class J<T extends Object> {}
|
| +class B<T extends Object> extends A with N1, N2 implements J {}
|
| +A g(B b) {
|
| + B y = /*info:INFERRED_TYPE_ALLOCATION*/new B();
|
| + return /*info:INFERRED_TYPE_ALLOCATION*/new A();
|
| +}
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| + void test_implicitDynamic_variable() {
|
| + addFile(r'''
|
| +var /*error:IMPLICIT_DYNAMIC_VARIABLE*/x0;
|
| +var /*error:IMPLICIT_DYNAMIC_VARIABLE*/x1 = (<dynamic>[])[0];
|
| +var /*error:IMPLICIT_DYNAMIC_VARIABLE*/x2,
|
| + x3 = 42,
|
| + /*error:IMPLICIT_DYNAMIC_VARIABLE*/x4;
|
| +dynamic y0;
|
| +dynamic y1 = (<dynamic>[])[0];
|
| + ''');
|
| + check(implicitDynamic: false);
|
| + }
|
| +
|
| void test_invalidOverrides_baseClassOverrideToChildInterface() {
|
| checkFile('''
|
| class A {}
|
|
|