exhaustive_cases 진단: switch에 누락된 case가 있을 때
exhaustive_cases 진단: switch에 누락된 case가 있을 때
Dart 분석기가 내보내는 진단에는 이름이 있어요. exhaustive_cases는 enum처럼 쓰이는 타입을 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');
}
}