Java ファイルのカスタムの問題を Eclipse の問題ビューに報告し、クイック フィックスを提供したいと考えています。
標準的な方法は、拡張ポイントを使用org.eclipse.core.resources.markers
してカスタム マーカーを宣言し、 を呼び出してマーカーを追加することorg.eclipse.core.resources.IResource.createMarker(String)
です。次に、拡張ポイントorg.eclipse.ui.ide.markerResolution
を使用して、カスタム マーカーのクイック フィックスを提供できます。
上記のアプローチは、リソース マーカーを作成および解決する言語に依存しない方法です。欠点は、カスタム Java の問題を解決するために定型コードを書かなければならないことです。代わりに、再利用したいと思いIQuickFixProcessor
ます。つまり、拡張ポイントを使用してカスタム Java マーカーを解決したいと考えていますorg.eclipse.jdt.ui.quickFixProcessors
。この拡張ポイントを使用すると、マーカーが見つかった Java ファイルを解析する必要がなくなりました。バインディングを作成して、マーカーをカバーする AST ノードを見つける必要もありません。再利用しないorg.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator
と、その依存関係のほとんどが複製されてしまいます。
JDT インフラストラクチャを使用してカスタム Java マーカーのクイック フィックスを提供するにはどうすればよいですか?
試行 1:
カスタム マーカーを次のように定義しました。
<extension
id="custom.marker"
name="Custom Java Problem"
point="org.eclipse.core.resources.markers">
<super type="org.eclipse.jdt.core.problem"/>
<super type="org.eclipse.core.resources.problemmarker"/>
<super type="org.eclipse.core.resources.textmarker"/>
<persistent value="true"/>
</extension>
次に、メソッドを呼び出して上記のマーカーのインスタンスを追加しましたIResource.createMarker("custom.marker")
。
次に、カスタム Quick Fix プロセッサを定義しました。
<extension
point="org.eclipse.jdt.ui.quickFixProcessors">
<quickFixProcessor
class="quickfixes.CustomQuickFixProcessor"
id="quickfixes.quickFixProcessor">
</quickFixProcessor>
</extension>
カスタム マーカーは Eclipse の問題ビューに表示されますが、カスタムの問題を右クリックすると、[クイック フィックス] メニュー項目が無効になります。
試行 2:
に交換IMarker marker = resource.createMarker("custom.marker");
しましたIMarker marker = resource.createMarker(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
。この変更の結果、問題ビューでカスタムの問題を右クリックすると、[クイック修正] メニュー項目が使用可能になりますが、それを選択すると、選択した問題に対して利用可能な修正がないことを示すダイアログがポップアップします。問題。CustomQuickFixProcessor.hasCorrections(ICompilationUnit, int)
ただし、が呼び出されて返されることを確認しましたがtrue
、CustomQuickFixProcessor.getCorrections(IInvocationContext, IProblemLocation[])
呼び出されません。
試行 3:
試行 3 は試行 2 の続きです。IJavaModelMarker.ID
次のようにカスタム マーカーを設定します。
marker.setAttribute(IJavaModelMarker.ID, IProblem.ExternalProblemFixable);
その結果、CustomQuickFixProcessor.getCorrections
エディターでカスタム マーカーにカーソルを合わせるか、Java エディターの左マージンにあるライト ビルドをクリックすると呼び出されます。しかし、問題ビューでマーカーを選択し、マーカーを右クリックして [クイック フィックス] メニュー項目を選択してCustomQuickFixProcessor.getCorrections
も、呼び出されず、クイック フィックスが利用できないことを示すダイアログが表示されます。
CustomQuickFixProcessor.getCorrections
問題ビューからクイック フィックスを呼び出したときにJDT が呼び出されない理由を確認するために、デバッグ モードで JDT を実行しました。コンパイル ユニットの AST にカスタムの問題が見つからないため、CorrectionMarkerResolutionGenerator.internalGetResolutions(IMarker)
解決策が見つからないことが判明しました。CorrectionMarkerResolutionGenerator.hasProblem (context.getASTRoot().getProblems(), location)
カスタム マーカーをコンパイル ユニットの AST に関連付ける方法がわかりません。