blob: 2049794e510e6a4ef56efcb5e1dc1b0d048de813 [file] [log] [blame]
// Copyright (c) 2011, 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.
/// @assertion A type T is more specific than a type S, written T << S, if one
/// of the following conditions is met:
/// • T is S.
/// • T is ⊥
/// • S is dynamic.
/// • S is a direct supertype of T.
/// • T is a type parameter and S is the upper bound of T.
/// • T is a type parameter and S is Object.
/// • T is of the form I<T1, ..., Tn > and S is of the form I <S1, ..., Sn>
/// and Ti << Si 1 <= i <= n.
/// • T and S are both function types, and T << S under the rules of section
/// (Types/Function Types).
/// • T is a function type and S is Function.
/// • T << U and U << S.
/// << is a partial order on types. T is a subtype of S, written T <: S, iff
/// [⊥/Dynamic]T << S.
/// . . .
/// An interface type T may be assigned to a type S, written T <=> S, if either
/// T <: S or S <: T.
/// @description Checks that function type T is a subtype of itself and
/// T is assignable to itself.
/// @author iefremov
import "../../../Utils/expect.dart";
typedef void t1();
typedef num t2();
typedef t3();
typedef t4(var x);
typedef int t5(var x);
typedef String t6(var x, int y);
typedef t1? t7(t2 x, t3 y);
typedef t7? t8(t7 x, [t7? y]);
typedef void t9([var x]);
typedef int t10([int? x]);
typedef List t11(int x, int y, List z, Map<String, Object> m);
typedef List t12(int x, [int? y, List? z, Map<String, Object>? m]);
typedef List<Map<int, List<List<int>>>>
t13(int x, var v, [int? y, List? z, Map<String, List<int>>? m]);
typedef t13? t14(t13 a, [t13? b]);
void f1() {}
num f2() => 42;
f3() {}
f4(var x) {}
int f5(var x) => 42;
String f6(var x, int y) => "Lily was here";
t1? f7(t2 x, t3 y) {}
t7? f8(t7 x, [t7? y]) {}
void f9([var x]) {}
int f10([int? x]) => 0;
List f11(int x, int y, List z, Map<String, Object> m) => [];
List f12(int x, [int? y, List? z, Map<String, Object>? m]) => [];
List<Map<int, List<List<int>>>> f13(int x, var v, [int? y, List? z, Map<String, List<int>>? m]) => [];
t13? f14(t13 a, [t13? b]) {}
class Checker<T> {
Checker() {}
check(T x) {
Expect.isTrue(x is T);
Expect.runtimeIsType<T>(x);
T t = x;
check2(x);
}
check2(dynamic x) {
T t = x;
}
}
main() {
new Checker<t1>().check(f1);
new Checker<t2>().check(f2);
new Checker<t3>().check(f3);
new Checker<t4>().check(f4);
new Checker<t5>().check(f5);
new Checker<t6>().check(f6);
new Checker<t7>().check(f7);
new Checker<t8>().check(f8);
new Checker<t9>().check(f9);
new Checker<t10>().check(f10);
new Checker<t11>().check(f11);
new Checker<t12>().check(f12);
new Checker<t13>().check(f13);
new Checker<t14>().check(f14);
}