invalid-case-patterns

Same as invalid_case_patterns in Dart lints

Path
lint/correctness/invalid-case-patterns
Default
On (recommended)
Origin
Dart lints
Rule
247 of 512
recommended

Flags pre-3.0 switch case expressions that change meaning or break under Dart 3 patterns.

Dart 3 reinterprets case operands as patterns. Code still on a pre-3.0 language version can prepare for the migration by avoiding case expressions that are invalid or mean something different as patterns: non-const list, map, or set literals; implicitly-const constructor calls; identical(...) calls; prefix operators on anything but an integer literal; binary, conditional and is expressions; .length accesses whose receiver, after unwrapping parentheses, is not an identifier; and the identifier _ (a wildcard in Dart 3). The receiver test applies to ordinary and null-aware accesses alike. The lint applies only to libraries whose language version predates 3.0, where falcon parses case operands as expressions.

Invalid

example.dartdart
// @dart = 2.19

class Point {
  const Point(this.x);
  final int x;
}

void check(Object? value, bool a, bool b) {
  switch (value) {
    case [1, 2]:
      break;
    case {'a': 1}:
      break;
    case Point(1):
      break;
    case identical(1, 2):
      break;
    case _:
      break;
    case (<int>[]):
      break;
  }
}
This expression is not valid in a `case` clause in Dart 3.0.
9 switch (value) {
10 case [1, 2]:
This expression is not valid in a `case` clause in Dart 3.0.
11 break;
12 case {'a': 1}:
This expression is not valid in a `case` clause in Dart 3.0.
13 break;
14 case Point(1):
This expression is not valid in a `case` clause in Dart 3.0.
15 break;
16 case identical(1, 2):
This expression is not valid in a `case` clause in Dart 3.0.
17 break;
18 case _:
This expression is not valid in a `case` clause in Dart 3.0.
19 break;
20 case (<int>[]):

Valid

example.dartdart
// @dart = 2.19

class Point {
  const Point(this.x);
  final int x;
}

const origin = Point(0);

void check(Object? value) {
  switch (value) {
    case const [1, 2]:
      break;
    case const {'a': 1}:
      break;
    case const Point(1):
      break;
    case origin:
      break;
    case -1:
      break;
    case 'text':
      break;
    case null:
      break;
  }
}

Configure invalid-case-patterns

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "invalid-case-patterns": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/correctness/invalid-case-patterns: <reason>