blob: 77b9cdba446537bcae4f920873b8f245b763f938 [file] [log] [blame]
// Copyright (c) 2020, 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.
// @dart=2.9
// Derived from language_2/covariant_override/tear_off_type_test
// If a parameter is directly or indirectly a covariant override, its type in
// the method tear-off should become Object.
typedef void TakeInts(int a, int b, int c, int d, int e);
typedef void TakeObjectsAndInts(Object a, int b, Object c, int d, int e);
typedef void TakeObjects(Object a, Object b, Object c, Object d, Object e);
typedef void TakeOptionalInts([int a, int b, int c, int d]);
typedef void TakeOptionalObjectsAndInts([Object a, int b, Object c, int d]);
typedef void TakeNamedInts({int a, int b, int c, int d});
typedef void TakeNamedObjectsAndInts({Object a, int b, Object c, int d});
class M1 {
method(covariant int a, int b) {}
}
class M2 {
method(int a, covariant int b) {}
}
class C extends Object with M1, M2 {}
class Direct {
void positional(covariant int a, int b, covariant int c, int d, int e) {}
void optional([covariant int a, int b, covariant int c, int d]) {}
void named({covariant int a, int b, covariant int c, int d}) {}
}
class Inherited extends Direct {}
// ---
class Override1 {
void method(covariant int a, int b, int c, int d, int e) {}
}
class Override2 extends Override1 {
void method(int a, int b, covariant int c, int d, int e) {}
}
class Override3 extends Override2 {
void method(int a, int b, int c, int d, int e) {}
}
// ---
abstract class Implement1 {
void method(covariant int a, int b, int c, int d, int e) {}
}
class Implement2 {
void method(int a, covariant int b, int c, int d, int e) {}
}
class Implement3 {
void method(int a, int b, covariant int c, int d, int e) {}
}
class Implement4 implements Implement3 {
void method(int a, int b, int c, covariant int d, int e) {}
}
class Implement5 implements Implement1, Implement2, Implement4 {
void method(int a, int b, int c, int d, covariant int e) {}
}
// ---
class Interface1 {
void method(covariant int a, int b, int c, int d, int e) {}
}
class Interface2 {
void method(int a, covariant int b, int c, int d, int e) {}
}
class Mixin1 {
void method(int a, int b, covariant int c, int d, int e) {}
}
class Mixin2 {
void method(int a, int b, int c, covariant int d, int e) {}
}
class Superclass {
void method(int a, int b, int c, int d, covariant int e) {}
}
class Mixed extends Superclass
with Mixin1, Mixin2
implements Interface1, Interface2 {}
void main() {
testDirect();
testInherited();
testOverridden();
testImplemented();
testMixed();
}
void testDirect() {
var positional = new Direct().positional;
isTrue(positional is TakeInts);
isTrue(positional is TakeObjectsAndInts);
var optional = new Direct().optional;
isTrue(optional is TakeOptionalInts);
isTrue(optional is TakeOptionalObjectsAndInts);
var named = new Direct().named;
isTrue(named is TakeNamedInts);
isTrue(named is TakeNamedObjectsAndInts);
}
void testInherited() {
var positional = new Inherited().positional;
isTrue(positional is TakeInts);
isTrue(positional is TakeObjectsAndInts);
var optional = new Inherited().optional;
isTrue(optional is TakeOptionalInts);
isTrue(optional is TakeOptionalObjectsAndInts);
var named = new Inherited().named;
isTrue(named is TakeNamedInts);
isTrue(named is TakeNamedObjectsAndInts);
}
void testOverridden() {
var method2 = new Override2().method;
isTrue(method2 is TakeInts);
isTrue(method2 is TakeObjectsAndInts);
var method3 = new Override3().method;
isTrue(method3 is TakeInts);
isTrue(method3 is TakeObjectsAndInts);
}
void testImplemented() {
var method = new Implement5().method;
isTrue(method is TakeInts);
isTrue(method is TakeObjects);
}
void testMixed() {
// TODO(rnystrom): https://github.com/dart-lang/sdk/issues/28395
var method = new Mixed().method;
isTrue(method is TakeInts);
isTrue(method is TakeObjects);
}
void isTrue(bool value) {
if (!value) throw 'Expected true';
}