2

默认情况下,Xtext 允许在创建新项目时为 DSL 文件指定单个扩展名。但是,可以为单个 DSL 添加更多扩展,如Xtext FAQ中所述。但我无法让它处理没有扩展名的文件。

一个典型的例子是Make构建系统的 makefile。可以使用Makefile,GNUmakefile*.mk名称,Eclipse 将为此类文件打开同一个编辑器。

我想让 Xtext 识别*.mydsl文件和名为Mydsl.

我试图添加

filenames="Mydsl"

属性到我的 UI 项目中扩展点的editor节点。这使 Eclipse 能够在适当的编辑器中打开文件。但是当我尝试从任何其他文件中引用定义的元素时,Xtext 不会索引这些文件并报告链接错误。org.eclipse.ui.editorsplugin.xmlMydslMydsl

有没有办法让 Xtext 处理具有固定名称但没有扩展名的源文件以及常规文件?

UPD。1

根据塞巴斯蒂安的回答,我尝试plugin.xml在主项目中指定自定义内容类型:

<extension
      point="org.eclipse.core.contenttype.contentTypes">
    <content-type
         base-type="org.eclipse.core.runtime.text"
         file-extensions="mydsl"
         file-names="Mydsl"
         id="org.xtext.example.mydsl.contentType"
         name="My Language"
         priority="normal">
    </content-type>
</extension>

并将其绑定如下:

<extension
      point="org.eclipse.xtext.content_resourceServiceProvider">
    <resourceServiceProvider
         class="org.xtext.example.mydsl.MyDslResourceServiceProvider"
         contentTypeIdentifier="org.xtext.example.mydsl.contentType">
    </resourceServiceProvider>
</extension>

但我仍然得到如上所述的链接错误。我还在所有方法中添加了断点MyDslResourceServiceProvider,它似乎甚至没有被实例化或以某种方式调用。

我还尝试将这些扩展移动到 UI 项目,但也没有任何效果。

UPD。2

最后,我做到了。简而言之,让事情顺利进行的步骤:

  • org.eclipse.core.contenttype.contentTypes使用扩展点定义新的内容类型
  • org.eclipse.emf.ecore.resource.impl.PlatformContentHandlerImpl通过扩展类和覆盖方法来创建内容处理程序,当且仅当参数不是时才canHandle(URI)返回truenull
  • 注册它org.eclipse.emf.ecore.content_handler
  • 创建一个始终canHandle(URI)返回的新资源服务提供者。true可以扩展org.eclipse.xtext.resource.impl.DefaultResourceServiceProvider和覆盖相应的方法
  • 在UI项目中绑定它org.eclipse.xtext.content_resourceServiceProvider,别忘了在类名前指定一个扩展工厂
  • 在 UI 项目中注册org.eclipse.xtext.resource.IResourceFactoryorg.eclipse.emf.ecore.content_parser,再次使用扩展工厂
  • 将内容类型绑定添加到org.eclipse.ui.editors,org.eclipse.compare.contentViewersorg.eclipse.compare.contentMergeViewers
  • 根据您是否需要旧的扩展绑定,删除org.eclipse.emf.ecore.extension_parserorg.eclipse.xtext.extension_resourceServiceProvider扩展

我的案例的变更集(应用于新项目)可以在这里找到。

4

1 回答 1

1

您可以尝试利用资源服务提供者和资源工厂的扩展点。它允许通过文件扩展名或内容类型注册服务/工厂。如果您为文件提供合适的内容类型,我认为后者应该可以工作。

于 2011-11-10T21:43:11.697 回答