По умолчанию Xtext позволяет указать одно расширение для файлов DSL при создании нового проекта.Однако можно добавить дополнительные расширения для одного DSL, как описано в Xtext FAQ .Но я не мог заставить его работать с файлами без расширения.
Типичным примером является make-файл для Make build build.Можно использовать имена Makefile
, GNUmakefile
и *.mk
, и Eclipse откроет один и тот же редактор для таких файлов.
Я хочу, чтобы Xtext распознал как файлы *.mydsl
, так и файл с именем Mydsl
.
Я попытался добавить атрибут
filenames="Mydsl"
к editor
узлу org.eclipse.ui.editors
точки расширения в plugin.xml
моего проекта пользовательского интерфейса.Это позволяет Eclipse открывать файлы Mydsl
в соответствующем редакторе.Но Xtext не индексирует эти файлы и сообщает об ошибках связывания, когда я пытаюсь ссылаться на элемент, определенный в 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
, и кажется, что он даже не создается и не вызывается каким-либо образом.
Я также пытался переместить эти расширения в проект пользовательского интерфейса, но безрезультатно.
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
и переопределить соответствующий метод - В проекте пользовательского интерфейса привязать его к
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
расширения
Набор изменений (примененный к новому проекту) для моего случая можно найти здесь .