我有一个用Xtext编写的DSL。为了添加自定义内容提案,我在MyDslProposalProvider
项目中编辑了ui
类。当我在Eclipse中调试插件时,新的提议出现了,而不是在Web编辑器中,这最终是我想要的。我想在一个地方设置自定义提案,并将所有生成的编辑器设置为使用它们。是否可以使用Xtext做到这一点?
答案 0 :(得分:1)
由于我遇到了同样的问题,并且在解决方案上有些挣扎(我想同时使用Eclipse编辑器和Web编辑器),我想在这里提供一些关于可能的解决方案的更详细的反馈,该方法很好用为了我。 在我的解决方案中,我执行了以下步骤。
MyDslIdeContentProposalProvider
开始的 my.dsl.ide 子项目中实施IdeContentProposalProvider
,并打包为 my.dsl.ide.contentassistant (新创建);可以在here中找到这种实现的示例。
实现并不像众所周知的Eclipse UI提议提供者那样方便。我必须基于MyDslGrammarAccess
元素而不是像UI提议提供程序中的结构语法元素来实现切换用例。另一方面,对于所有编辑器案例,我只有一个提案实施方式(DRY原则!)。在同一项目中的MyDslIdeContentProposalProvider
上注册MyDslIdeModule
(仅在Web编辑器中已经生效)。
def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
MyDslIdeContentProposalProvider
}
在 my.dsl.ui MyDslIdeContentProposalProvider上注册新的UiToIdeContentProposalProvider
和转发类MyDslUiModule
>子项目。 (这是花了最长的时间,因为它不能从逻辑上得出。)
override Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
return UiToIdeContentProposalProvider
}
def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
return JavaPOSConfigLanguageIdeContentProposalProvider
}
有关完整示例,请参见here。
当我在新创建的包 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
并将其绑定到YourDslIdeModule
和YourDslUiModule
。然后(在Xtext 2.13中)你可以使用org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider
中绑定的YourDslUiModule
委托给eclipse中的那个。