【问题标题】:Customizing content proposal in Xtext for web editors在 Xtext 中为 Web 编辑器定制内容建议
【发布时间】:2017-10-29 21:06:00
【问题描述】:

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

【问题讨论】:

    标签: eclipse dsl xtext


    【解决方案1】:

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

    1. my.dsl.ide 子项目中实现一个 MyDslIdeContentProposalProvider,从 IdeContentProposalProvider 扩展,包 my.dsl.ide.contentassistant(新创建);可以在here 中找到此类实现的示例。 该实现不如众所周知的 Eclipse UI 提议提供者方便。我必须基于 MyDslGrammarAccess 元素而不是 UI 提案提供程序中的结构语法元素来实现切换案例。另一方面,我对所有编辑器案例只有一个提案实现方式(DRY 原则!)。
    2. 在同一个项目中注册MyDslIdeContentProposalProviderMyDslIdeModule(只有它已经在网络编辑器中工作)。

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

      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 (随后的 2 个导出已经存在)。否则我会在MyDslUiModule 中收到错误访问限制:由于对所需项目的限制,该类型无法访问

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

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

    再次感谢 Christian 最初的提示!

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

    【讨论】:

    • 谢谢,内容非常丰富!我还查看了 JHipster,非常喜欢它!
    • 请注意:我不是 JHipster 的作者。 :-) 我只是将它用作示例,因为我的项目是封闭源代码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2012-03-13
      • 2015-09-26
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多