blob: eb3b19fa79bf9150a5e4ee3c5e1c81b09ee200f7 [file] [log] [blame]
// Copyright (c) 2016, 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
import "package:expect/expect.dart";
// 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();
testOverriden();
testImplemented();
testMixed();
}
void testDirect() {
var positional = new Direct().positional;
Expect.isTrue(positional is TakeInts);
Expect.isTrue(positional is TakeObjectsAndInts);
var optional = new Direct().optional;
Expect.isTrue(optional is TakeOptionalInts);
Expect.isTrue(optional is TakeOptionalObjectsAndInts);
var named = new Direct().named;
Expect.isTrue(named is TakeNamedInts);
Expect.isTrue(named is TakeNamedObjectsAndInts);
}
void testInherited() {
var positional = new Inherited().positional;
Expect.isTrue(positional is TakeInts);
Expect.isTrue(positional is TakeObjectsAndInts);
var optional = new Inherited().optional;
Expect.isTrue(optional is TakeOptionalInts);
Expect.isTrue(optional is TakeOptionalObjectsAndInts);
var named = new Inherited().named;
Expect.isTrue(named is TakeNamedInts);
Expect.isTrue(named is TakeNamedObjectsAndInts);
}
void testOverriden() {
var method2 = new Override2().method;
Expect.isTrue(method2 is TakeInts);
Expect.isTrue(method2 is TakeObjectsAndInts);
var method3 = new Override3().method;
Expect.isTrue(method3 is TakeInts);
Expect.isTrue(method3 is TakeObjectsAndInts);
}
void testImplemented() {
var method = new Implement5().method;
Expect.isTrue(method is TakeInts);
Expect.isTrue(method is TakeObjects);
}
void testMixed() {
// TODO(rnystrom): https://github.com/dart-lang/sdk/issues/28395
var method = new Mixed().method;
Expect.isTrue(method is TakeInts);
Expect.isTrue(method is TakeObjects);
}