분석 이슈를 위한 Quick fixes
분석 이슈를 위한 Quick fixes (Quick fixes for analysis issues)
진단을 한 번의 클릭으로 해결하는 방법을 알아볼게요.
출처: 원문
본문
저처럼 개발 시간의 너무 많은 부분을 분석기(analyzer)가 찾아내는 문제(diagnostic)를 고치는 데 보내시나요? 더 쉬웠으면 좋겠다고 바란 적이 있다면 좋은 소식이 있어요. 분석기가 생성하는 진단 중 상당수는 quick fix를 사용해서 자동으로 고칠 수 있어요.
quick fix는 특정 진단이 보고한 이슈를 고치는 것을 목표로 하는 자동화된 편집이에요. 'Dart 진단 메시지' 글에서 우리는 다음 코드를 살펴봤어요.
quick fix 제안이 있는 오류를 보여주는 코드 스니펫.
수정 메시지는 문제를 해결하는 두 가지 방법을 제안해요. "접근을 조건부로 만들기('?.' 사용)와 대상에 null 검사 추가하기('!')".
강조된 영역(빨간색 물결 밑줄이 있는 부분)을 클릭하면 편집기 왼쪽 가장자리 근처에 전구 아이콘이 보여요. 그 위에 마우스를 올리고 클릭하면 사용 가능한 quick fix가 들어 있는 메뉴가 열려요.
제안된 두 수정 모두 메뉴에서 사용할 수 있어요. 하나를 선택하면 변경이 코드에 적용돼요. 예를 들어 첫 번째 fix를 선택하면 코드가 다음과 같이 업데이트돼요.
null 검사 안에서 values.length를 values?.length로 바꾼 quick fix 적용 후의 Dart 코드.
먼저 IntelliJ IDEA와 Visual Studio Code 양쪽에서 fix를 적용하는 방법을 간단히 살펴보고, 그다음 quick fix가 할 수 있는 더 강력한 예시를 보여줄게요.
IntelliJ IDEA
편집기의 컨텍스트 작업(context actions) 메뉴는 다음과 같아요.
values.length에 '.'를 '?.'로 바꾸거나 null 검사를 추가하는 옵션을 제공하는 IntelliJ IDEA 컨텍스트 작업 메뉴.
편집기의 컨텍스트 메뉴에서 "Show Context Actions"를 선택하거나, 키보드 단축키(Windows와 Linux에서는 Alt+Enter, macOS에서는 Option+Enter)를 사용해서 같은 목록에 접근할 수 있어요.
강조된 영역 위에 마우스를 올렸을 때 나오는 호버 텍스트에서 직접 이 fix를 호출할 수도 있어요. fix가 너무 많으면 "More Actions" 항목도 메뉴를 열어 줘요.
values.length는 무조건 접근할 수 없다고 설명하면서 ?. quick fix를 제공하는 IntelliJ IDEA 호버 텍스트.
그것으로 부족하다면 Dart Analysis 뷰의 컨텍스트 메뉴에서도 사용 가능한 fix를 호출할 수 있어요.
nullable values.length 진단에 대한 quick fix를 제공하는 IntelliJ IDEA의 Dart Analysis 컨텍스트 메뉴.
Visual Studio Code
편집기의 코드 작업(code actions) 메뉴는 다음과 같아요.
values.length에 '.'를 '?.'로 바꾸거나 null 검사를 추가하는 옵션을 제공하는 Visual Studio Code 작업 메뉴.
처음 두 항목은 quick fix이고 나머지는 리팩터링이에요. 같은 목록에는 키보드 단축키(Windows와 Linux에서는 Control+., MacOS에서는 Command+.)를 사용하거나, 편집기의 호버 텍스트에서 "Quick Fix…"를 선택해서 접근할 수 있어요.
'.'를 '?.'로 바꾸는 옵션을 제공하는 quick fix 메뉴가 열려 있는 Visual Studio Code의 Problems 패널.
Problems 패널의 컨텍스트 메뉴에서도 호출할 수 있어요.
문제 항목에 'Quick Fix'와 'Copy' 옵션을 보여주는 Visual Studio Code 컨텍스트 메뉴.
또 다른 예시
위의 fix는 수정 메시지를 찾아서 직접 편집하는 수고를 덜어 주지만, 문자 하나를 추가하는 건 솔직히 엄청난 시간 절약은 아니에요. 하지만 어떤 fix는 더 큰 생산성 향상을 제공해요. 다음 코드를 생각해 보세요.
'await file.readAsString();'라는 코드에 'await' 아래 빨간 물결선이 있고 non-async 함수에서 await를 사용했다는 오류를 보여주는 IDE.
진단은 "await 표현식은 async 함수에서만 사용할 수 있습니다"라고 알려줘요. 동기 I/O를 사용하고 싶지 않다고 가정하면, 수정은 함수 본문에 async 키워드를 표시하는 거예요. 그렇게 하면 메서드의 반환 타입이 Future여야 한다는 또 다른 오류가 생겨서, 결국 반환 타입도 업데이트해야 해요.
다행히 원래 문제에 대한 quick fix가 있어요.
'await' 오류를 고치기 위해 'Add async modifier'가 강조된 quick fix 메뉴를 보여주는 IDE.
이 fix를 선택하면 수정자(modifier)를 추가할 뿐 아니라 반환 타입도 업데이트해서, 한 단계로 문제를 고칠 수 있어요.
quick fix 적용 후의 코드로, 이제 'async' 키워드가 있고 반환 타입이 String의 Future로 업데이트된 모습.
요약
모든 문제가 자동으로 고쳐질 수 있는 건 아니고, 가능할 수 있는 모든 문제에 quick fix가 있는 것도 아니에요. 그럼에도 고칠 진단이 있을 때 다음번에는 사용 가능한 quick fix가 있는지 확인해 볼 만한 가치가 분명히 있어요. 그리고 있어야 할 것 같은 진단에 fix가 안 보이면, dart-lang/sdk 이슈를 만들어 알려 주세요.
더 알아보기
- 편집을 위한 Quick assists — 코드를 바꾸는 공통 변경 자동화
- Dart 진단 메시지 — 분석기 진단 참고 자료