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

时间:2017-10-29 21:06:00

标签: eclipse dsl xtext

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

2 个答案:

答案 0 :(得分:1)

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

  1. 在从MyDslIdeContentProposalProvider开始的 my.dsl.ide 子项目中实施IdeContentProposalProvider,并打包为 my.dsl.ide.contentassistant (新创建);可以在here中找到这种实现的示例。 实现并不像众所周知的Eclipse UI提议提供者那样方便。我必须基于MyDslGrammarAccess元素而不是像UI提议提供程序中的结构语法元素来实现切换用例。另一方面,对于所有编辑器案例,我只有一个提案实施方式(DRY原则!)。
  2. 在同一项目中的MyDslIdeContentProposalProvider上注册MyDslIdeModule(仅在Web编辑器中已经生效)。

    def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
        MyDslIdeContentProposalProvider
    }
    
  3. my.dsl.ui MyDslIdeContentProposalProvider上注册新的UiToIdeContentProposalProvider 转发类MyDslUiModule >子项目。 (这是花了最长的时间,因为它不能从逻辑上得出。)

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

    有关完整示例,请参见here

  4. 当我在新创建的包 my.dsl.ide.contentassistant 中实现了MyDslIdeContentProposalProvider时,该包必须导出到MANIFEST.MF文件中子项目 my.dsl.ide 的项目(随后的两个出口已经存在)。否则我会收到错误消息访问限制:MyDslUiModule中的必需项目限制了该类型的访问。

    Export-Package: my.dsl.ide.contentassist,
      my.dsl.ide.contentassist.antlr,
      my.dsl.ide.contentassist.antlr.internal
    

    这样,它对于Eclipse和Web编辑器都适用。

再次感谢Christian的最初提示!

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

答案 1 :(得分:0)

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