【发布时间】:2017-10-29 21:06:00
【问题描述】:
我有一个用 Xtext 编写的 DSL。为了添加自定义内容提案,我在ui 项目中编辑了MyDslProposalProvider 类。当我在 Eclipse 中调试插件时会出现新的建议,但不会出现在 Web 编辑器中,这最终是我想要的。我想将自定义提案设置在一个地方,并且所有生成的编辑器都可以使用它们。用 Xtext 可以做到这一点吗?
【问题讨论】:
我有一个用 Xtext 编写的 DSL。为了添加自定义内容提案,我在ui 项目中编辑了MyDslProposalProvider 类。当我在 Eclipse 中调试插件时会出现新的建议,但不会出现在 Web 编辑器中,这最终是我想要的。我想将自定义提案设置在一个地方,并且所有生成的编辑器都可以使用它们。用 Xtext 可以做到这一点吗?
【问题讨论】:
由于我遇到了同样的问题并且在解决方案上遇到了一些困难(因为我想同时使用 Eclipse 编辑器和 Web 编辑器),所以我想在这里提供一些关于可能的解决方案的更详细的反馈,它运作良好为了我。 在我的解决方案中,我执行了以下步骤。
MyDslIdeContentProposalProvider,从 IdeContentProposalProvider 扩展,包 my.dsl.ide.contentassistant(新创建);可以在here 中找到此类实现的示例。
该实现不如众所周知的 Eclipse UI 提议提供者方便。我必须基于 MyDslGrammarAccess 元素而不是 UI 提案提供程序中的结构语法元素来实现切换案例。另一方面,我对所有编辑器案例只有一个提案实现方式(DRY 原则!)。在同一个项目中注册MyDslIdeContentProposalProviderMyDslIdeModule(只有它已经在网络编辑器中工作)。
def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
MyDslIdeContentProposalProvider
}
在my.dsl.ui子项目的MyDslUiModule处注册新的MyDslIdeContentProposalProvider和转发类UiToIdeContentProposalProvider。 (这是用了最长的调查时间,因为它无法从逻辑上推导出来。)
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 (随后的 2 个导出已经存在)。否则我会在MyDslUiModule 中收到错误访问限制:由于对所需项目的限制,该类型无法访问。
Export-Package: my.dsl.ide.contentassist,
my.dsl.ide.contentassist.antlr,
my.dsl.ide.contentassist.antlr.internal
这样它对编辑器、Eclipse 和 Web 都适用。
再次感谢 Christian 最初的提示!
...如果我可以许愿,我希望在MyDslIdeContentProposalProvider 中拥有与我们今天在 UI 提案提供者中相同的结构语法元素访问权限。
【讨论】:
您需要继承org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider 并将其绑定到YourDslIdeModule 和YourDslUiModule。然后(在 Xtext 2.13 中)您可以使用绑定在 YourDslUiModule 中的 org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider 在 eclipse ui 中委托给它。
【讨论】: