blob: fb09d47b6eef6e88c96bc5047644e8e93da05d14 [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.
class A {
B field1;
B field2;
A(this.field1, this.field2);
}
sealed class B {}
class C extends B {}
class D extends B {}
class E extends B {}
and(A o1, A o2) {
var a = /*type=A*/ switch (o1) {
A() && var a /*space=A*/ => 0,
_ /*
error=unreachable,
space=A
*/
=>
1,
};
var b = /*type=A*/ switch (o1) {
A() && var a /*space=A*/ => 0,
};
}
intersectSameClass(A o1, A o2, A o3) {
var a = /*type=A*/ switch (o1) {
A() && A() /*space=A*/ => 0,
};
var b = /*
fields={field1:B,field2:B},
type=A
*/
switch (o2) {
A(:var field1) && A(:var field2) /*space=A(field1: B, field2: B)*/ => [
field1,
field2
],
};
var c = /*
error=non-exhaustive:A(field1: C(), field2: C()),
fields={field1:B,field2:B},
type=A
*/
switch (o3) {
A(:var field1, field2: C()) &&
A(field1: D(), :var field2) /*space=A(field1: D, field2: C)*/ =>
10,
};
}
intersectSubClass(A o1, A o2, A o3) {
var a = /*type=A*/ switch (o1) {
Object() && A() /*space=A*/ => 0,
};
var b = /*
fields={field1:B,hashCode:int},
type=A
*/
switch (o2) {
A(:var field1) &&
Object(:var hashCode) /*space=A(field1: B, hashCode: int)*/ =>
[field1, hashCode],
};
var c = /*
error=non-exhaustive:A(field1: C(), field2: C(), hashCode: int())/A(field1: C(), field2: C()),
fields={field1:B,field2:B,hashCode:int},
type=A
*/
switch (o3) {
Object(:var hashCode) &&
A(
:var field1,
field2: D()
) /*space=A(hashCode: int, field1: B, field2: D)*/ =>
10,
};
}
intersectUnion(A o1, A o2, B o3, B o4) {
var a = /*
fields={field1:B,field2:B},
type=A
*/
switch (o1) {
A(field1: C() || D()) &&
A(field2: C() || D()) /*space=A(field1: C|D, field2: C|D)*/ =>
0,
A(field1: C() || E()) &&
A(field2: C() || E()) /*space=A(field1: C|E, field2: C|E)*/ =>
1,
A(field1: D() || E()) &&
A(field2: D() || E()) /*space=A(field1: D|E, field2: D|E)*/ =>
2,
};
var b = /*
fields={field1:B},
type=A
*/
switch (o2) {
A(field1: C() || D()) && A(field1: D() || E()) /*space=A(field1: D|?)*/ =>
0,
A(field1: C() || E()) && A(field1: C() || E()) /*space=A(field1: C|E|?)*/ =>
1,
};
var c = /*
checkingOrder={B,C,D,E},
subtypes={C,D,E},
type=B
*/
switch (o3) {
(C() || D()) && B() /*space=C|D*/ => 0,
B() && (D() || E()) /*space=D|E*/ => 1,
};
var d = /*
checkingOrder={B,C,D,E},
subtypes={C,D,E},
type=B
*/
switch (o3) {
(C() || D() || E()) && (C() || D() || E()) /*space=C|D|E|?*/ => 0,
};
}