【发布时间】:2012-11-18 00:55:23
【问题描述】:
我想向 Eclipse 的问题视图报告 Java 文件的自定义问题并为它们提供快速修复。
标准的做法是使用扩展点org.eclipse.core.resources.markers 来声明一个自定义标记并通过调用org.eclipse.core.resources.IResource.createMarker(String) 添加标记。然后,可以使用扩展点org.eclipse.ui.ide.markerResolution 为自定义标记提供快速修复。
上述方法是一种独立于语言的创建和解析资源标记的方法。缺点是我必须编写一些样板代码来解决我的自定义 Java 问题。相反,我想重用IQuickFixProcessor。也就是说,我想使用扩展点org.eclipse.jdt.ui.quickFixProcessors 解析我的自定义Java 标记。使用这个扩展点,我不再需要解析找到标记的 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);
因此,当我将鼠标悬停在编辑器中的自定义标记上或单击 Java 编辑器左边距的 light-build 时,CustomQuickFixProcessor.getCorrections 会被调用。但是,当我在“问题视图”中选择标记时,右键单击该标记,然后选择“快速修复”菜单项,CustomQuickFixProcessor.getCorrections 不会被调用,并且会出现一个对话框,指出没有可用的快速修复。
我在调试模式下运行 JDT,看看为什么当我从问题视图调用快速修复时它不调用 CustomQuickFixProcessor.getCorrections。原来CorrectionMarkerResolutionGenerator.internalGetResolutions(IMarker) 找不到解决方案,因为CorrectionMarkerResolutionGenerator.hasProblem (context.getASTRoot().getProblems(), location) 在编译单元的 AST 中没有找到自定义问题。我不确定如何将我的自定义标记与编译单元的 AST 关联起来。
【问题讨论】:
-
你有没有得到这个工作?
标签: java eclipse eclipse-jdt