blob: e637dba7f890934be367f83f99573da23284831d [file]
// 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.
class A {
int field;
A(this.field);
}
sealed class B {}
class C extends B {}
class D extends B {}
class E extends B {}
sealed class F<T> {}
class G<T> extends F<T> {}
class H extends F<int> {}
class I<T, S> extends F<T> {}
enum Enum<T> {
a1<int>(),
a2<int>(),
b1<String>(),
b2<String>(),
c1<bool>(),
c2<bool>(),
}
simpleCast(o1, o2) {
var a = /*
checkingOrder={Object?,Object,Null},
subtypes={Object,Null},
type=Object?
*/ switch (o1) {
_ as A /*space=()*/ => 0,
_ /*
error=unreachable,
space=()
*/ =>
1,
};
var b = /*
checkingOrder={Object?,Object,Null},
subtypes={Object,Null},
type=Object?
*/ switch (o2) {
_ as A /*space=()*/ => 0,
};
}
restrictedCase(o1, o2) {
// Cast shouldn't match everything, because even though it doesn't throw,
// it might not match.
var a = /*
checkingOrder={Object?,Object,Null},
fields={field:-},
subtypes={Object,Null},
type=Object?
*/ switch (o1) {
A(field: 42) as A /*space=A(field: 42)|Null*/ => 0,
_ /*space=()*/ => 1,
};
var b = /*
checkingOrder={Object?,Object,Null},
error=non-exhaustive:Object(),
fields={field:-},
subtypes={Object,Null},
type=Object?
*/ switch (o2) {
A(field: 42) as A /*space=A(field: 42)|Null*/ => 0,
};
}
sealedCast(B b1, B b2) {
/*
checkingOrder={B,C,D,E},
subtypes={C,D,E},
type=B
*/
switch (b1) {
/*space=C*/
case C():
/*space=B?*/
case D() as D:
}
/*
checkingOrder={B,C,D,E},
subtypes={C,D,E},
type=B
*/
switch (b2) {
/*space=D*/
case D():
/*space=B?*/
case C c as C:
}
}
genericSealedCast<T>(F<T> f1, F<T> f2) {
/*
checkingOrder={F<T>,G<T>,H,I<dynamic, dynamic>},
subtypes={G<T>,H,I<dynamic, dynamic>},
type=F<T>
*/
switch (f1) {
/*space=G<T>*/
case G<T>():
/*space=F<T>?*/
case H() as H:
}
/*
checkingOrder={F<T>,G<T>,H,I<dynamic, dynamic>},
subtypes={G<T>,H,I<dynamic, dynamic>},
type=F<T>
*/
switch (f2) {
/*space=G<T>*/
case G<T>():
/*space=F<T>?*/
case I() as I<dynamic, dynamic>:
}
}
nullCast(A? a1, A? a2) {
var b1 = /*
checkingOrder={A?,A,Null},
subtypes={A,Null},
type=A?
*/ switch (a1) {
A() as A /*space=A?*/ => 0,
};
var b2 = /*
checkingOrder={A?,A,Null},
subtypes={A,Null},
type=A?
*/ switch (a2) {
Null _ as Null /*space=A?*/ => 0,
};
}
enumCast(Enum e) {
/*
checkingOrder={Enum<dynamic>,Enum.a1,Enum.a2,Enum.b1,Enum.b2,Enum.c1,Enum.c2},
subtypes={Enum.a1,Enum.a2,Enum.b1,Enum.b2,Enum.c1,Enum.c2},
type=Enum<dynamic>
*/
switch (e) {
/*space=Enum<dynamic>?*/
case Enum<int>() as Enum<int>:
return 0;
}
/*
checkingOrder={Enum<dynamic>,Enum.a1,Enum.a2,Enum.b1,Enum.b2,Enum.c1,Enum.c2},
subtypes={Enum.a1,Enum.a2,Enum.b1,Enum.b2,Enum.c1,Enum.c2},
type=Enum<dynamic>
*/
switch (e) {
/*space=Enum.a1*/
case Enum.a1:
/*space=Enum.a2*/
case Enum.a2:
return 0;
/*space=Enum<dynamic>?*/
case Enum<String> e as Enum<String>:
return 1;
}
}
unrelatedCast(B b1, B? b2) {
/*
checkingOrder={B,C,D,E},
subtypes={C,D,E},
type=B
*/
switch (b1) {
/*space=B?*/
case H() as H:
}
/*
checkingOrder={B?,B,Null,C,D,E},
expandedSubtypes={C,D,E,Null},
subtypes={B,Null},
type=B?
*/
switch (b2) {
/*space=B?*/
case H h as H:
}
}
sealed class J {}
class K extends J {}
sealed class L extends J {}
class M extends L {}
class N extends L {}
class O extends N {}
exhaustiveNested(J j1, J j2, J j3, J j4, J j5, J j6) {
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j1) {
/*space=J?*/
case J() as J:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j2) {
/*space=J?*/
case K() as K:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j3) {
/*space=J?*/
case L() as L:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j4) {
/*space=J?*/
case M() as M:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j5) {
/*space=J?*/
case N() as N:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j6) {
/*space=J?*/
case O() as O:
/*
error=unreachable,
space=N
*/
case N():
}
}
nonExhaustiveNested(J j) {
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j) {
/*space=J?*/
case O() as O:
}
}
exhaustiveNestedMultiple(J j1, J j2, J j3, J j4, J j5, J j6) {
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j1) {
/*space=K*/
case K():
/*space=J?*/
case J() as J:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j2) {
/*space=M*/
case M():
/*space=J?*/
case K() as K:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j3) {
/*space=K*/
case K():
/*space=J?*/
case L() as L:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j4) {
/*space=K*/
case K():
/*space=J?*/
case M() as M:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j5) {
/*space=K*/
case K():
/*space=J?*/
case N() as N:
}
/*
checkingOrder={J,K,L,M,N},
expandedSubtypes={K,M,N},
subtypes={K,L},
type=J
*/
switch (j6) {
/*space=M*/
case M():
/*space=J?*/
case O() as O:
}
}