Dart 진단 메시지
Dart 진단 메시지
Dart 분석기(analyzer)가 내는 오류가 왜 생겼는지, 어떻게 고쳐야 할지 헤맨 적 있으신가요? 사실 답을 찾는 데 필요한 정보가 사용자가 아는 것보다 더 많이 숨겨져 있을 수 있어요. 이 글에서는 Dart 분석기가 알려주는 진단(diagnostic) 메시지에서 이 추가 정보를 찾아내는 방법을 소개할게요.
본문
누구나 한 번쯤 에러 메시지를 보고 그것이 무슨 뜻인지, 어떻게 대처해야 하는지 궁금해한 적이 있으실 거예요. 그 질문에 답하는 데 쓸 수 있는 정보가 생각보다 더 많이 준비되어 있을 수 있다는 점을 아는 게 중요해요.
아주 흔한 예를 하나 들어볼게요. values가 null이 아닌지 확인한 뒤 그 값을 사용하는 코드에 문제가 하나 생겼어요. 에러 메시지는 null 비교가 values의 타입을 non-nullable로 승격시키지 못했다는 내용이에요.
IntelliJ IDEA에서는 이 메시지가 Dart Analysis 뷰에 보여요. Visual Studio Code에서는 문제 메시지가 Problems 패널에 표시되고요.
그런데 이상하죠. 바로 윗줄에서 values가 null이 아닌지 확인했으니까요. 메시지는 무엇이 잘못됐는지는 알려주지만, 왜 그 확인이 충분하지 않았는지, 어떻게 대응해야 하는지는 설명하지 않아요. 그 추가 정보는 실제로 존재하는데, 다만 찾는 방법이 당장 눈에 띄지 않는 것뿐이에요. 이 글의 나머지 부분에서는 IntelliJ IDEA, Visual Studio Code, 그리고 dart analyze 명령줄 도구의 출력에서 이 정보가 어디에 있는지 보여드릴게요.
IntelliJ IDEA
IntelliJ IDEA에서는 강조 표시된 텍스트 위에 마우스를 올리면(호버) 더 많은 정보를 볼 수 있어요.
호버에는 앞서 본 메시지(이걸 문제 메시지(problem message) 라고 불러요)뿐 아니라 유용한 정보 몇 가지가 더 담겨 있어요.
- 진단에 관한 외부 문서 링크
- 왜 null 비교가 프로퍼티 타입을 non-nullable로 승격(promote)시키기에 충분하지 않았는지 설명하는 컨텍스트 메시지(context message)
- 코드를 고치기 위해 할 수 있는 일들을 설명하는 교정 메시지(correction message)
컨텍스트 메시지에는 타입 승격(type promotion)과 관련된 추가 문서의 URL이 들어 있고, 해당 필드가 정의된 줄과 파일도 알려줘요. 안타깝게도 호버에서는 컨텍스트 위치로 이동할 수 없지만, Dart Analysis 뷰에서는 이동할 수 있어요.
Dart Analysis 뷰는 문제 메시지만 표시하지만, 메시지를 더블클릭하면 문제가 보고되는 빨간 물결 밑줄이 있는 지점으로 이동해요. 그 밖의 유용한 기능은 컨텍스트 메뉴를 열면 나타나요.
컨텍스트 메뉴를 통해 문제 메시지를 더블클릭하는 것과 같은 동작을 하는 Jump to Source 를 이용해 진단이 보고된 위치로 이동하거나, 컨텍스트 메시지 라벨이 붙은 메뉴 항목을 통해 values의 선언부로 이동할 수 있어요. Open Documentation 을 선택하면 해당 진단에 대한 외부 문서가 열리고요.
Visual Studio Code
Visual Studio Code에는 추가 정보를 보는 방법이 두 가지 있어요. 첫 번째는 Problems 패널의 항목을 펼치는 방법이에요.
첫 번째 줄이 앞서 본 메시지(문제 메시지)예요. 첫 번째나 두 번째 줄을 더블클릭하면 문제가 있는 빨간 물결 밑줄 지점으로 이동해요.
두 번째 줄은 코드를 고치기 위해 할 수 있는 일을 설명하는 교정 메시지예요. 여기에는 진단의 ID가 라벨로 붙은 링크도 들어 있어서, 클릭하면 해당 진단의 외부 문서가 열려요.
세 번째 줄은 왜 null 비교가 타입을 non-nullable로 승격시키기에 충분하지 않았는지 설명하는 컨텍스트 메시지예요. 컨텍스트 메시지를 더블클릭하면 values의 선언부로 이동하고, 컨텍스트 메시지에는 타입 승격과 관련된 추가 문서 URL이 들어 있어요.
강조 표시된 텍스트 위에 마우스를 올려 호버 텍스트를 열어도 이 정보를 볼 수 있어요. 호버 텍스트에는 Problems 패널과 같은 정보가 담겨 있어요. 외부 문서로 이동하는 링크와 values 선언부로 이동하는 링크가 있죠.
dart analyze
명령줄 분석기인 dart analyze도 IDE와 같은 정보를 표시할 수 있어요. 다만 모든 정보를 보려면 --verbose 플래그를 사용해야 해요.
$ dart analyze --verbose
정리
이 글이 분석기의 진단을 이해하는 데 필요한 정보를 더 쉽게 찾는 데 도움이 되길 바라요.
메시지가 명확하지 않거나, 다른 관련 코드 위치를 찾는 데 도움이 되는 컨텍스트 메시지가 필요하거나, 문서가 충분히 완전하지 않아서 여전히 이해하기 어려운 진단을 발견하셨다면, dart-lang/sdk 이슈를 만들어 알려주세요. 저희는 항상 도구를 개선하는 데 관심이 있거든요.
더 알아보기
- Dart 분석기 진단 목록 — 각 진단 코드가 무슨 뜻인지 확인해 보세요.
- 타입 승격과 soundness에 관해서는 타입 승격 문서를 참고하세요.