为 Web 编辑器在 Xtext 中自定义内容建议

Customizing content proposal in Xtext for web editors

我有一个用 Xtext 编写的 DSL。为了添加自定义内容提案,我在 ui 项目中编辑了 MyDslProposalProvider class。当我在 Eclipse 中调试插件时会出现新建议,但不会在 Web 编辑器中出现,而这正是我最终想要的。我想在一个地方设置自定义建议,所有生成的编辑器都可以使用它们。可以用 Xtext 做到这一点吗?

您需要继承 org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider 并将其绑定到 YourDslIdeModuleYourDslUiModule 中。然后(在 Xtext 2.13 中)您可以使用绑定在 YourDslUiModule 中的 org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider 委托给 eclipse ui.

中的绑定

因为我遇到了同样的问题并且在解决方案上遇到了一些困难(因为我想同时使用 Eclipse 编辑器和 Web 编辑器)我想在这里提供一些关于可能解决方案的更详细的反馈,对我来说效果很好。 在我的解决方案中,我执行了以下步骤。

  1. my.dsl.ide 扩展自 IdeContentProposalProvider 的子项目中实现 MyDslIdeContentProposalProvider,包 my.dsl.ide。 contentassistant(新建);可以找到此类实现的示例 here。 实现不像众所周知的 UI Eclipse 提案提供者那样方便。我必须基于 MyDslGrammarAccess 元素而不是像 UI 提议提供者中那样的结构语法元素来实现 switch cases。另一方面,对于所有编辑器案例,我只有一个实施方案(DRY 原则!)。
  2. 在同一项目中的 MyDslIdeModule 处注册 MyDslIdeContentProposalProvider(仅当它已经在 Web 编辑器中工作时)。

    def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
        MyDslIdeContentProposalProvider
    }
    
  3. 注册新MyDslIdeContentProposalProvider转发classUiToIdeContentProposalProviderMyDslUiModule my.dsl.ui 子项目。 (这是调查时间最长的原因,因为无法从逻辑上推导出来。)

    override Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
        return UiToIdeContentProposalProvider
    }
    
    def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
        return JavaPOSConfigLanguageIdeContentProposalProvider
    }
    

    有关完整示例,请参阅 here

  4. 因为我在新创建的包my.dsl.ide.contentassistant中实现了MyDslIdeContentProposalProvider,这个包必须导出到子项目 my.dsl.ideMANIFEST.MF 文件(后续的 2 个导出已经存在)。否则我会得到一个错误 访问限制:由于 MyDslUiModule.

    中所需项目 的限制,类型无法访问
    Export-Package: my.dsl.ide.contentassist,
      my.dsl.ide.contentassist.antlr,
      my.dsl.ide.contentassist.antlr.internal
    

    这种方式适用于 Eclipse 和 Web 编辑器。

再次感谢 Christian 的初步提示!

...如果我能许愿,我希望 MyDslIdeContentProposalProvider 中的结构语法元素访问与我们今天在 UI 提案提供者中所拥有的相同。