默认情况下,Xtext允许在创建新项目时为DSL文件指定单个扩展名。但是,如Xtext FAQ中所述,可以为单个DSL添加更多扩展。但我无法使用没有扩展名的文件。
一个典型的例子是Make构建系统的makefile。可以使用Makefile
,GNUmakefile
和*.mk
名称,Eclipse将为这些文件打开相同的编辑器。
我想让Xtext识别*.mydsl
个文件和名为Mydsl
的文件。
我尝试添加
filenames="Mydsl"
属性为我的UI项目的editor
中org.eclipse.ui.editors
个扩展点的plugin.xml
节点。这使Eclipse能够在适当的编辑器中打开Mydsl
个文件。但是当我尝试从任何其他文件引用Mydsl
中定义的元素时,Xtext不会索引这些文件并报告链接错误。
有没有办法让Xtext能够处理具有固定名称但没有扩展名的常规文件的源文件?
根据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项目,但也没有效果。
最后,我做到了。 简而言之,让事情顺利进行的步骤:
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
并覆盖相应的方法org.eclipse.xtext.content_resourceServiceProvider
,不要忘记在类名之前指定扩展工厂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
扩展程序我的案例的变更集(适用于新项目)可以找到here。
答案 0 :(得分:1)
您可以尝试利用资源服务提供程序和资源工厂的扩展点。它允许通过文件扩展名或内容类型注册服务/工厂。如果您为文件提供合适的内容类型,我认为后者应该有效。