我想在我的对象名称中有一个交叉引用。用我的语言,我会这样:
2. Sentence
....
2.a. sentence
1. sentence
其中2是“ 2.句子”的名称
[我希望“ 2.a.句子”的名称为“ 2.a”,而“ 2.a”中的“ 2”是对“ 2.句子”的引用。
我已经尝试过:
(name = ([Step|StepName] '.' CHAR ))
和
(name = (step = [Step|StepName] '.' CHAR))
但是我刚遇到错误。
现在,我正在寻找更改Xtext生成的实现文件(我更改了getName()方法),但是没有获得所需的结果。由于包含在“ 2.a”中的EObject在QualifiedName中没有“ 2”,因此只有“ a”。如果我们查看“ 1.句子”,我希望它的QualifiedName为“ 2.a.1”
有关问题的解决方案,您可以在这里看到:
但是我会解释。
首先,您将创建一个扩展原始IQualifiedNameProvider的IQualifideNameProvider。在该类中,您将创建QualifiedName的组成方式。这是我的做法:
class MyDslQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
@Inject
IQualifiedNameConverter converter = new
IQualifiedNameConverter.DefaultImpl();
override QualifiedName getFullyQualifiedName(EObject obj) {
if (obj instanceof HelloGreeting) {
val nodes = NodeModelUtils.findNodesForFeature(obj,
MyDslPackage.Literals.HELLO_GREETING__PERSON);
for (node : nodes) {
val text = NodeModelUtils.getTokenText(node);
if (text !== null) {
return converter.toQualifiedName(text);
}
}
}
return super.getFullyQualifiedName(obj);
}
}
此扩展代码将生成一个QualifiedName,该名称恰好是您的交叉引用HELLO_GREETING_PERSON的文本,如果要编写名称,则需要获取EObject的名称并连接字符串以创建QualifiedName。
例如,这是我的代码,我将其添加为我的名字:
var a = obj.eContainer();
var FN = (a as UseCase).getName() + "." + text + "." + (obj as Extension).getName();
然后您将需要更改您的RunTimeModulo添加:
override Class<? extends IQualifiedNameProvider>
bindIQualifiedNameProvider() {
return typeof(MyDslQualifiedNameProvider);
}
在您的类RunTimeModule内部。
为我工作。这些代码是从上面的PDF中精确提取的,我只是想帮助您了解需要做什么。