| Index: tests/compiler/dart2js/override_inheritance_test.dart
|
| diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart
|
| index 14071561a2830186f37acae4ad38abb8ee5cea32..0e247855d31b2c0c08753f8387061eec6d4dcccc 100644
|
| --- a/tests/compiler/dart2js/override_inheritance_test.dart
|
| +++ b/tests/compiler/dart2js/override_inheritance_test.dart
|
| @@ -1,1546 +1,1546 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -import 'dart:async';
|
| -import 'package:async_helper/async_helper.dart';
|
| -import 'compiler_helper.dart';
|
| -import 'package:compiler/src/resolution/class_members.dart'
|
| - show MembersCreator;
|
| -
|
| -main() {
|
| - asyncTest(() => Future.wait([
|
| - testRequiredParameters(),
|
| - testPositionalParameters(),
|
| - testNamedParameters(),
|
| - testNotSubtype(),
|
| - testGetterNotSubtype(),
|
| - testSetterNotSubtype(),
|
| - testGenericNotSubtype(),
|
| - testFieldNotSubtype(),
|
| - testMixedOverride(),
|
| - testAbstractMethods(),
|
| - testNoSuchMethod(),
|
| - ]));
|
| -}
|
| -
|
| -Future check(String source, {errors, warnings, hints, infos}) {
|
| - return MockCompiler.create((MockCompiler compiler) {
|
| - compiler.diagnosticHandler = createHandler(compiler, source);
|
| - compiler.parseScript(source);
|
| - var cls = compiler.mainApp.find('Class');
|
| - cls.ensureResolved(compiler);
|
| - MembersCreator.computeAllClassMembers(compiler, cls);
|
| -
|
| - toList(o) => o == null ? [] : o is List ? o : [o];
|
| -
|
| - compareMessageKinds(source, toList(errors), compiler.errors, 'error');
|
| -
|
| - compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');
|
| -
|
| - if (infos != null) {
|
| - compareMessageKinds(source, toList(infos), compiler.infos, 'info');
|
| - }
|
| -
|
| - if (hints != null) {
|
| - compareMessageKinds(source, toList(hints), compiler.hints, 'hint');
|
| - }
|
| - });
|
| -}
|
| -
|
| -Future testRequiredParameters() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - method() => null; // testRequiredParameters:0
|
| - }
|
| - class Class extends A {
|
| - method() => null; // testRequiredParameters:1
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a) => null; // testRequiredParameters:2
|
| - }
|
| - class Class extends A {
|
| - method(b) => null; // testRequiredParameters:3
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a, b, c, d) => null; // testRequiredParameters:3
|
| - }
|
| - class Class extends A {
|
| - method(b, a, d, c) => null; // testRequiredParameters:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method() => null; // testRequiredParameters:5
|
| - }
|
| - class Class extends A {
|
| - method(a) => null; // testRequiredParameters:6
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method() => null; // testRequiredParameters:7
|
| - }
|
| - class Class implements A {
|
| - method(a) => null; // testRequiredParameters:8
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a, b, c) => null; // testRequiredParameters:9
|
| - }
|
| - class Class extends A {
|
| - method(a, b, c, d) => null; // testRequiredParameters:10
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| - ]);
|
| -}
|
| -
|
| -Future testPositionalParameters() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - method([a]) => null; // testPositionalParameters:1
|
| - }
|
| - class Class extends A {
|
| - method([a]) => null; // testPositionalParameters:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method([a, b]) => null; // testPositionalParameters:3
|
| - }
|
| - class Class extends A {
|
| - method([b, a]) => null; // testPositionalParameters:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method([a, b, c]) => null; // testPositionalParameters:5
|
| - }
|
| - class Class extends A {
|
| - method([b, d, a, c]) => null; // testPositionalParameters:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method([a]) => null; // testPositionalParameters:7
|
| - }
|
| - class Class extends A {
|
| - method([a]) => null; // testPositionalParameters:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a) => null; // testPositionalParameters:9
|
| - }
|
| - class Class extends A {
|
| - method() => null; // testPositionalParameters:10
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a, [b]) => null; // testPositionalParameters:11
|
| - }
|
| - class Class extends A {
|
| - method(a) => null; // testPositionalParameters:12
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a, [b]) => null; // testPositionalParameters:13
|
| - }
|
| - class Class extends A {
|
| - method([a]) => null; // testPositionalParameters:14
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(a, b, [c, d, e]) => null; // testPositionalParameters:15
|
| - }
|
| - class Class extends A {
|
| - method([a, b, c, d]) => null; // testPositionalParameters:16
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| - ]);
|
| -}
|
| -
|
| -Future testNamedParameters() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - method({a}) => null; // testNamedParameters:1
|
| - }
|
| - class Class extends A {
|
| - method({a}) => null; // testNamedParameters:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method({a, b}) => null; // testNamedParameters:3
|
| - }
|
| - class Class extends A {
|
| - method({b, a}) => null; // testNamedParameters:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method({a, b, c}) => null; // testNamedParameters:5
|
| - }
|
| - class Class extends A {
|
| - method({b, c, a, d}) => null; // testNamedParameters:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(d, {a, b, c}) => null; // testNamedParameters:7
|
| - }
|
| - class Class extends A {
|
| - method(e, {b, c, a, d}) => null; // testNamedParameters:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method({a}) => null; // testNamedParameters:9
|
| - }
|
| - class Class extends A {
|
| - method() => null; // testNamedParameters:10
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method({a, b}) => null; // testNamedParameters:11
|
| - }
|
| - class Class extends A {
|
| - method({b}) => null; // testNamedParameters:12
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method({a, b, c, d}) => null; // testNamedParameters:13
|
| - }
|
| - class Class extends A {
|
| - method({a, e, d, c}) => null; // testNamedParameters:14
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| - ]);
|
| -}
|
| -
|
| -Future testNotSubtype() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:1
|
| - }
|
| - class Class extends A {
|
| - method(int a) => null; // testNotSubtype:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:3
|
| - }
|
| - class Class extends A {
|
| - method(num a) => null; // testNotSubtype:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - void method() {} // testNotSubtype:5
|
| - }
|
| - class Class extends A {
|
| - method() => null; // testNotSubtype:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method() => null; // testNotSubtype:7
|
| - }
|
| - class Class extends A {
|
| - void method() {} // testNotSubtype:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - void method() {} // testNotSubtype:9
|
| - }
|
| - class Class extends A {
|
| - int method() => null; // testNotSubtype:10
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int method() => null; // testNotSubtype:11
|
| - }
|
| - class Class extends A {
|
| - void method() {} // testNotSubtype:12
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:13
|
| - }
|
| - class B extends A {
|
| - method(num a) => null; // testNotSubtype:14
|
| - }
|
| - class Class extends B {
|
| - method(double a) => null; // testNotSubtype:15
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:16
|
| - }
|
| - class B extends A {
|
| - method(a) => null; // testNotSubtype:17
|
| - }
|
| - class Class extends B {
|
| - method(String a) => null; // testNotSubtype:18
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:19
|
| - }
|
| - class Class extends A {
|
| - method(String a) => null; // testNotSubtype:20
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:23
|
| - }
|
| - class B {
|
| - method(num a) => null; // testNotSubtype:24
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - method(double a) => null; // testNotSubtype:25
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(num a) => null; // testNotSubtype:29
|
| - }
|
| - class B {
|
| - method(int a) => null; // testNotSubtype:30
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - method(double a) => null; // testNotSubtype:31
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A {
|
| - method(int a) => null; // testNotSubtype:26
|
| - }
|
| - class B {
|
| - method(num a) => null; // testNotSubtype:27
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - method(String a) => null; // testNotSubtype:28
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| - MessageKind.INVALID_OVERRIDE_METHOD],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| - MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| - ]);
|
| -}
|
| -
|
| -Future testGetterNotSubtype() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - get getter => null; // testGetterNotSubtype:1
|
| - }
|
| - class Class extends A {
|
| - get getter => null; // testGetterNotSubtype:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num get getter => null; // testGetterNotSubtype:3
|
| - }
|
| - class Class extends A {
|
| - num get getter => null; // testGetterNotSubtype:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num get getter => null; // testGetterNotSubtype:5
|
| - }
|
| - class Class extends A {
|
| - int get getter => null; // testGetterNotSubtype:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:7
|
| - }
|
| - class Class extends A {
|
| - num get getter => null; // testGetterNotSubtype:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:9
|
| - }
|
| - class Class extends A {
|
| - double get getter => null; // testGetterNotSubtype:10
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:11
|
| - }
|
| - class B extends A {
|
| - num get getter => null; // testGetterNotSubtype:12
|
| - }
|
| - class Class extends B {
|
| - double get getter => null; // testGetterNotSubtype:13
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:14
|
| - }
|
| - class B {
|
| - num get getter => null; // testGetterNotSubtype:15
|
| - }
|
| - class Class extends A implements B {
|
| - double get getter => null; // testGetterNotSubtype:16
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:17
|
| - }
|
| - class B {
|
| - String get getter => null; // testGetterNotSubtype:18
|
| - }
|
| - class Class extends A implements B {
|
| - double get getter => null; // testGetterNotSubtype:19
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| - MessageKind.INVALID_OVERRIDE_GETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:20
|
| - }
|
| - class B {
|
| - String get getter => null; // testGetterNotSubtype:21
|
| - }
|
| - class Class implements A, B {
|
| - double get getter => null; // testGetterNotSubtype:22
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| - MessageKind.INVALID_OVERRIDE_GETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| -
|
| - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:23
|
| - }
|
| - class B {
|
| - num get getter => null; // testGetterNotSubtype:24
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - double get getter => null; // testGetterNotSubtype:25
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - int get getter => null; // testGetterNotSubtype:26
|
| - }
|
| - class B {
|
| - num get getter => null; // testGetterNotSubtype:27
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - String get getter => null; // testGetterNotSubtype:28
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| - MessageKind.INVALID_OVERRIDE_GETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| - ]);
|
| -}
|
| -
|
| -Future testGenericNotSubtype() {
|
| - return Future.wait([
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:1
|
| - }
|
| - class Class<S> extends A<S> {
|
| - method(S s) => null; // testGenericNotSubtype:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:3
|
| - }
|
| - class Class extends A<num> {
|
| - method(int i) => null; // testGenericNotSubtype:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:5
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:6
|
| - }
|
| - class Class extends A<double> implements B<int> {
|
| - method(num i) => null; // testGenericNotSubtype:7
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:8
|
| - }
|
| - class Class<S> extends A<S> {
|
| - method(int i) => null; // testGenericNotSubtype:9
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:10
|
| - }
|
| - class B<S> extends A<S> {
|
| -
|
| - }
|
| - class Class<U> extends B<U> {
|
| - method(U u) => null; // testGenericNotSubtype:11
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:12
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:13
|
| - }
|
| - class Class<U> extends A<U> implements B<num> {
|
| - method(int i) => null; // testGenericNotSubtype:14
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:15
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:16
|
| - }
|
| - class Class extends A<int> implements B<String> {
|
| - method(double d) => null; // testGenericNotSubtype:17
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| - MessageKind.INVALID_OVERRIDE_METHOD],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| - MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:18
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:19
|
| - }
|
| - class Class implements A<int>, B<String> {
|
| - method(double d) => null; // testGenericNotSubtype:20
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| - MessageKind.INVALID_OVERRIDE_METHOD],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| - MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| -
|
| - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:21
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:22
|
| - }
|
| - abstract class C implements A<int>, B<num> {
|
| - }
|
| - class Class implements C {
|
| - method(double d) => null; // testGenericNotSubtype:23
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| -
|
| - check("""
|
| - class A<T> {
|
| - method(T t) => null; // testGenericNotSubtype:24
|
| - }
|
| - class B<S> {
|
| - method(S s) => null; // testGenericNotSubtype:25
|
| - }
|
| - abstract class C implements A<int>, B<num> {
|
| - }
|
| - class Class implements C {
|
| - method(String s) => null; // testGenericNotSubtype:26
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| - MessageKind.INVALID_OVERRIDE_METHOD],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| - MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| - ]);
|
| -}
|
| -
|
| -Future testSetterNotSubtype() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - set setter(_) => null; // testSetterNotSubtype:1
|
| - }
|
| - class Class extends A {
|
| - set setter(_) => null; // testSetterNotSubtype:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - void set setter(_) {} // testSetterNotSubtype:3
|
| - }
|
| - class Class extends A {
|
| - set setter(_) => null; // testSetterNotSubtype:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(_) => null; // testSetterNotSubtype:5
|
| - }
|
| - class Class extends A {
|
| - void set setter(_) {} // testSetterNotSubtype:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(_) => null; // testSetterNotSubtype:7
|
| - }
|
| - class Class extends A {
|
| - void set setter(_) {} // testSetterNotSubtype:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(num _) => null; // testSetterNotSubtype:9
|
| - }
|
| - class Class extends A {
|
| - set setter(num _) => null; // testSetterNotSubtype:10
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(num _) => null; // testSetterNotSubtype:11
|
| - }
|
| - class Class extends A {
|
| - set setter(int _) => null; // testSetterNotSubtype:12
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:13
|
| - }
|
| - class Class extends A {
|
| - set setter(num _) => null; // testSetterNotSubtype:14
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:15
|
| - }
|
| - class Class extends A {
|
| - set setter(double _) => null; // testSetterNotSubtype:16
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:17
|
| - }
|
| - class B extends A {
|
| - set setter(num _) => null; // testSetterNotSubtype:18
|
| - }
|
| - class Class extends B {
|
| - set setter(double _) => null; // testSetterNotSubtype:19
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:20
|
| - }
|
| - class B {
|
| - set setter(num _) => null; // testSetterNotSubtype:21
|
| - }
|
| - class Class extends A implements B {
|
| - set setter(double _) => null; // testSetterNotSubtype:22
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:23
|
| - }
|
| - class B {
|
| - set setter(String _) => null; // testSetterNotSubtype:24
|
| - }
|
| - class Class extends A implements B {
|
| - set setter(double _) => null; // testSetterNotSubtype:25
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| - MessageKind.INVALID_OVERRIDE_SETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:26
|
| - }
|
| - class B {
|
| - set setter(String _) => null; // testSetterNotSubtype:27
|
| - }
|
| - class Class implements A, B {
|
| - set setter(double _) => null; // testSetterNotSubtype:28
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| - MessageKind.INVALID_OVERRIDE_SETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| -
|
| - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:29
|
| - }
|
| - class B {
|
| - set setter(num _) => null; // testSetterNotSubtype:30
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - set setter(double _) => null; // testSetterNotSubtype:31
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - set setter(int _) => null; // testSetterNotSubtype:32
|
| - }
|
| - class B {
|
| - set setter(num _) => null; // testSetterNotSubtype:33
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class implements C {
|
| - set setter(String _) => null; // testSetterNotSubtype:34
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| - MessageKind.INVALID_OVERRIDE_SETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| - ]);
|
| -}
|
| -
|
| -Future testFieldNotSubtype() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - int field; // testFieldNotSubtype:1
|
| - }
|
| - class Class extends A {
|
| - int field; // testFieldNotSubtype:2
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:3
|
| - }
|
| - class Class extends A {
|
| - int field; // testFieldNotSubtype:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int field; // testFieldNotSubtype:5
|
| - }
|
| - class Class extends A {
|
| - num field; // testFieldNotSubtype:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - int field; // testFieldNotSubtype:7
|
| - }
|
| - class Class extends A {
|
| - double field; // testFieldNotSubtype:8
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| -
|
| - check("""
|
| - class A {
|
| - int field; // testFieldNotSubtype:9
|
| - }
|
| - class B extends A {
|
| - num field; // testFieldNotSubtype:10
|
| - }
|
| - class Class extends B {
|
| - double field; // testFieldNotSubtype:11
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:12
|
| - }
|
| - class Class extends A {
|
| - int get field => null; // testFieldNotSubtype:13
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:14
|
| - }
|
| - class Class extends A {
|
| - String get field => null; // testFieldNotSubtype:15
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| -
|
| - check("""
|
| - class A {
|
| - num get field => null; // testFieldNotSubtype:16
|
| - }
|
| - class Class extends A {
|
| - String field; // testFieldNotSubtype:17
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:18
|
| - }
|
| - class Class extends A {
|
| - set field(int _) {} // testFieldNotSubtype:19
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:19
|
| - }
|
| - class Class extends A {
|
| - void set field(int _) {} // testFieldNotSubtype:20
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - set field(int _) {} // testFieldNotSubtype:21
|
| - }
|
| - class Class extends A {
|
| - num field; // testFieldNotSubtype:22
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - void set field(int _) {} // testFieldNotSubtype:23
|
| - }
|
| - class Class extends A {
|
| - num field; // testFieldNotSubtype:24
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - num field; // testFieldNotSubtype:25
|
| - }
|
| - class Class extends A {
|
| - set field(String _) {} // testFieldNotSubtype:26
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| -
|
| - check("""
|
| - class A {
|
| - set field(num _) {} // testFieldNotSubtype:27
|
| - }
|
| - class Class extends A {
|
| - String field; // testFieldNotSubtype:28
|
| - }
|
| - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
|
| - infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - int field; // testFieldNotSubtype:29
|
| - }
|
| - class Class implements A {
|
| - String get field => null; // testFieldNotSubtype:30
|
| - void set field(String s) {} // testFieldNotSubtype:31
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
|
| - MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
|
| - MessageKind.INVALID_OVERRIDDEN_FIELD]),
|
| -
|
| -
|
| - check("""
|
| - class A {
|
| - String get field => null; // testFieldNotSubtype:32
|
| - void set field(String s) {} // testFieldNotSubtype:33
|
| - }
|
| - class Class implements A {
|
| - int field; // testFieldNotSubtype:34
|
| - }
|
| - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
|
| - MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
|
| - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| - MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| - ]);
|
| -}
|
| -
|
| -Future testMixedOverride() {
|
| - return Future.wait([
|
| - check("""
|
| - class A {
|
| - var member; // testMixedOverride:1
|
| - }
|
| - class Class extends A {
|
| - member() {} // testMixedOverride:2
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
|
| - infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - member() {} // testMixedOverride:3
|
| - }
|
| - class Class extends A {
|
| - var member; // testMixedOverride:4
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
|
| - infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - get member => null; // testMixedOverride:5
|
| - }
|
| - class Class extends A {
|
| - member() {} // testMixedOverride:6
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
|
| - infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - member() {} // testMixedOverride:7
|
| - }
|
| - class Class extends A {
|
| - get member => null; // testMixedOverride:8
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
|
| - infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - var member; // testMixedOverride:9
|
| - }
|
| - abstract class B {
|
| - get member; // testMixedOverride:10
|
| - }
|
| - abstract class Class implements A, B {
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - var member; // testMixedOverride:11
|
| - }
|
| - abstract class B {
|
| - member() {} // testMixedOverride:12
|
| - }
|
| - abstract class Class implements A, B {
|
| - }
|
| - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| - infos: [MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_IMPLICIT_GETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get member; // testMixedOverride:13
|
| - }
|
| - abstract class B {
|
| - member() {} // testMixedOverride:14
|
| - }
|
| - abstract class Class implements A, B {
|
| - }
|
| - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| - infos: [MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_EXPLICIT_GETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get member; // testMixedOverride:15
|
| - }
|
| - abstract class B {
|
| - member() {} // testMixedOverride:16
|
| - }
|
| - abstract class C {
|
| - var member; // testMixedOverride:17
|
| - }
|
| - abstract class D {
|
| - member() {} // testMixedOverride:18
|
| - }
|
| - abstract class E {
|
| - get member; // testMixedOverride:19
|
| - }
|
| - abstract class Class implements A, B, C, D, E {
|
| - }
|
| - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| - infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
|
| - MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_IMPLICIT_GETTER,
|
| - MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_EXPLICIT_GETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get member; // testMixedOverride:20
|
| - }
|
| - abstract class B {
|
| - member() {} // testMixedOverride:21
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class extends C {
|
| - member() {} // testMixedOverride:22
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
|
| - warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| - infos: [MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_EXPLICIT_GETTER,
|
| - MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get member; // testMixedOverride:23
|
| - }
|
| - abstract class B {
|
| - member() {} // testMixedOverride:24
|
| - }
|
| - abstract class C implements A, B {
|
| - }
|
| - class Class extends C {
|
| - get member => null; // testMixedOverride:25
|
| - }
|
| - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
|
| - warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| - infos: [MessageKind.INHERITED_METHOD,
|
| - MessageKind.INHERITED_EXPLICIT_GETTER,
|
| - MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]),
|
| - ]);
|
| -}
|
| -
|
| -Future testAbstractMethods() {
|
| - return Future.wait([
|
| - check("""
|
| - abstract class Class {
|
| - method(); // testAbstractMethod:1
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class Class {
|
| - method(); // testAbstractMethod:2
|
| - }
|
| - """, warnings: MessageKind.ABSTRACT_METHOD,
|
| - infos: []),
|
| -
|
| - check("""
|
| - class Class {
|
| - get getter; // testAbstractMethod:3
|
| - }
|
| - """, warnings: MessageKind.ABSTRACT_GETTER,
|
| - infos: []),
|
| -
|
| - check("""
|
| - class Class {
|
| - set setter(_); // testAbstractMethod:4
|
| - }
|
| - """, warnings: MessageKind.ABSTRACT_SETTER,
|
| - infos: []),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testAbstractMethod:5
|
| - }
|
| - class Class extends A {
|
| - method() {} // testAbstractMethod:6
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testAbstractMethod:7
|
| - }
|
| - class Class extends A {
|
| - method([a]) {} // testAbstractMethod:8
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testAbstractMethod:9
|
| - }
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get getter; // testAbstractMethod:10
|
| - }
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - set setter(_); // testAbstractMethod:11
|
| - }
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testAbstractMethod:12
|
| - }
|
| - class B {
|
| - method() {} // testAbstractMethod:13
|
| - }
|
| - class Class extends A implements B {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
|
| - infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
|
| - MessageKind.UNIMPLEMENTED_METHOD_CONT]),
|
| -
|
| - check("""
|
| - class Class implements Function {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: []),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get getter; // testAbstractMethod:14
|
| - }
|
| - class B {
|
| - get getter => 0; // testAbstractMethod:15
|
| - }
|
| - class Class extends A implements B {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
|
| - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - set setter(_); // testAbstractMethod:16
|
| - }
|
| - class B {
|
| - set setter(_) {} // testAbstractMethod:17
|
| - }
|
| - class Class extends A implements B {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
|
| - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| - MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - get field; // testAbstractMethod:18
|
| - }
|
| - class B {
|
| - var field; // testAbstractMethod:19
|
| - }
|
| - class Class extends A implements B {
|
| - set field(_) {} // testAbstractMethod:20
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
|
| - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - set field(_); // testAbstractMethod:21
|
| - }
|
| - class B {
|
| - var field; // testAbstractMethod:22
|
| - }
|
| - class Class extends A implements B {
|
| - get field => 0; // testAbstractMethod:23
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
|
| - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testAbstractMethod:24
|
| - }
|
| - class Class implements A {
|
| - method() {} // testAbstractMethod:25
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testAbstractMethod:26
|
| - }
|
| - class Class implements A {
|
| - method([a]) {} // testAbstractMethod:27
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testAbstractMethod:28
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testAbstractMethod:29
|
| - }
|
| - class B {
|
| - method() {} // testAbstractMethod:30
|
| - }
|
| - class Class extends A implements B {
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - var member; // testAbstractMethod:31
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| - MessageKind.UNIMPLEMENTED_SETTER_ONE],
|
| - infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - var member; // testAbstractMethod:32
|
| - }
|
| - class B {
|
| - get member => null; // testAbstractMethod:33
|
| - set member(_) {} // testAbstractMethod:34
|
| - }
|
| - class Class implements A, B {
|
| - }
|
| - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
|
| - MessageKind.UNIMPLEMENTED_SETTER],
|
| - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - var member; // testAbstractMethod:35
|
| - }
|
| - class B {
|
| - var member; // testAbstractMethod:36
|
| - }
|
| - class Class implements A, B {
|
| - }
|
| - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
|
| - MessageKind.UNIMPLEMENTED_SETTER],
|
| - infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
|
| - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| -
|
| - check("""
|
| - class A {
|
| - get member => 0; // testAbstractMethod:37
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - set member(_) {} // testAbstractMethod:38
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - var member; // testAbstractMethod:39
|
| - }
|
| - class Class implements A {
|
| - get member => 0;
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - var field; // testAbstractMethod:40
|
| - }
|
| - class Class implements A {
|
| - final field = 0; // testAbstractMethod:41
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
|
| -
|
| - check("""
|
| - class A {
|
| - var member; // testAbstractMethod:42
|
| - }
|
| - class Class implements A {
|
| - set member(_) {}
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method() {} // testAbstractMethod:43
|
| - }
|
| - class Class extends A {
|
| - method();
|
| - }
|
| - """),
|
| - ]);
|
| -}
|
| -
|
| -Future testNoSuchMethod() {
|
| - return Future.wait([
|
| - check("""
|
| - class Class {
|
| - method(); // testNoSuchMethod:1
|
| - }
|
| - """, warnings: MessageKind.ABSTRACT_METHOD,
|
| - infos: []),
|
| -
|
| - check("""
|
| - @proxy
|
| - class Class {
|
| - method(); // testNoSuchMethod:2
|
| - }
|
| - """, warnings: MessageKind.ABSTRACT_METHOD,
|
| - infos: []),
|
| -
|
| - check("""
|
| - class Class {
|
| - noSuchMethod(_) => null;
|
| - method(); // testNoSuchMethod:3
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class Class {
|
| - noSuchMethod(_, [__]) => null;
|
| - method(); // testNoSuchMethod:4
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class Class {
|
| - noSuchMethod(_);
|
| - method(); // testNoSuchMethod:5
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testNoSuchMethod:6
|
| - }
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testNoSuchMethod:7
|
| - }
|
| - @proxy
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - abstract class A {
|
| - method(); // testNoSuchMethod:8
|
| - }
|
| - class Class extends A {
|
| - noSuchMethod(_) => null;
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testNoSuchMethod:9
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testNoSuchMethod:10
|
| - }
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testNoSuchMethod:11
|
| - }
|
| - @proxy
|
| - class Class implements A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| -
|
| - check("""
|
| - class A {
|
| - method() {} // testNoSuchMethod:12
|
| - }
|
| - class Class implements A {
|
| - noSuchMethod(_) => null;
|
| - }
|
| - """),
|
| -
|
| - check("""
|
| - class A {
|
| - noSuchMethod(_) => null;
|
| - method(); // testNoSuchMethod:13
|
| - }
|
| - class Class extends A {
|
| - }
|
| - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| - ]);
|
| -}
|
| +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +import 'dart:async';
|
| +import 'package:async_helper/async_helper.dart';
|
| +import 'compiler_helper.dart';
|
| +import 'package:compiler/src/resolution/class_members.dart'
|
| + show MembersCreator;
|
| +
|
| +main() {
|
| + asyncTest(() => Future.wait([
|
| + testRequiredParameters(),
|
| + testPositionalParameters(),
|
| + testNamedParameters(),
|
| + testNotSubtype(),
|
| + testGetterNotSubtype(),
|
| + testSetterNotSubtype(),
|
| + testGenericNotSubtype(),
|
| + testFieldNotSubtype(),
|
| + testMixedOverride(),
|
| + testAbstractMethods(),
|
| + testNoSuchMethod(),
|
| + ]));
|
| +}
|
| +
|
| +Future check(String source, {errors, warnings, hints, infos}) {
|
| + return MockCompiler.create((MockCompiler compiler) {
|
| + compiler.diagnosticHandler = createHandler(compiler, source);
|
| + compiler.parseScript(source);
|
| + var cls = compiler.mainApp.find('Class');
|
| + cls.ensureResolved(compiler);
|
| + MembersCreator.computeAllClassMembers(compiler, cls);
|
| +
|
| + toList(o) => o == null ? [] : o is List ? o : [o];
|
| +
|
| + compareMessageKinds(source, toList(errors), compiler.errors, 'error');
|
| +
|
| + compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');
|
| +
|
| + if (infos != null) {
|
| + compareMessageKinds(source, toList(infos), compiler.infos, 'info');
|
| + }
|
| +
|
| + if (hints != null) {
|
| + compareMessageKinds(source, toList(hints), compiler.hints, 'hint');
|
| + }
|
| + });
|
| +}
|
| +
|
| +Future testRequiredParameters() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + method() => null; // testRequiredParameters:0
|
| + }
|
| + class Class extends A {
|
| + method() => null; // testRequiredParameters:1
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a) => null; // testRequiredParameters:2
|
| + }
|
| + class Class extends A {
|
| + method(b) => null; // testRequiredParameters:3
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a, b, c, d) => null; // testRequiredParameters:3
|
| + }
|
| + class Class extends A {
|
| + method(b, a, d, c) => null; // testRequiredParameters:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method() => null; // testRequiredParameters:5
|
| + }
|
| + class Class extends A {
|
| + method(a) => null; // testRequiredParameters:6
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method() => null; // testRequiredParameters:7
|
| + }
|
| + class Class implements A {
|
| + method(a) => null; // testRequiredParameters:8
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a, b, c) => null; // testRequiredParameters:9
|
| + }
|
| + class Class extends A {
|
| + method(a, b, c, d) => null; // testRequiredParameters:10
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| + ]);
|
| +}
|
| +
|
| +Future testPositionalParameters() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + method([a]) => null; // testPositionalParameters:1
|
| + }
|
| + class Class extends A {
|
| + method([a]) => null; // testPositionalParameters:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method([a, b]) => null; // testPositionalParameters:3
|
| + }
|
| + class Class extends A {
|
| + method([b, a]) => null; // testPositionalParameters:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method([a, b, c]) => null; // testPositionalParameters:5
|
| + }
|
| + class Class extends A {
|
| + method([b, d, a, c]) => null; // testPositionalParameters:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method([a]) => null; // testPositionalParameters:7
|
| + }
|
| + class Class extends A {
|
| + method([a]) => null; // testPositionalParameters:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a) => null; // testPositionalParameters:9
|
| + }
|
| + class Class extends A {
|
| + method() => null; // testPositionalParameters:10
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a, [b]) => null; // testPositionalParameters:11
|
| + }
|
| + class Class extends A {
|
| + method(a) => null; // testPositionalParameters:12
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a, [b]) => null; // testPositionalParameters:13
|
| + }
|
| + class Class extends A {
|
| + method([a]) => null; // testPositionalParameters:14
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(a, b, [c, d, e]) => null; // testPositionalParameters:15
|
| + }
|
| + class Class extends A {
|
| + method([a, b, c, d]) => null; // testPositionalParameters:16
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| + ]);
|
| +}
|
| +
|
| +Future testNamedParameters() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + method({a}) => null; // testNamedParameters:1
|
| + }
|
| + class Class extends A {
|
| + method({a}) => null; // testNamedParameters:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method({a, b}) => null; // testNamedParameters:3
|
| + }
|
| + class Class extends A {
|
| + method({b, a}) => null; // testNamedParameters:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method({a, b, c}) => null; // testNamedParameters:5
|
| + }
|
| + class Class extends A {
|
| + method({b, c, a, d}) => null; // testNamedParameters:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(d, {a, b, c}) => null; // testNamedParameters:7
|
| + }
|
| + class Class extends A {
|
| + method(e, {b, c, a, d}) => null; // testNamedParameters:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method({a}) => null; // testNamedParameters:9
|
| + }
|
| + class Class extends A {
|
| + method() => null; // testNamedParameters:10
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method({a, b}) => null; // testNamedParameters:11
|
| + }
|
| + class Class extends A {
|
| + method({b}) => null; // testNamedParameters:12
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method({a, b, c, d}) => null; // testNamedParameters:13
|
| + }
|
| + class Class extends A {
|
| + method({a, e, d, c}) => null; // testNamedParameters:14
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| + ]);
|
| +}
|
| +
|
| +Future testNotSubtype() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:1
|
| + }
|
| + class Class extends A {
|
| + method(int a) => null; // testNotSubtype:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:3
|
| + }
|
| + class Class extends A {
|
| + method(num a) => null; // testNotSubtype:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + void method() {} // testNotSubtype:5
|
| + }
|
| + class Class extends A {
|
| + method() => null; // testNotSubtype:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method() => null; // testNotSubtype:7
|
| + }
|
| + class Class extends A {
|
| + void method() {} // testNotSubtype:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + void method() {} // testNotSubtype:9
|
| + }
|
| + class Class extends A {
|
| + int method() => null; // testNotSubtype:10
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int method() => null; // testNotSubtype:11
|
| + }
|
| + class Class extends A {
|
| + void method() {} // testNotSubtype:12
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:13
|
| + }
|
| + class B extends A {
|
| + method(num a) => null; // testNotSubtype:14
|
| + }
|
| + class Class extends B {
|
| + method(double a) => null; // testNotSubtype:15
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:16
|
| + }
|
| + class B extends A {
|
| + method(a) => null; // testNotSubtype:17
|
| + }
|
| + class Class extends B {
|
| + method(String a) => null; // testNotSubtype:18
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:19
|
| + }
|
| + class Class extends A {
|
| + method(String a) => null; // testNotSubtype:20
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:23
|
| + }
|
| + class B {
|
| + method(num a) => null; // testNotSubtype:24
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + method(double a) => null; // testNotSubtype:25
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(num a) => null; // testNotSubtype:29
|
| + }
|
| + class B {
|
| + method(int a) => null; // testNotSubtype:30
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + method(double a) => null; // testNotSubtype:31
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A {
|
| + method(int a) => null; // testNotSubtype:26
|
| + }
|
| + class B {
|
| + method(num a) => null; // testNotSubtype:27
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + method(String a) => null; // testNotSubtype:28
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| + MessageKind.INVALID_OVERRIDE_METHOD],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| + MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| + ]);
|
| +}
|
| +
|
| +Future testGetterNotSubtype() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + get getter => null; // testGetterNotSubtype:1
|
| + }
|
| + class Class extends A {
|
| + get getter => null; // testGetterNotSubtype:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num get getter => null; // testGetterNotSubtype:3
|
| + }
|
| + class Class extends A {
|
| + num get getter => null; // testGetterNotSubtype:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num get getter => null; // testGetterNotSubtype:5
|
| + }
|
| + class Class extends A {
|
| + int get getter => null; // testGetterNotSubtype:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:7
|
| + }
|
| + class Class extends A {
|
| + num get getter => null; // testGetterNotSubtype:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:9
|
| + }
|
| + class Class extends A {
|
| + double get getter => null; // testGetterNotSubtype:10
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:11
|
| + }
|
| + class B extends A {
|
| + num get getter => null; // testGetterNotSubtype:12
|
| + }
|
| + class Class extends B {
|
| + double get getter => null; // testGetterNotSubtype:13
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:14
|
| + }
|
| + class B {
|
| + num get getter => null; // testGetterNotSubtype:15
|
| + }
|
| + class Class extends A implements B {
|
| + double get getter => null; // testGetterNotSubtype:16
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:17
|
| + }
|
| + class B {
|
| + String get getter => null; // testGetterNotSubtype:18
|
| + }
|
| + class Class extends A implements B {
|
| + double get getter => null; // testGetterNotSubtype:19
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| + MessageKind.INVALID_OVERRIDE_GETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:20
|
| + }
|
| + class B {
|
| + String get getter => null; // testGetterNotSubtype:21
|
| + }
|
| + class Class implements A, B {
|
| + double get getter => null; // testGetterNotSubtype:22
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| + MessageKind.INVALID_OVERRIDE_GETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| +
|
| + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:23
|
| + }
|
| + class B {
|
| + num get getter => null; // testGetterNotSubtype:24
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + double get getter => null; // testGetterNotSubtype:25
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + int get getter => null; // testGetterNotSubtype:26
|
| + }
|
| + class B {
|
| + num get getter => null; // testGetterNotSubtype:27
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + String get getter => null; // testGetterNotSubtype:28
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
|
| + MessageKind.INVALID_OVERRIDE_GETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_GETTER]),
|
| + ]);
|
| +}
|
| +
|
| +Future testGenericNotSubtype() {
|
| + return Future.wait([
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:1
|
| + }
|
| + class Class<S> extends A<S> {
|
| + method(S s) => null; // testGenericNotSubtype:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:3
|
| + }
|
| + class Class extends A<num> {
|
| + method(int i) => null; // testGenericNotSubtype:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:5
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:6
|
| + }
|
| + class Class extends A<double> implements B<int> {
|
| + method(num i) => null; // testGenericNotSubtype:7
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:8
|
| + }
|
| + class Class<S> extends A<S> {
|
| + method(int i) => null; // testGenericNotSubtype:9
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:10
|
| + }
|
| + class B<S> extends A<S> {
|
| +
|
| + }
|
| + class Class<U> extends B<U> {
|
| + method(U u) => null; // testGenericNotSubtype:11
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:12
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:13
|
| + }
|
| + class Class<U> extends A<U> implements B<num> {
|
| + method(int i) => null; // testGenericNotSubtype:14
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:15
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:16
|
| + }
|
| + class Class extends A<int> implements B<String> {
|
| + method(double d) => null; // testGenericNotSubtype:17
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| + MessageKind.INVALID_OVERRIDE_METHOD],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| + MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:18
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:19
|
| + }
|
| + class Class implements A<int>, B<String> {
|
| + method(double d) => null; // testGenericNotSubtype:20
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| + MessageKind.INVALID_OVERRIDE_METHOD],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| + MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| +
|
| + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:21
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:22
|
| + }
|
| + abstract class C implements A<int>, B<num> {
|
| + }
|
| + class Class implements C {
|
| + method(double d) => null; // testGenericNotSubtype:23
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
|
| +
|
| + check("""
|
| + class A<T> {
|
| + method(T t) => null; // testGenericNotSubtype:24
|
| + }
|
| + class B<S> {
|
| + method(S s) => null; // testGenericNotSubtype:25
|
| + }
|
| + abstract class C implements A<int>, B<num> {
|
| + }
|
| + class Class implements C {
|
| + method(String s) => null; // testGenericNotSubtype:26
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
|
| + MessageKind.INVALID_OVERRIDE_METHOD],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
|
| + MessageKind.INVALID_OVERRIDDEN_METHOD]),
|
| + ]);
|
| +}
|
| +
|
| +Future testSetterNotSubtype() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + set setter(_) => null; // testSetterNotSubtype:1
|
| + }
|
| + class Class extends A {
|
| + set setter(_) => null; // testSetterNotSubtype:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + void set setter(_) {} // testSetterNotSubtype:3
|
| + }
|
| + class Class extends A {
|
| + set setter(_) => null; // testSetterNotSubtype:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(_) => null; // testSetterNotSubtype:5
|
| + }
|
| + class Class extends A {
|
| + void set setter(_) {} // testSetterNotSubtype:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(_) => null; // testSetterNotSubtype:7
|
| + }
|
| + class Class extends A {
|
| + void set setter(_) {} // testSetterNotSubtype:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(num _) => null; // testSetterNotSubtype:9
|
| + }
|
| + class Class extends A {
|
| + set setter(num _) => null; // testSetterNotSubtype:10
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(num _) => null; // testSetterNotSubtype:11
|
| + }
|
| + class Class extends A {
|
| + set setter(int _) => null; // testSetterNotSubtype:12
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:13
|
| + }
|
| + class Class extends A {
|
| + set setter(num _) => null; // testSetterNotSubtype:14
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:15
|
| + }
|
| + class Class extends A {
|
| + set setter(double _) => null; // testSetterNotSubtype:16
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:17
|
| + }
|
| + class B extends A {
|
| + set setter(num _) => null; // testSetterNotSubtype:18
|
| + }
|
| + class Class extends B {
|
| + set setter(double _) => null; // testSetterNotSubtype:19
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:20
|
| + }
|
| + class B {
|
| + set setter(num _) => null; // testSetterNotSubtype:21
|
| + }
|
| + class Class extends A implements B {
|
| + set setter(double _) => null; // testSetterNotSubtype:22
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:23
|
| + }
|
| + class B {
|
| + set setter(String _) => null; // testSetterNotSubtype:24
|
| + }
|
| + class Class extends A implements B {
|
| + set setter(double _) => null; // testSetterNotSubtype:25
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| + MessageKind.INVALID_OVERRIDE_SETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:26
|
| + }
|
| + class B {
|
| + set setter(String _) => null; // testSetterNotSubtype:27
|
| + }
|
| + class Class implements A, B {
|
| + set setter(double _) => null; // testSetterNotSubtype:28
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| + MessageKind.INVALID_OVERRIDE_SETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| +
|
| + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:29
|
| + }
|
| + class B {
|
| + set setter(num _) => null; // testSetterNotSubtype:30
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + set setter(double _) => null; // testSetterNotSubtype:31
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + set setter(int _) => null; // testSetterNotSubtype:32
|
| + }
|
| + class B {
|
| + set setter(num _) => null; // testSetterNotSubtype:33
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class implements C {
|
| + set setter(String _) => null; // testSetterNotSubtype:34
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
|
| + MessageKind.INVALID_OVERRIDE_SETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| + ]);
|
| +}
|
| +
|
| +Future testFieldNotSubtype() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + int field; // testFieldNotSubtype:1
|
| + }
|
| + class Class extends A {
|
| + int field; // testFieldNotSubtype:2
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:3
|
| + }
|
| + class Class extends A {
|
| + int field; // testFieldNotSubtype:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int field; // testFieldNotSubtype:5
|
| + }
|
| + class Class extends A {
|
| + num field; // testFieldNotSubtype:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + int field; // testFieldNotSubtype:7
|
| + }
|
| + class Class extends A {
|
| + double field; // testFieldNotSubtype:8
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| +
|
| + check("""
|
| + class A {
|
| + int field; // testFieldNotSubtype:9
|
| + }
|
| + class B extends A {
|
| + num field; // testFieldNotSubtype:10
|
| + }
|
| + class Class extends B {
|
| + double field; // testFieldNotSubtype:11
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:12
|
| + }
|
| + class Class extends A {
|
| + int get field => null; // testFieldNotSubtype:13
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:14
|
| + }
|
| + class Class extends A {
|
| + String get field => null; // testFieldNotSubtype:15
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| +
|
| + check("""
|
| + class A {
|
| + num get field => null; // testFieldNotSubtype:16
|
| + }
|
| + class Class extends A {
|
| + String field; // testFieldNotSubtype:17
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:18
|
| + }
|
| + class Class extends A {
|
| + set field(int _) {} // testFieldNotSubtype:19
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:19
|
| + }
|
| + class Class extends A {
|
| + void set field(int _) {} // testFieldNotSubtype:20
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + set field(int _) {} // testFieldNotSubtype:21
|
| + }
|
| + class Class extends A {
|
| + num field; // testFieldNotSubtype:22
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + void set field(int _) {} // testFieldNotSubtype:23
|
| + }
|
| + class Class extends A {
|
| + num field; // testFieldNotSubtype:24
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + num field; // testFieldNotSubtype:25
|
| + }
|
| + class Class extends A {
|
| + set field(String _) {} // testFieldNotSubtype:26
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
|
| +
|
| + check("""
|
| + class A {
|
| + set field(num _) {} // testFieldNotSubtype:27
|
| + }
|
| + class Class extends A {
|
| + String field; // testFieldNotSubtype:28
|
| + }
|
| + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
|
| + infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + int field; // testFieldNotSubtype:29
|
| + }
|
| + class Class implements A {
|
| + String get field => null; // testFieldNotSubtype:30
|
| + void set field(String s) {} // testFieldNotSubtype:31
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
|
| + MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
|
| + MessageKind.INVALID_OVERRIDDEN_FIELD]),
|
| +
|
| +
|
| + check("""
|
| + class A {
|
| + String get field => null; // testFieldNotSubtype:32
|
| + void set field(String s) {} // testFieldNotSubtype:33
|
| + }
|
| + class Class implements A {
|
| + int field; // testFieldNotSubtype:34
|
| + }
|
| + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
|
| + MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
|
| + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
|
| + MessageKind.INVALID_OVERRIDDEN_SETTER]),
|
| + ]);
|
| +}
|
| +
|
| +Future testMixedOverride() {
|
| + return Future.wait([
|
| + check("""
|
| + class A {
|
| + var member; // testMixedOverride:1
|
| + }
|
| + class Class extends A {
|
| + member() {} // testMixedOverride:2
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
|
| + infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + member() {} // testMixedOverride:3
|
| + }
|
| + class Class extends A {
|
| + var member; // testMixedOverride:4
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
|
| + infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + get member => null; // testMixedOverride:5
|
| + }
|
| + class Class extends A {
|
| + member() {} // testMixedOverride:6
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
|
| + infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + member() {} // testMixedOverride:7
|
| + }
|
| + class Class extends A {
|
| + get member => null; // testMixedOverride:8
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
|
| + infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + var member; // testMixedOverride:9
|
| + }
|
| + abstract class B {
|
| + get member; // testMixedOverride:10
|
| + }
|
| + abstract class Class implements A, B {
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + var member; // testMixedOverride:11
|
| + }
|
| + abstract class B {
|
| + member() {} // testMixedOverride:12
|
| + }
|
| + abstract class Class implements A, B {
|
| + }
|
| + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| + infos: [MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_IMPLICIT_GETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get member; // testMixedOverride:13
|
| + }
|
| + abstract class B {
|
| + member() {} // testMixedOverride:14
|
| + }
|
| + abstract class Class implements A, B {
|
| + }
|
| + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| + infos: [MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_EXPLICIT_GETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get member; // testMixedOverride:15
|
| + }
|
| + abstract class B {
|
| + member() {} // testMixedOverride:16
|
| + }
|
| + abstract class C {
|
| + var member; // testMixedOverride:17
|
| + }
|
| + abstract class D {
|
| + member() {} // testMixedOverride:18
|
| + }
|
| + abstract class E {
|
| + get member; // testMixedOverride:19
|
| + }
|
| + abstract class Class implements A, B, C, D, E {
|
| + }
|
| + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| + infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
|
| + MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_IMPLICIT_GETTER,
|
| + MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_EXPLICIT_GETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get member; // testMixedOverride:20
|
| + }
|
| + abstract class B {
|
| + member() {} // testMixedOverride:21
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class extends C {
|
| + member() {} // testMixedOverride:22
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
|
| + warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| + infos: [MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_EXPLICIT_GETTER,
|
| + MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get member; // testMixedOverride:23
|
| + }
|
| + abstract class B {
|
| + member() {} // testMixedOverride:24
|
| + }
|
| + abstract class C implements A, B {
|
| + }
|
| + class Class extends C {
|
| + get member => null; // testMixedOverride:25
|
| + }
|
| + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
|
| + warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
|
| + infos: [MessageKind.INHERITED_METHOD,
|
| + MessageKind.INHERITED_EXPLICIT_GETTER,
|
| + MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]),
|
| + ]);
|
| +}
|
| +
|
| +Future testAbstractMethods() {
|
| + return Future.wait([
|
| + check("""
|
| + abstract class Class {
|
| + method(); // testAbstractMethod:1
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class Class {
|
| + method(); // testAbstractMethod:2
|
| + }
|
| + """, warnings: MessageKind.ABSTRACT_METHOD,
|
| + infos: []),
|
| +
|
| + check("""
|
| + class Class {
|
| + get getter; // testAbstractMethod:3
|
| + }
|
| + """, warnings: MessageKind.ABSTRACT_GETTER,
|
| + infos: []),
|
| +
|
| + check("""
|
| + class Class {
|
| + set setter(_); // testAbstractMethod:4
|
| + }
|
| + """, warnings: MessageKind.ABSTRACT_SETTER,
|
| + infos: []),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testAbstractMethod:5
|
| + }
|
| + class Class extends A {
|
| + method() {} // testAbstractMethod:6
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testAbstractMethod:7
|
| + }
|
| + class Class extends A {
|
| + method([a]) {} // testAbstractMethod:8
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testAbstractMethod:9
|
| + }
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get getter; // testAbstractMethod:10
|
| + }
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + set setter(_); // testAbstractMethod:11
|
| + }
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testAbstractMethod:12
|
| + }
|
| + class B {
|
| + method() {} // testAbstractMethod:13
|
| + }
|
| + class Class extends A implements B {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
|
| + infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
|
| + MessageKind.UNIMPLEMENTED_METHOD_CONT]),
|
| +
|
| + check("""
|
| + class Class implements Function {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: []),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get getter; // testAbstractMethod:14
|
| + }
|
| + class B {
|
| + get getter => 0; // testAbstractMethod:15
|
| + }
|
| + class Class extends A implements B {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
|
| + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + set setter(_); // testAbstractMethod:16
|
| + }
|
| + class B {
|
| + set setter(_) {} // testAbstractMethod:17
|
| + }
|
| + class Class extends A implements B {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
|
| + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| + MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + get field; // testAbstractMethod:18
|
| + }
|
| + class B {
|
| + var field; // testAbstractMethod:19
|
| + }
|
| + class Class extends A implements B {
|
| + set field(_) {} // testAbstractMethod:20
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
|
| + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + set field(_); // testAbstractMethod:21
|
| + }
|
| + class B {
|
| + var field; // testAbstractMethod:22
|
| + }
|
| + class Class extends A implements B {
|
| + get field => 0; // testAbstractMethod:23
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
|
| + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testAbstractMethod:24
|
| + }
|
| + class Class implements A {
|
| + method() {} // testAbstractMethod:25
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testAbstractMethod:26
|
| + }
|
| + class Class implements A {
|
| + method([a]) {} // testAbstractMethod:27
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testAbstractMethod:28
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testAbstractMethod:29
|
| + }
|
| + class B {
|
| + method() {} // testAbstractMethod:30
|
| + }
|
| + class Class extends A implements B {
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + var member; // testAbstractMethod:31
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| + MessageKind.UNIMPLEMENTED_SETTER_ONE],
|
| + infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + var member; // testAbstractMethod:32
|
| + }
|
| + class B {
|
| + get member => null; // testAbstractMethod:33
|
| + set member(_) {} // testAbstractMethod:34
|
| + }
|
| + class Class implements A, B {
|
| + }
|
| + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
|
| + MessageKind.UNIMPLEMENTED_SETTER],
|
| + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + var member; // testAbstractMethod:35
|
| + }
|
| + class B {
|
| + var member; // testAbstractMethod:36
|
| + }
|
| + class Class implements A, B {
|
| + }
|
| + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
|
| + MessageKind.UNIMPLEMENTED_SETTER],
|
| + infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
|
| + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
|
| +
|
| + check("""
|
| + class A {
|
| + get member => 0; // testAbstractMethod:37
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + set member(_) {} // testAbstractMethod:38
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + var member; // testAbstractMethod:39
|
| + }
|
| + class Class implements A {
|
| + get member => 0;
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + var field; // testAbstractMethod:40
|
| + }
|
| + class Class implements A {
|
| + final field = 0; // testAbstractMethod:41
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
|
| +
|
| + check("""
|
| + class A {
|
| + var member; // testAbstractMethod:42
|
| + }
|
| + class Class implements A {
|
| + set member(_) {}
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method() {} // testAbstractMethod:43
|
| + }
|
| + class Class extends A {
|
| + method();
|
| + }
|
| + """),
|
| + ]);
|
| +}
|
| +
|
| +Future testNoSuchMethod() {
|
| + return Future.wait([
|
| + check("""
|
| + class Class {
|
| + method(); // testNoSuchMethod:1
|
| + }
|
| + """, warnings: MessageKind.ABSTRACT_METHOD,
|
| + infos: []),
|
| +
|
| + check("""
|
| + @proxy
|
| + class Class {
|
| + method(); // testNoSuchMethod:2
|
| + }
|
| + """, warnings: MessageKind.ABSTRACT_METHOD,
|
| + infos: []),
|
| +
|
| + check("""
|
| + class Class {
|
| + noSuchMethod(_) => null;
|
| + method(); // testNoSuchMethod:3
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class Class {
|
| + noSuchMethod(_, [__]) => null;
|
| + method(); // testNoSuchMethod:4
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class Class {
|
| + noSuchMethod(_);
|
| + method(); // testNoSuchMethod:5
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testNoSuchMethod:6
|
| + }
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testNoSuchMethod:7
|
| + }
|
| + @proxy
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + abstract class A {
|
| + method(); // testNoSuchMethod:8
|
| + }
|
| + class Class extends A {
|
| + noSuchMethod(_) => null;
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testNoSuchMethod:9
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testNoSuchMethod:10
|
| + }
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testNoSuchMethod:11
|
| + }
|
| + @proxy
|
| + class Class implements A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| +
|
| + check("""
|
| + class A {
|
| + method() {} // testNoSuchMethod:12
|
| + }
|
| + class Class implements A {
|
| + noSuchMethod(_) => null;
|
| + }
|
| + """),
|
| +
|
| + check("""
|
| + class A {
|
| + noSuchMethod(_) => null;
|
| + method(); // testNoSuchMethod:13
|
| + }
|
| + class Class extends A {
|
| + }
|
| + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
|
| + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
|
| + ]);
|
| +}
|
|
|