Как включить файлы без расширения для моего Xtext DSL? - PullRequest
2 голосов
/ 08 ноября 2011

По умолчанию 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 расширения

Набор изменений (примененный к новому проекту) для моего случая можно найти здесь .

1 Ответ

1 голос
/ 11 ноября 2011

Вы можете попытаться использовать точку расширения для поставщиков услуг ресурсов и фабрик ресурсов. Это позволяет регистрировать сервисы / фабрики либо по расширению файла, либо по типу контента. Я думаю, что последний должен работать, если вы предоставляете подходящий тип контента для ваших файлов.

...