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