Move UNDEFINED_{GETTER,METHOD,OPERATOR,SETTER} tests to their own files

Change-Id: Iaf5049efdbf887f84d7db1444d5ea7d835a2c967
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/132806
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Sam Rawlins
2020-01-22 16:32:08 +00:00
committed by commit-bot@chromium.org
parent 6b32a519bf
commit e685ff5131
6 changed files with 330 additions and 344 deletions
@@ -1185,286 +1185,6 @@ E e() {
]);
}
test_undefinedGetter() async {
await assertErrorsInCode(r'''
class T {}
f(T e) { return e.m; }
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 29, 1),
]);
}
test_undefinedGetter_generic_function_call() async {
// Referencing `.call` on a `Function` type works similarly to referencing
// it on `dynamic`--the reference is accepted at compile time, and all type
// checking is deferred until runtime.
await assertErrorsInCode('''
f(Function f) {
return f.call;
}
''', []);
}
test_undefinedGetter_object_call() async {
await assertErrorsInCode('''
f(Object o) {
return o.call;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 25, 4),
]);
}
test_undefinedGetter_proxy_annotation_fakeProxy() async {
await assertErrorsInCode(r'''
library L;
class Fake {
const Fake();
}
const proxy = const Fake();
@proxy class PrefixProxy {}
main() {
new PrefixProxy().foo;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 127, 3),
]);
}
test_undefinedGetter_static() async {
await assertErrorsInCode(r'''
class A {}
var a = A.B;''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 21, 1),
]);
}
test_undefinedGetter_typeLiteral_cascadeTarget() async {
await assertErrorsInCode(r'''
class T {
static int get foo => 42;
}
main() {
T..foo;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 54, 3),
]);
}
test_undefinedGetter_typeLiteral_conditionalAccess() async {
// When applied to a type literal, the conditional access operator '?.'
// cannot be used to access instance getters of Type.
await assertErrorsInCode('''
class A {}
f() => A?.hashCode;
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 21, 8),
]);
}
test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() async {
await assertErrorsInCode(r'''
class A<K, V> {
K element;
}
main(A<int> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
]);
}
test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() async {
await assertErrorsInCode(r'''
class A<E> {
E element;
}
main(A<int,int> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
]);
}
test_undefinedGetter_wrongOfTypeArgument() async {
await assertErrorsInCode(r'''
class A<E> {
E element;
}
main(A<NoSuchType> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
]);
}
test_undefinedMethod_assignmentExpression() async {
await assertErrorsInCode(r'''
class A {}
class B {
f(A a) {
A a2 = new A();
a += a2;
}
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 58, 2),
]);
}
test_undefinedMethod_ignoreTypePropagation() async {
await assertErrorsInCode(r'''
class A {}
class B extends A {
m() {}
}
class C {
f() {
A a = new B();
a.m();
}
}
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 85, 1),
]);
}
test_undefinedMethod_leastUpperBoundWithNull() async {
await assertErrorsInCode('''
f(bool b, int i) => (b ? null : i).foo();
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 35, 3),
]);
}
test_undefinedMethod_ofNull() async {
// TODO(scheglov) Track https://github.com/dart-lang/sdk/issues/28430 to
// decide whether a warning should be reported here.
await assertErrorsInCode(r'''
Null f(int x) => null;
main() {
f(42).abs();
}
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 40, 3),
]);
}
test_undefinedMethodWithConstructor() async {
await assertErrorsInCode(r'''
class C {
C.m();
}
f() {
C c = C.m();
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 31, 1),
]);
}
test_undefinedOperator_indexBoth() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0]++;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_undefinedOperator_indexGetter() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0];
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_undefinedOperator_indexSetter() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0] = 1;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_undefinedOperator_plus() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a + 1;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 1),
]);
}
test_undefinedOperator_postfixExpression() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a++;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
]);
}
test_undefinedOperator_prefixExpression() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
++a;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 2),
]);
}
test_undefinedSetter() async {
await assertErrorsInCode(r'''
class T {}
f(T e1) { e1.m = 0; }
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 24, 1),
]);
}
test_undefinedSetter_static() async {
await assertErrorsInCode(r'''
class A {}
f() { A.B = 0;}
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 19, 1),
]);
}
test_undefinedSetter_typeLiteral_cascadeTarget() async {
await assertErrorsInCode(r'''
class T {
static void set foo(_) {}
}
main() {
T..foo = 42;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 54, 3),
]);
}
test_unqualifiedReferenceToNonLocalStaticMember_getter() async {
await assertErrorsInCode(r'''
class A {
@@ -1523,73 +1243,16 @@ class B extends A {
]);
}
test_wrongNumberOfTypeArguments_class_tooFew() async {
test_wrongNumberOfTypeArguments() async {
await assertErrorsInCode(r'''
class A<E, F> {}
A<A> a = null;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
]);
}
test_wrongNumberOfTypeArguments_class_tooMany() async {
await assertErrorsInCode(r'''
class A<E> {}
A<A, A> a = null;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
]);
}
test_wrongNumberOfTypeArguments_classAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
class B<F extends num> = A<F> with M;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
]);
}
test_wrongNumberOfTypeArguments_dynamic() async {
await assertErrorsInCode(r'''
dynamic<int> v;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
]);
}
test_wrongNumberOfTypeArguments_typeParameter() async {
await assertErrorsInCode(r'''
class C<T> {
T<int> f;
class A<E> {
E element;
}
main(A<NoSuchType> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
]);
}
test_wrongNumberOfTypeArguments_typeTest_tooFew() async {
await assertErrorsInCode(r'''
class A {}
class C<K, V> {}
f(p) {
return p is C<A>;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
]);
}
test_wrongNumberOfTypeArguments_typeTest_tooMany() async {
await assertErrorsInCode(r'''
class A {}
class C<E> {}
f(p) {
return p is C<A, A>;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
]);
}
@@ -46,6 +46,17 @@ f() {
]);
}
test_generic_function_call() async {
// Referencing `.call` on a `Function` type works similarly to referencing
// it on `dynamic`--the reference is accepted at compile time, and all type
// checking is deferred until runtime.
await assertErrorsInCode('''
f(Function f) {
return f.call;
}
''', []);
}
test_ifElement_inList_notPromoted() async {
await assertErrorsInCode('''
f(int x) {
@@ -122,6 +133,15 @@ f(Object x) {
''');
}
test_instance_undefined() async {
await assertErrorsInCode(r'''
class T {}
f(T e) { return e.m; }
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 29, 1),
]);
}
test_nullMember_undefined() async {
await assertErrorsInCode(r'''
m() {
@@ -133,6 +153,16 @@ m() {
]);
}
test_object_call() async {
await assertErrorsInCode('''
f(Object o) {
return o.call;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 25, 4),
]);
}
test_promotedTypeParameter_regress35305() async {
await assertErrorsInCode(r'''
void f<X extends num, Y extends X>(Y y) {
@@ -145,6 +175,22 @@ void f<X extends num, Y extends X>(Y y) {
]);
}
test_proxy_annotation_fakeProxy() async {
await assertErrorsInCode(r'''
library L;
class Fake {
const Fake();
}
const proxy = const Fake();
@proxy class PrefixProxy {}
main() {
new PrefixProxy().foo;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 127, 3),
]);
}
test_static_conditionalAcces_defined() async {
// The conditional access operator '?.' can be used to access static
// fields.
@@ -179,6 +225,30 @@ f(var p) {
]);
}
test_typeLiteral_cascadeTarget() async {
await assertErrorsInCode(r'''
class T {
static int get foo => 42;
}
main() {
T..foo;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 54, 3),
]);
}
test_typeLiteral_conditionalAccess() async {
// When applied to a type literal, the conditional access operator '?.'
// cannot be used to access instance getters of Type.
await assertErrorsInCode('''
class A {}
f() => A?.hashCode;
''', [
error(StaticTypeWarningCode.UNDEFINED_GETTER, 21, 8),
]);
}
test_typeSubstitution_defined() async {
await assertNoErrorsInCode(r'''
class A<E> {
@@ -18,6 +18,15 @@ main() {
@reflectiveTest
class UndefinedMethodTest extends DriverResolutionTest {
test_constructor_defined() async {
await assertNoErrorsInCode(r'''
class C {
C.m();
}
C c = C.m();
''');
}
test_functionExpression_callMethod_defined() async {
await assertNoErrorsInCode(r'''
main() {
@@ -34,6 +43,42 @@ main() {
''');
}
test_ignoreTypePropagation() async {
await assertErrorsInCode(r'''
class A {}
class B extends A {
m() {}
}
class C {
f() {
A a = new B();
a.m();
}
}
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 85, 1),
]);
}
test_leastUpperBoundWithNull() async {
await assertErrorsInCode('''
f(bool b, int i) => (b ? null : i).foo();
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 35, 3),
]);
}
test_method_undefined_onNull() async {
await assertErrorsInCode(r'''
Null f(int x) => null;
main() {
f(42).abs();
}
''', [
error(StaticTypeWarningCode.UNDEFINED_METHOD, 40, 3),
]);
}
test_static_conditionalAccess_defined() async {
// The conditional access operator '?.' can be used to access static
// methods.
@@ -18,6 +18,20 @@ main() {
@reflectiveTest
class UndefinedOperatorTest extends DriverResolutionTest {
test_assignmentExpression_undefined() async {
await assertErrorsInCode(r'''
class A {}
class B {
f(A a) {
A a2 = new A();
a += a2;
}
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 58, 2),
]);
}
test_binaryExpression() async {
await assertErrorsInCode(r'''
class A {}
@@ -107,6 +121,40 @@ f(A a) {
]);
}
test_indexBoth_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0]++;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_indexGetter_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0];
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_indexSetter_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a[0] = 1;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
test_minus_null() async {
await assertErrorsInCode(r'''
m() {
@@ -141,6 +189,17 @@ m() {
]);
}
test_plus_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a + 1;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 1),
]);
}
test_plusEq_null() async {
await assertErrorsInCode(r'''
m() {
@@ -190,6 +249,17 @@ f(var a) {
''');
}
test_postfixExpression_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
a++;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
]);
}
test_postfixInc_null() async {
await assertErrorsInCode(r'''
m() {
@@ -239,6 +309,17 @@ f(var a) {
''');
}
test_prefixExpression_undefined() async {
await assertErrorsInCode(r'''
class A {}
f(A a) {
++a;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 2),
]);
}
test_prefixInc_null() async {
await assertErrorsInCode(r'''
m() {
@@ -31,6 +31,15 @@ main() {
''');
}
test_instance_undefined() async {
await assertErrorsInCode(r'''
class T {}
f(T e1) { e1.m = 0; }
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 24, 1),
]);
}
test_inSubtype() async {
await assertErrorsInCode(r'''
class A {}
@@ -83,6 +92,28 @@ f(var p) {
error(StaticTypeWarningCode.UNDEFINED_SETTER, 75, 1),
]);
}
test_static_undefined() async {
await assertErrorsInCode(r'''
class A {}
f() { A.B = 0;}
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 19, 1),
]);
}
test_typeLiteral_cascadeTarget() async {
await assertErrorsInCode(r'''
class T {
static void set foo(_) {}
}
main() {
T..foo = 42;
}
''', [
error(StaticTypeWarningCode.UNDEFINED_SETTER, 54, 3),
]);
}
}
@reflectiveTest
@@ -15,6 +15,34 @@ main() {
@reflectiveTest
class WrongNumberOfTypeArgumentsTest extends DriverResolutionTest {
test_class_tooFew() async {
await assertErrorsInCode(r'''
class A<E, F> {}
A<A> a = null;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
]);
}
test_class_tooMany() async {
await assertErrorsInCode(r'''
class A<E> {}
A<A, A> a = null;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
]);
}
test_classAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
class B<F extends num> = A<F> with M;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
]);
}
test_const_nonGeneric() async {
await assertErrorsInCode('''
class C {
@@ -57,6 +85,14 @@ f() {
]);
}
test_dynamic() async {
await assertErrorsInCode(r'''
dynamic<int> v;
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
]);
}
test_new_nonGeneric() async {
await assertErrorsInCode('''
class C {}
@@ -92,4 +128,64 @@ f() {
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 34, 11),
]);
}
test_type_tooFew() async {
await assertErrorsInCode(r'''
class A<K, V> {
K element;
}
main(A<int> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
]);
}
test_type_tooMany() async {
await assertErrorsInCode(r'''
class A<E> {
E element;
}
main(A<int,int> a) {
a.element.anyGetterExistsInDynamic;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
]);
}
test_typeParameter() async {
await assertErrorsInCode(r'''
class C<T> {
T<int> f;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
]);
}
test_typeTest_tooFew() async {
await assertErrorsInCode(r'''
class A {}
class C<K, V> {}
f(p) {
return p is C<A>;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
]);
}
test_typeTest_tooMany() async {
await assertErrorsInCode(r'''
class A {}
class C<E> {}
f(p) {
return p is C<A, A>;
}
''', [
error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
]);
}
}