blob: db4381fdd37d6c1d7f90a19e07ff62cde0545fca [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.
enum E { a, b, c }
class PrimitiveEquals {
final int field;
const PrimitiveEquals(this.field);
}
class NonPrimitiveEquals {
final int field;
const NonPrimitiveEquals(this.field);
int get hashCode => field.hashCode;
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is NonPrimitiveEquals && field == other.field;
}
}
switchStatement(o) {
switch (o) {
case [var a] when a > 5:
case [_, var a] when a < 5:
print(a);
case {1: var a}:
print(a);
}
}
switchStatementWithLabel(o) {
switch (o) {
case [var a] when a > 5:
case [_, var a] when a < 5:
print(a);
case {1: var a}:
print(a);
label:
case 1:
print(1);
}
}
switchStatementWithContinue(o) {
switch (o) {
case [var a] when a > 5:
case [_, var a] when a < 5:
print(a);
case {1: var a}:
print(a);
continue label1;
case 0:
print(o);
label1:
case 1:
print(1);
continue label2;
label2:
case 2:
print(2);
}
}
switchStatementWithContinueNested(o1, o2) {
switch (o1) {
case [var a]:
print(a);
case {1: var a}:
print(a);
switch (o2) {
case [var a] when a > 5:
case [_, var a] when a < 5:
print(a);
case {1: var a}:
print(a);
continue label2a;
case 0:
print(o2);
continue label1b;
label1b:
case 1:
print(1);
continue label2b;
label2b:
case 2:
print(2);
continue label1a;
}
case 0:
print(o1);
label1a:
case 1:
print(1);
continue label2a;
label2a:
case 2:
print(2);
switch (o2) {
case [var a] when a > 5:
case [_, var a] when a < 5:
print(a);
case {1: var a}:
print(a);
continue label2a;
case 0:
print(o2);
continue label1b;
label1b:
case 1:
print(1);
continue label2b;
label2b:
case 2:
print(2);
continue label1a;
}
}
}
switchStatementEnum(E o) {
switch (o) {
case E.a:
print('a');
case E.b:
print('b');
case E.c:
print('c');
}
}
switchStatementEnumWithGuard(E o) {
switch (o) {
case E.a when true:
print('a');
case E.b:
print('b');
case _:
}
}
switchStatementEnumWithLabel(E o) {
switch (o) {
case E.a:
print('a');
label:
case E.b:
print('b');
case E.c:
print('c');
}
}
switchStatementEnumWithContinue(E o) {
switch (o) {
case E.a:
print('a');
continue label1;
label1:
case E.b:
print('b');
continue label2;
label2:
case E.c:
print('c');
}
}
switchStatementPrimitiveEquals(o) {
switch (o) {
case const PrimitiveEquals(0):
print('a');
case const PrimitiveEquals(1):
print('b');
}
}
switchStatementNonPrimitiveEquals(o) {
switch (o) {
case const NonPrimitiveEquals(0):
print('a');
case const NonPrimitiveEquals(1):
print('b');
}
}
switchExpression(o) {
return switch (o) {
[var a] => a,
{1: var a} => a,
_ => null,
};
}
switchExpressionEnum(E o) {
return switch (o) {
E.a => 0,
E.b => 1,
E.c => 2,
};
}
switchExpressionEnumWithGuard(E o) {
return switch (o) {
E.a when true => 0,
E.b => 1,
_ => 2,
};
}
switchExpressionPrimitiveEquals(o) {
return switch (o) {
const PrimitiveEquals(0) => 0,
const PrimitiveEquals(1) => 1,
_ => 2,
};
}
switchExpressionNonPrimitiveEquals(o) {
return switch (o) {
const NonPrimitiveEquals(0) => 0,
const NonPrimitiveEquals(1) => 1,
_ => 2,
};
}
switchStatementSymbol(Symbol s) {
switch (s) {
case #a:
return 0;
case const Symbol('b'):
return 1;
default:
return 2;
}
}
switchExpressionSymbol(Symbol s) {
return switch (s) {
#a => 0,
const Symbol('b') => 1,
_ => 2,
};
}