Xtext: ссылка на класс Java из MyDsl
В моем DSL я хочу иметь код, который выглядит следующим образом:
SomeType varName;
куда SomeType
это класс Java
Позже, если допустим, SomeType является jum-классом enum, и кто-то пишет
varName=SOME_VALUE
Я хочу сделать проверку, чтобы увидеть, есть ли на самом деле SomeType.java SOME_VALUE
как значение в его перечислении. Я видел этот учебник https://eclipse.org/Xtext/documentation/305_xbase.html
но я не уверен, что это то, что мне нужно (мне нужно импортировать файлы.mydsl, а не только jvm). Любая помощь будет оценена. Благодарю.
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
...