インテンションプレビューの正常動作を妨げている LocalQuickFix および IntentionAction 実装内のフィールドを報告します。 また、型が安全だと分かっているフィールドに対する過剰な @SafeFieldForPreview アノテーションを報告します。

インテンションプレビューは、クイックフィックスまたはインテンションアクションを適用した際に現在のファイルがどのように変化するかを表示する IntelliJ プラットフォームの機能です。 クイックフィックスでこの機能を実現するため、現在ファイルの非物理コピーを参照するカスタム ProblemDescriptor を使用して LocalQuickFix.generatePreview() が呼び出されます。 インテンションアクションでは、現在ファイルの非物理コピーおよび仮想エディターを使用して IntentionAction.generatePreview() が呼び出されます。 通常、これらのメソッドは LocalQuickFix.applyFix() または IntentionAction.invoke() に委譲するだけです。 しかし、一部のクイックフィックスは物理要素を直接または間接的に参照し、それらの要素を書き込みに使用する場合があります。 このようなクイックフィックスは非物理 PSI ではなく物理 PSI の更新を試みるため、結果的にプレビューは機能しません。 この問題を回避するため、generatePreview() のデフォルトの実装では、クイックフィックスまたはインテンションアクションクラスのすべてのインスタンスフィールドに安全な型 (プリミティブや文字列など) がある場合にのみ処理を委譲しています。

この問題は、次のいくつかの方法で解決できる可能性があります。

  1. フィールドに実際に PSI 参照がまったく格納されていない場合、またはその PSI が読み取りのみに使用されている場合は、フィールドに @SafeFieldForPreview アノテーションを付けることができます。 フィールドの型が書き込み可能な PSI 参照を格納することがない場合は、@SafeTypeForPreview を使用することもできます。
  2. getFileModifierForPreview() メソッドをオーバーライドして、パラメーターとして渡されている非物理ファイルのコピーにそれを再バインドするクイックフィックスのコピーを作成できます。 PsiTreeUtil.findSameElementInCopy() を使用し、渡された非物理コピー内の対応する PSI 要素を検出してください。
  3. PSI 参照をフィールドに格納する代わりに、クイックフィックスで ProblemDescriptor.getPsiElement() から、またはインテンションアクションで指定されたファイル/エディターからすべての必要な情報を抽出してみてください。 LocalQuickFixAndIntentionActionOnPsiElement 抽象クラスを継承して、startElement および endElement パラメーターを持つ invoke() および isAvailable() メソッドを実装することもできます。 これらのパラメーターは、非物理ファイルコピーに自動的にマッピングされます。
  4. generatePreview() メソッドをオーバーライドして、完全にカスタムのプレビュー動作を提供できます。 たとえばアクションが現在のファイルを修正する以外の処理を行う場合、実際のプレビューの代わりにカスタム HTML ドキュメントを表示することができます。

このインスペクションは、getFileModifierForPreview()generatePreview() のカスタム実装が存在する場合は報告しません。 ただし、これは実装が正しく、プレビューが機能することを意味するわけではありません。 テストを実施してください。 また、プレビュー結果はバックグラウンドスレッドで計算されるため、プレビュー中に書き込み処理を開始したり、書き込み処理を必要とする操作を実行したりすることはできません。 さらに、startInWriteAction()false を返した場合はプレビューは自動的に生成されません。 この場合はカスタムの generatePreview() を実装する必要があります。

2022.1 の新機能です