| // 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, | |
| }; | |
| } |