14

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)ただし、が呼び出されて返されることを確認しましたがtrueCustomQuickFixProcessor.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 に関連付ける方法がわかりません。

4

2 に答える 2

0

試行 1は機能しません。理由:

JDT UI は、次の拡張を定義します。

   <extension
         point="org.eclipse.ui.ide.markerResolution">
      <markerResolutionGenerator
            markerType="org.eclipse.jdt.core.problem"
            class="org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator">
      </markerResolutionGenerator>

つまり、JDT からのクイック フィックスは、markerType="org.eclipse.jdt.core.problem" に対してのみ機能します。

試行 2 : JDT UI 実装でも、QuickFixProcessor#hasCorrections(...) が true を返しても、QuickFixProcessor#getCorrections(...) が修正を返さない場合があります。これは、特定のマーカーに対して常に true または false を返すためです。ただし、特定のマーカーのすべてのインスタンスが「修正可能」であるとは限りません。多分あなたは似たようなことに出くわしますか?

試行 3 : マーカーに設定しているすべての属性は何ですか? それCorrectionMarkerResolutionGenerator.hasProblem(...)をチェックするので、少なくとも IMarker.CHAR_START 属性を設定する必要があります。を見てください org.eclipse.jdt.internal.core.eval.RequestorWrapper.acceptProblem(CategorizedProblem, char[], int)。これは、JDT Core のマーカーが作成される場所です。

于 2012-11-18T21:54:25.747 に答える