blob: 732aaf6d686ed25dd6ef6ea4ec62b85a41cd65d3 [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.
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 = 0, int b = 0, covariant int c = 0, int d = 0]) {}
void named(
{covariant int a = 0, int b = 0, covariant int c = 0, int d = 0}) {}
}
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);
}