exhaustive_cases 진단: switch에 누락된 case가 있을 때

exhaustive_cases 진단: switch에 누락된 case가 있을 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. exhaustive_casesenum처럼 쓰이는 타입을 switch 문으로 검사할 때 일부 상수의 case 절이 빠졌을 때 분석기가 알려주는 린트(lint) 진단이에요. 이 진단은 린트 규칙 페이지와도 연결되어 있어요.

출처: exhaustive_cases

본문

설명

분석기는 enum처럼 쓰이는 타입의 인스턴스에 대한 switch 문이 그 타입의 상수 중 하나 이상에 대한 case 절을 빠뜨리고, default 절도 없을 때 이 진단을 만들어요.

enum처럼 쓰이는 타입(enum-like type)은 다음 조건을 만족하는 클래스나 확장 타입이에요.

  • private이고 factory가 아닌 생성자만 가진다.
  • 타입이 자기 자신인 static const 필드를 두 개 이상 가진다.

추가로 enum처럼 쓰이는 클래스는 추상(abstract)이 아니어야 하고, 정의하는 라이브러리 안에 서브클래스가 없어야 해요.

예시

다음 코드는 switch 문이 상수 C.c에 대한 case 절을 빠뜨려서 이 진단이 나와요.

class const C._(final int i) {
  static const C a = ._(1);
  static const C b = ._(2);
  static const C c = ._(3);
}

void f(C c) {
  switch (c) {
    case .a:
      print('a');
    case .b:
      print('b');
  }
}

확장 타입도 enum처럼 쓰일 수 있어요. 다음 코드는 switch 문이 상수 E.b에 대한 case 절을 빠뜨려서 이 진단이 나와요.

extension type const E._(int value) {
  static const E a = ._(1);
  static const E b = ._(2);
}

void f(E e) {
  switch (e) {
    case .a:
      print('a');
  }
}

흔한 해결 방법

빠진 상수를 따로 처리해야 한다면 그 상수에 대한 case 절을 추가해요.

class const C._(final int i) {
  static const C a = ._(1);
  static const C b = ._(2);
  static const C c = ._(3);
}

void f(C c) {
  switch (c) {
    case .a:
      print('a');
    case .b:
      print('b');
    case .c:
      print('c');
  }
}

빠진 상수를 특별히 처리할 필요가 없다면 default 절을 추가해 그 상수를 처리하게 해요.

class const C._(final int i) {
  static const C a = ._(1);
  static const C b = ._(2);
  static const C c = ._(3);
}

void f(C c) {
  switch (c) {
    case .a:
      print('a');
    case .b:
      print('b');
    default:
      print('other');
  }
}

더 알아보기