【问题标题】:How to implement Quick Fix / Quick Assist for custom eclipse editor?如何为自定义 Eclipse 编辑器实现 Quick Fix / Quick Assist?
【发布时间】:2012-02-15 06:03:20
【问题描述】:

我已扩展 org.eclipse.ui.editors.text.TextEditor 以实现自定义编辑器。 对于这个编辑器,我定义了一个标记类型(org.eclipse.core.resources.markers 扩展点)和一个注释类型(org.eclipse.ui.editors.annotationTypes 扩展点)来在我的编辑器中标记代码的特定部分。我使用协调器来更新我的注释模型。

现在我想添加一个快速修复/快速协助功能。当我将鼠标悬停在代码的带注释部分并用给定的字符串替换该部分时,当我单击一个提案时,我只是希望 Eclipse 显示一个带有提案的框。就像 java 编辑器的快速修复功能一样。

那么,实现这种行为的最佳方式是什么?

我阅读了有关标记分辨率生成器和快速辅助处理器的信息,但我仍然对它们如何协同工作感到困惑......

如果有人能指出正确的方向,我会很高兴。

编辑:据我目前了解,MarkerResolutionGenerator 负责在问题视图中显示快速修复。为了在源代码查看器中快速修复,我必须为我的SourceViewer 设置一个QuickAssistAssistant 并实现一个返回CompletionProposalsQuickAssistProcessor。 这是正确的做法吗?

EDIT2:我想知道我需要Markers,还是只需要Annotations,我很困惑......

【问题讨论】:

    标签: eclipse editor eclipse-pde eclipse-plugin


    【解决方案1】:

    您必须向扩展点 org.eclipse.ui.ide.markerResolution 注册扩展。这个扩展引用了一个markerType(使用markerId),也是一个分辨率生成器。

    后一个组件负责计算可能的修复:它读取标记,可以检查相关文件等,并创建标记解析实例。这些解析实例基本上处理了错误的文件,并有望解决原始问题。

    在标记解析期间,您不必担心删除标记,因为在执行修复后,有时验证会再次运行(例如,在构建期间,或者如果没有自动验证可用,则手动进行 - 但它不是标记分辨率的任务以更新标记列表)。

    【讨论】:

    • 我这样做了,但我的标记解析生成器的方法从未被调用。我认为这是正确的方法,如果您有一个管理保存和构建标记的生成器,但我将注释添加到我的 AnnotationModel,因为我只需要在键入时进行错误标记。还是我必须在我的 SourceViewerConfiguration 中设置一些东西才能让分辨率生成器工作?
    • AFAIK 快速修复未注册到注释,而是注册到标记。您可以使用 markerannotationspecification 扩展点从标记自动创建注释。
    • 我现在正在创建标记并将 MarkerAnnotations 添加到我的注释模型中,但快速修复仅在问题视图中可用。如何让鼠标悬停在源代码查看器中时出现快速修复?
    • 对不起-我没有任何进一步的想法...也许如果我有时间,我会尝试寻找更多文档/源代码...
    【解决方案2】:

    我终于找到了如何让 Quick Fix 为我的编辑器工作。

    我使用annotationTypes 扩展点来注册我自己的注释类型,并使用markerAnnotationSpecification 扩展点来指定外观。在我的自定义SourceViewerConfiguration 类中,我覆盖getAnnotationHover(...) 以返回DefaultAnnotationHover 对象和getTextHover(...) 以返回DefaultTextHover 对象,因此注释显示在我的源代码查看器中。

    然后我用我自己的IReconcilingStrategy 实现覆盖getReconciler(...) 以返回MonoReconciler,以在其reconcile(...) 方法中创建注释。最后,我用我自己的IQuickAssistProcessor 实现覆盖getQuickAssistAssistant(...) 以返回QuickAssistAssistant。当我按下 CTRL+1 时,处理器类中的 computeQuickAssistProposals(...) 方法计算出现的快速修复建议。

    我不创建任何Marker 对象,也不使用MarkerResolutionGenerator,因为标记概念比仅使用注释要重得多,并且注释提供的功能适合我的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2022-11-29
      • 2016-06-28
      • 2014-11-06
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多