为 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
并将其绑定到 YourDslIdeModule
和 YourDslUiModule
中。然后(在 Xtext 2.13 中)您可以使用绑定在 YourDslUiModule
中的 org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider
委托给 eclipse ui.
中的绑定
因为我遇到了同样的问题并且在解决方案上遇到了一些困难(因为我想同时使用 Eclipse 编辑器和 Web 编辑器)我想在这里提供一些关于可能解决方案的更详细的反馈,对我来说效果很好。
在我的解决方案中,我执行了以下步骤。
- 在 my.dsl.ide 扩展自
IdeContentProposalProvider
的子项目中实现 MyDslIdeContentProposalProvider
,包 my.dsl.ide。 contentassistant(新建);可以找到此类实现的示例 here。
实现不像众所周知的 UI Eclipse 提案提供者那样方便。我必须基于 MyDslGrammarAccess
元素而不是像 UI 提议提供者中那样的结构语法元素来实现 switch cases。另一方面,对于所有编辑器案例,我只有一个实施方案(DRY 原则!)。
在同一项目中的 MyDslIdeModule
处注册 MyDslIdeContentProposalProvider
(仅当它已经在 Web 编辑器中工作时)。
def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
MyDslIdeContentProposalProvider
}
注册新MyDslIdeContentProposalProvider
和转发classUiToIdeContentProposalProvider
在MyDslUiModule
my.dsl.ui 子项目。 (这是调查时间最长的原因,因为无法从逻辑上推导出来。)
override Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
return UiToIdeContentProposalProvider
}
def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
return JavaPOSConfigLanguageIdeContentProposalProvider
}
有关完整示例,请参阅 here。
因为我在新创建的包my.dsl.ide.contentassistant中实现了MyDslIdeContentProposalProvider
,这个包必须导出到子项目 my.dsl.ide 的 MANIFEST.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 提案提供者中所拥有的相同。
我有一个用 Xtext 编写的 DSL。为了添加自定义内容提案,我在 ui
项目中编辑了 MyDslProposalProvider
class。当我在 Eclipse 中调试插件时会出现新建议,但不会在 Web 编辑器中出现,而这正是我最终想要的。我想在一个地方设置自定义建议,所有生成的编辑器都可以使用它们。可以用 Xtext 做到这一点吗?
您需要继承 org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider
并将其绑定到 YourDslIdeModule
和 YourDslUiModule
中。然后(在 Xtext 2.13 中)您可以使用绑定在 YourDslUiModule
中的 org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider
委托给 eclipse ui.
因为我遇到了同样的问题并且在解决方案上遇到了一些困难(因为我想同时使用 Eclipse 编辑器和 Web 编辑器)我想在这里提供一些关于可能解决方案的更详细的反馈,对我来说效果很好。 在我的解决方案中,我执行了以下步骤。
- 在 my.dsl.ide 扩展自
IdeContentProposalProvider
的子项目中实现MyDslIdeContentProposalProvider
,包 my.dsl.ide。 contentassistant(新建);可以找到此类实现的示例 here。 实现不像众所周知的 UI Eclipse 提案提供者那样方便。我必须基于MyDslGrammarAccess
元素而不是像 UI 提议提供者中那样的结构语法元素来实现 switch cases。另一方面,对于所有编辑器案例,我只有一个实施方案(DRY 原则!)。 在同一项目中的
MyDslIdeModule
处注册MyDslIdeContentProposalProvider
(仅当它已经在 Web 编辑器中工作时)。def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() { MyDslIdeContentProposalProvider }
注册新
MyDslIdeContentProposalProvider
和转发classUiToIdeContentProposalProvider
在MyDslUiModule
my.dsl.ui 子项目。 (这是调查时间最长的原因,因为无法从逻辑上推导出来。)override Class<? extends IContentProposalProvider> bindIContentProposalProvider() { return UiToIdeContentProposalProvider } def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() { return JavaPOSConfigLanguageIdeContentProposalProvider }
有关完整示例,请参阅 here。
因为我在新创建的包my.dsl.ide.contentassistant中实现了
中所需项目 的限制,类型无法访问MyDslIdeContentProposalProvider
,这个包必须导出到子项目 my.dsl.ide 的MANIFEST.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 提案提供者中所拥有的相同。