如何为我的Xtext DSL包含没有扩展名的文件?

时间:2011-11-08 16:42:05

标签: eclipse content-type dsl xtext

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

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

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

我尝试添加

filenames="Mydsl"

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

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

UPD。 1

根据Sebastian's answer我尝试在主项目的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)方法创建内容处理程序,当且仅当参数不是true
  • 时才返回null
  • 将其注册为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.editorsorg.eclipse.compare.contentViewersorg.eclipse.compare.contentMergeViewers
  • 根据您是否需要旧的扩展程序绑定,请移除org.eclipse.emf.ecore.extension_parserorg.eclipse.xtext.extension_resourceServiceProvider扩展程序

我的案例的变更集(适用于新项目)可以找到here

1 个答案:

答案 0 :(得分:1)

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