blob: 525d925d6bfaec97da6a032dc890f42570c09006 [file] [log] [blame]
// Copyright (c) 2024, 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 '../static_type_helper.dart';
class A<X> {}
extension type ET1<Y>(A<Y> it) implements A<Y> {}
ET1<T> producingET1<T>() => ET1<T>(A<T>());
// In type constraint generation, ET1<T> is compared against A<num>, yielding
// the constraint T <: num.
test1() =>
context<A<num>>(producingET1()..expectStaticType<Exactly<ET1<num>>>());
T acceptingFunctionET1<T>(T Function(ET1<T>) f) => f(ET1<T>(A<T>()));
num Function(A<num>) producingFunctionA() => ((A<num> a) => 0);
// In type constraint generation, A<num> is compared against ET1<T>, yielding
// the constraint num <: T.
test2() =>
acceptingFunctionET1(producingFunctionA()).expectStaticType<Exactly<num>>();
enum E<X> {
element<String>();
}
extension type ET2<Y>(E<Y> it) implements E<Y> {}
E<T> producingE<T>() => E.element as E<T>;
ET2<T> producingET2<T>() => ET2<T>(producingE<T>());
// In type constraint generation, ET2<T> is compared against E<String>,
// yielding the constraint T <: String.
test3() => context<E<String>>(
producingET2()..expectStaticType<Exactly<ET2<String>>>());
T acceptingFunctionET2<T>(T Function(ET2<T>) f) => f(ET2<T>(producingE<T>()));
String Function(E<String>) producingFunctionE() => ((E<String> e) => "");
// In type constraint generation, E<String> is compared against ET2<T>,
// yielding the constraint String <: T.
test4() => acceptingFunctionET2(producingFunctionE())
.expectStaticType<Exactly<String>>();
extension type ET3<Y>(A<Y> it) implements ET1<Y> {}
ET3<T> producingET3<T>() => ET3<T>(A<T>());
// In type constraint generation, ET3<T> is compared against A<num>, yielding
// the constraint T <: num.
test5() =>
context<A<num>>(producingET3()..expectStaticType<Exactly<ET3<num>>>());
T acceptingFunctionET3<T>(T Function(ET3<T>) f) => f(ET3<T>(A<T>()));
// In type constraint generation, A<num> is compared against ET3<T>, yielding
// the constraint num <: T.
test6() =>
acceptingFunctionET3(producingFunctionA()).expectStaticType<Exactly<num>>();
extension type ET4<Y>(E<Y> it) implements ET2<Y> {}
ET4<T> producingET4<T>() => ET4<T>(producingE<T>());
// In type constraint generation, ET4<T> is compared against E<String>,
// yielding the constraint T <: String.
test7() => context<E<String>>(
producingET4()..expectStaticType<Exactly<ET4<String>>>());
T acceptingFunctionET4<T>(Function(ET4<T>) f) => f(ET4<T>(producingE<T>()));
// In type constraint generation, E<String> is compared against ET4<T>,
// yielding the constraint String <: T.
test8() => acceptingFunctionET4(producingFunctionE())
.expectStaticType<Exactly<String>>();
main() {
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
}