blob: b8ba7374c58d4e1b9a03f587be1d285a5bb15752 [file] [log] [blame]
// Copyright (c) 2023, 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.
sealed class A<X> {}
sealed class B<Y> extends A<Y> {}
sealed class C extends A<int> {}
sealed class D<Z, W> extends A<W> {}
class B1<V1> extends B<V1> {}
class B2 extends B<int> {}
class C1 extends C {}
class C2<U1> extends C {}
class D1<V2, U2> extends D<V2, U2> {}
class D2<V3> extends D<int, V3> {}
class D3<U3> extends D<U3, int> {}
class D4 extends D<bool, bool> {}
exhaustiveLevel0<T1>(A<T1> a) {
/*
checkingOrder={A<T1>,B<T1>,C,D<dynamic, dynamic>,B1<T1>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
expandedSubtypes={B1<T1>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
subtypes={B<T1>,C,D<dynamic, dynamic>},
type=A<T1>
*/
switch (a) {
/*space=A<T1>*/
case A<T1> _:
print('_');
break;
}
}
exhaustiveLevel0_1<T2>(A<T2> a) {
/*
checkingOrder={A<T2>,B<T2>,C,D<dynamic, dynamic>,B1<T2>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
expandedSubtypes={B1<T2>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
subtypes={B<T2>,C,D<dynamic, dynamic>},
type=A<T2>
*/
switch (a) {
/*space=B<T2>*/
case B<T2> b:
print('b');
break;
/*space=D<dynamic, T2>*/
case D<dynamic, T2> d:
print('d');
break;
/*space=A<T2>*/
case A<T2> _:
print('_');
break;
}
}
exhaustiveLevel1<T3>(A<T3> a) {
// TODO(johnniwinther): Room for improvement here. We could recognized the
// direct passing of type variables in D.
/*
checkingOrder={A<T3>,B<T3>,C,D<dynamic, dynamic>,B1<T3>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
error=non-exhaustive:D1<dynamic, dynamic>();D2<dynamic>();D3<dynamic>();D4(),
expandedSubtypes={B1<T3>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
subtypes={B<T3>,C,D<dynamic, dynamic>},
type=A<T3>
*/
switch (a) {
/*space=B<T3>*/
case B<T3> b:
print('b');
break;
/*space=C*/
case C c:
print('c');
break;
/*space=D<dynamic, T3>*/
case D<dynamic, T3> d:
print('d');
break;
}
}
exhaustiveLevel1b<T3>(B<T3> a) {
/*
checkingOrder={B<T3>,B1<T3>,B2},
subtypes={B1<T3>,B2},
type=B<T3>
*/
switch (a) {
/*space=B<T3>*/
case B<T3> b:
print('b');
break;
}
/*
checkingOrder={B<T3>,B1<T3>,B2},
subtypes={B1<T3>,B2},
type=B<T3>
*/
switch (a) {
/*space=B1<T3>*/
case B1<T3> b1:
print('b1');
break;
/*space=B2*/
case B2 b2:
print('b2');
break;
}
}
exhaustiveLevel2<T4>(A<T4> a) {
// TODO(johnniwinther): Room for improvement here. We could recognized the
// direct passing of type variables in D.
/*
checkingOrder={A<T4>,B<T4>,C,D<dynamic, dynamic>,B1<T4>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
error=non-exhaustive:D1<dynamic, dynamic>();D2<dynamic>(),
expandedSubtypes={B1<T4>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
subtypes={B<T4>,C,D<dynamic, dynamic>},
type=A<T4>
*/
switch (a) {
/*space=B1<T4>*/
case B1<T4> b1:
print('b1');
break;
/*space=B2*/
case B2 b2:
print('b2');
break;
/*space=C1*/
case C1 c1:
print('c1');
break;
/*space=C2<dynamic>*/
case C2<dynamic> c2:
print('c2');
break;
/*space=D1<dynamic, T4>*/
case D1<dynamic, T4> d1:
print('d1');
break;
/*space=D2<T4>*/
case D2<T4> d2:
print('d2');
break;
/*space=D3<dynamic>*/
case D3<dynamic> d3:
print('d3');
break;
/*space=D4*/ case D4 d4:
print('d4');
break;
}
}
exhaustiveLevel0_1_2<T5>(A<T5> a) {
/*
checkingOrder={A<T5>,B<T5>,C,D<dynamic, dynamic>,B1<T5>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
expandedSubtypes={B1<T5>,B2,C1,C2<dynamic>,D1<dynamic, dynamic>,D2<dynamic>,D3<dynamic>,D4},
subtypes={B<T5>,C,D<dynamic, dynamic>},
type=A<T5>
*/
switch (a) {
/*space=B<T5>*/
case B<T5> b:
print('b');
break;
/*space=C1*/
case C1 c1:
print('c1');
break;
/*space=C2<dynamic>*/
case C2<dynamic> c2:
print('c2');
break;
/*space=A<T5>*/
case A<T5> _:
print('_');
break;
}
}