LocalQuickFix 및 IntentionAction 구현의 필드를 보고합니다. 추가적으로, 타입이 안전한 것으로 알려진 필드에서 @SafeFieldForPreview 어노테이션이 과도하게 사용되면 보고됩니다.
인텐션 미리보기는 빠른 수정 또는 인텐션 액션이 적용될 때 현재 파일이 어떻게 변경되는지 표시하는 IntelliJ 플랫폼 기능입니다. 빠른 수정에서는 이를 구현하기 위해, 현재 파일의 비물리적 사본을 가리키는 사용자 지정 ProblemDescriptor로 LocalQuickFix.generatePreview()가 호출됩니다. 인텐션 액션에서 IntentionAction.generatePreview()는 현재 파일 및 가상 에디터의 비물리적 사본으로 호출됩니다.
일반적으로 이 메서드는 LocalQuickFix.applyFix() 또는 IntentionAction.invoke()에만 적용됩니다.
하지만 일부 빠른 수정은 물리적 요소를 직간접적으로 참조할 수 있으며 쓰기에 이를 사용할 수 있습니다. 결과적으로 빠른 수정에서는 비물리적 PSI 대신 물리적 PSI의 업데이트를 시도하므로 미리보기가 작동하지 않습니다.
이 문제를 방지하기 위해 빠른 수정 또는 인텐션 액션 클래스의 모든 인스턴스 필드에 안전한 타입(예: 기본, 문자열 등)이 있을 때만 generatePreview()의 디폴트 구현을 위임합니다.
다음과 같은 다양한 방식으로 이 문제를 수정할 수 있습니다.
@SafeFieldForPreview 어노테이션을 필드에 추가할 수 있습니다. 쓰기 가능한 PSI 참조를 필드 타입이 저장할 수 없는 경우에도 @SafeTypeForPreview를 사용할 수 있습니다.
getFileModifierForPreview() 메서드를 재정의하고, 매개변수로 제공된 비물리적 파일 사본으로 이를 다시 바인딩하는 빠른 수정의 사본을 생성할 수 있습니다. 제공된 비물리적 사본 내부에서 해당하는 PSI 요소를 찾으려면 PsiTreeUtil.findSameElementInCopy()를 사용하세요.
ProblemDescriptor.getPsiElement()에서 필요한 모든 정보를 인텐션 액션의 빠른 수정 또는 제공된 파일/에디터에서 직접 추출합니다.
LocalQuickFixAndIntentionActionOnPsiElement 추상 클래스를 상속하고 startElement 및 endElement 매개변수가 있는 invoke() 및 isAvailable() 메서드를 구현할 수도 있습니다. 이러한 매개변수는 비물리적 파일 사본에 자동 매핑됩니다.
generatePreview() 메서드를 재정의하고 완전히 사용자 지정된 미리보기 동작을 제공할 수도 있습니다.
예를 들어 해당 액션이 현재 파일 수정 외의 작업을 수행하는 경우에는 실제 미리보기 대신 사용자 지정 HTML 문서를 표시할 수 있습니다.
이 검사는 getFileModifierForPreview() 또는 generatePreview()의 사용자 지정 구현이 있으면 보고하지 않습니다. 하지만 이것이 구현이 올바르며 미리보기가 작동한다는 뜻은 아닙니다.
테스트를 하세요. 또한, 미리보기 결과는 백그라운드 스레드에서 계산되므로 미리보기 중에 쓰기 액션을 시작하거나 쓰기 액션이 필요한 작업을 수행할 수 없습니다. 마지막으로 startInWriteAction()이 false를 반환하면 미리보기가 자동으로 생성되지 않습니다. 이 경우에는 사용자 지정 generatePreview() 구현이 필요합니다.
2022.1의 새로운 기능