Xtext: ссылка на класс Java из MyDsl

В моем DSL я хочу иметь код, который выглядит так:

SomeType varName;

Где SomeType — класс Java.

Позже, если допустим, SomeType является java-классом enum, и кто-то напишет

varName=SOME_VALUE

Я хочу выполнить проверку, чтобы увидеть, действительно ли SomeType.java имеет SOME_VALUE в качестве значения в своем перечислении. Я видел это руководство https://eclipse.org/Xtext/documentation/305_xbase.html

но я не уверен, что это то, что мне нужно (мне нужно импортировать файлы .mydsl, а не только jvm). Любая помощь будет оценена по достоинству. Спасибо.


person John Benedetto    schedule 01.11.2016    source источник
comment
ну этот вопрос совсем неконкретный. а как насчет того, чтобы просто поэкспериментировать с xbase?   -  person Christian Dietrich    schedule 01.11.2016


Ответы (1)


Если вам нужны ссылки на типы Java, используйте org.eclipse.xtext.xbase.Xtype в качестве суперграмматики. Затем вы можете написать правило, например

VariableDeclaration:
    type=JvmTypeReference name=ValidID ';';

чтобы выразить образец кода.

Если вы также хотите выразить назначения, я предлагаю использовать org.eclipse.xtext.xbase.Xbase в качестве суперграмматики (которая наследуется от Xtype) и использовать правило XExpression везде, где вы хотите ссылаться на элементы из Java, например.

VariableAssignment:
    variable=[VariableDeclaration|ValidId] '=' expression=XExpression;

Чтобы упростить задачу, вы также можете использовать XExpression для объявлений переменных (XVariableDeclaration — это специальное XExpression) и для присваивания (XAssignment — еще одно специальное XExpression). Это позволило бы писать такие вещи, как

{
    var SomeType varName
    varName = SomeType.SOME_VALUE
}

с одним вызовом XBlockExpression (составное выражение, заключенное в фигурные скобки):

MyFunkyRule:
    ...
    expressionBlock=XBlockExpression
    ...
person Miro Spönemann    schedule 03.11.2016