¿Cómo incluyo archivos sin extensión para mi Xtext DSL?

Por defecto, Xtext permite especificar una sola extensión para archivos DSL al crear un nuevo proyecto. Sin embargo, es posible agregar más extensiones para un solo DSL como se describe en Preguntas frecuentes de Xtext. Pero no pude hacer que funcionara con archivos sin extensión.

Un ejemplo típico es un archivo MAKE para Realice sistema de construcción. Uno puede usar Makefile, GNUmakefile y *.mk nombres, y Eclipse abrirá el mismo editor para dichos archivos.

Quiero que Xtext reconozca ambos *.mydsl archivos y un archivo llamado Mydsl.

Traté de agregar

filenames="Mydsl"

atribuir a editor nodo de org.eclipse.ui.editors punto de extensión en plugin.xml de mi proyecto de interfaz de usuario. Esto permite que Eclipse se abra Mydsl archivos en el editor adecuado. Pero Xtext no indexa estos archivos e informa errores de vinculación cuando trato de referir un elemento definido en Mydsl de cualquier otro archivo.

¿Hay alguna manera de permitir que Xtext procese archivos fuente con nombre fijo pero sin extensión, así como archivos normales?

UPD. 1

De acuerdo con La respuesta de sebastian Intenté especificar un tipo de contenido personalizado en plugin.xml del proyecto principal:

<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>

Y enlazándolo de la siguiente manera:

<extension
      point="org.eclipse.xtext.content_resourceServiceProvider">
    <resourceServiceProvider
         class="org.xtext.example.mydsl.MyDslResourceServiceProvider"
         contentTypeIdentifier="org.xtext.example.mydsl.contentType">
    </resourceServiceProvider>
</extension>

Pero sigo teniendo errores de vinculación como se describe anteriormente. También agregué puntos de interrupción en todos los métodos de MyDslResourceServiceProvider y parece que ni siquiera se crea una instancia o se invoca de alguna manera.

También intenté mover estas extensiones al proyecto de interfaz de usuario, pero sin ningún efecto.

UPD. 2

Finalmente lo hice. Pasos para que las cosas funcionen en pocas palabras:

  • Defina un nuevo tipo de contenido usando org.eclipse.core.contenttype.contentTypes punto de extensión
  • Cree un controlador de contenido ampliando org.eclipse.emf.ecore.resource.impl.PlatformContentHandlerImpl clase y anulación canHandle(URI) método para regresar true si y solo si el argumento no es null
  • Regístrese con org.eclipse.emf.ecore.content_handler
  • Cree un nuevo proveedor de servicios de recursos con canHandle(URI) volver true siempre. Uno puede extender org.eclipse.xtext.resource.impl.DefaultResourceServiceProvider y anular el método correspondiente
  • En el proyecto de interfaz de usuario, vincúlelo a org.eclipse.xtext.content_resourceServiceProvider, no olvide especificar una fábrica de extensiones antes del nombre de la clase
  • En el registro del proyecto de la interfaz de usuario org.eclipse.xtext.resource.IResourceFactory as org.eclipse.emf.ecore.content_parser, de nuevo con la fábrica de extensiones
  • Agregar enlaces de tipo de contenido a org.eclipse.ui.editors, org.eclipse.compare.contentViewers y org.eclipse.compare.contentMergeViewers
  • Dependiendo de si necesita un enlace de extensión antiguo o no, elimine org.eclipse.emf.ecore.extension_parser y org.eclipse.xtext.extension_resourceServiceProvider extensiones

Se puede encontrar un conjunto de cambios (aplicado a un proyecto nuevo) para mi caso aquí.

preguntado el 08 de noviembre de 11 a las 16:11

1 Respuestas

Podría intentar aprovechar el punto de extensión para proveedores de servicios de recursos y fábricas de recursos. Permite registrar servicios / fábrica ya sea por extensión de archivo o por tipo de contenido. Creo que esto último debería funcionar si proporciona un tipo de contenido adecuado para sus archivos.

respondido 11 nov., 11:01

¡Gracias, Sebastian! Lo intentaré pronto y contaré los resultados. - Eldar Abusalimov

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.