Как изменить разделитель QualifiedNames - PullRequest
0 голосов
/ 01 августа 2020

Я хочу изменить разделитель QualifiedName с '.' на '#'. Ниже моя попытка. Следующий пример из интерактивной документации.

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Domainmodel:
    (elements+=AbstractElement)*;
 
PackageDeclaration:
    'package' name=QualifiedName '{'
        (elements+=AbstractElement)*
    '}';
 
AbstractElement:
    PackageDeclaration | Type;
 
QualifiedName:
    ID ('#' ID)*;
 
Type:
    DataType | Entity;
 
DataType:
    'datatype' name=ID;
 
Entity:
    'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
        (features+=Feature)*
    '}';
 
Feature:
    (many?='many')? name=ID ':' type=[Type|QualifiedName];

package org.xtext.example.mydsl

import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    override  bindIQualifiedNameProvider() {
        return MyDslQualifiedNameProvider
    }
    
}

class MyDslQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
    val converter = new MyDslQualifiedNameConverter();
    
    override getConverter(){
        converter
    }
    
}

class MyDslQualifiedNameConverter extends IQualifiedNameConverter.DefaultImpl {
    override getDelimiter() {
            return "#";
    }
}

Я не смог сослаться на Entity в пакете, таком как "my # company # blog # Blog" в следующем. IDE предлагает выражение "моя # компания # блог. Блог", но это тоже не работает.

datatype String
package my#company#blog{ 
    entity Blog{
        title : String
    }
}
entity Blog2 extends my#company#blog#Blog{
    title : String
}

1 Ответ

0 голосов
/ 04 августа 2020

Решает использование Guice. Вот как это делается. В AbstractMyDslRuntimeModule нет метода привязки, который можно было бы переопределить. Родительский класс AbstractGenericModule выполняет эту задачу с помощью собственного метода getBindings.

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    def Class<? extends IQualifiedNameConverter> bindIQualifiedNameConverter() {
        return MyDslQualifiedNameConverter;
    }
}
class MyDslQualifiedNameConverter extends IQualifiedNameConverter.DefaultImpl {
    override getDelimiter() {
            return "#";
    }
}
...