默认情况下,Xtext 允许在创建新项目时为 DSL 文件指定单个扩展名。但是,可以为单个 DSL 添加更多扩展,如Xtext FAQ中所述。但我无法让它处理没有扩展名的文件。
一个典型的例子是Make构建系统的 makefile。可以使用Makefile
,GNUmakefile
和*.mk
名称,Eclipse 将为此类文件打开同一个编辑器。
我想让 Xtext 识别*.mydsl
文件和名为Mydsl
.
我试图添加
filenames="Mydsl"
属性到我的 UI 项目中扩展点的editor
节点。这使 Eclipse 能够在适当的编辑器中打开文件。但是当我尝试从任何其他文件中引用定义的元素时,Xtext 不会索引这些文件并报告链接错误。org.eclipse.ui.editors
plugin.xml
Mydsl
Mydsl
有没有办法让 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)
返回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.IResourceFactory
为org.eclipse.emf.ecore.content_parser
,再次使用扩展工厂 - 将内容类型绑定添加到
org.eclipse.ui.editors
,org.eclipse.compare.contentViewers
和org.eclipse.compare.contentMergeViewers
- 根据您是否需要旧的扩展绑定,删除
org.eclipse.emf.ecore.extension_parser
和org.eclipse.xtext.extension_resourceServiceProvider
扩展
我的案例的变更集(应用于新项目)可以在这里找到。