Xtext:名称中的交叉引用
Xtext: Crossreference inside names
我希望在我的对象名称中有一个交叉引用。
在我的语言中,我会有这个:
2. Sentence
....
2.a. sentence
1. sentence
其中2为“2.句名”
在这里,我希望“2.a.sentence”的名称是“2.a”,而“2”在“2.a”中是对“的引用” 2.句子"。
我已经试过了:
(name = ([Step|StepName] '.' CHAR ))
和
(name = (step = [Step|StepName] '.' CHAR))
但我刚遇到错误。
现在我正在寻找更改由 Xtext 生成的实现文件(我更改了 getName() 方法)但没有得到我想要的结果。由于“2.a”中包含的 EObjects 在当时的 QualifiedName 中没有“2”,只有 "a"。如果我们查看“1. sentence”,我希望它有 QualifiedName “2.a.1”
问题的解决方法可以看这里:
不过我会解释的。
首先,您将创建一个扩展原始 IQualifiedNameProvider 的 IQualifideNameProvider。在此 classe 中,您将创建 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 的名称并连接字符串以创建限定名称。
例如这是我的代码,我添加它来组成我的名字:
var a = obj.eContainer();
var FN = (a as UseCase).getName() + "." + text + "." + (obj as Extension).getName();
然后你需要改变你的 RunTimeModulo 添加:
override Class<? extends IQualifiedNameProvider>
bindIQualifiedNameProvider() {
return typeof(MyDslQualifiedNameProvider);
}
在你里面 class RunTimeModule。
这对我有用。这些代码是从上面的 PDF 中精确摘录的,我只是想帮助理解需要做什么。
我希望在我的对象名称中有一个交叉引用。 在我的语言中,我会有这个:
2. Sentence
....
2.a. sentence
1. sentence
其中2为“2.句名”
在这里,我希望“2.a.sentence”的名称是“2.a”,而“2”在“2.a”中是对“的引用” 2.句子"。
我已经试过了:
(name = ([Step|StepName] '.' CHAR ))
和
(name = (step = [Step|StepName] '.' CHAR))
但我刚遇到错误。
现在我正在寻找更改由 Xtext 生成的实现文件(我更改了 getName() 方法)但没有得到我想要的结果。由于“2.a”中包含的 EObjects 在当时的 QualifiedName 中没有“2”,只有 "a"。如果我们查看“1. sentence”,我希望它有 QualifiedName “2.a.1”
问题的解决方法可以看这里:
不过我会解释的。
首先,您将创建一个扩展原始 IQualifiedNameProvider 的 IQualifideNameProvider。在此 classe 中,您将创建 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 的名称并连接字符串以创建限定名称。
例如这是我的代码,我添加它来组成我的名字:
var a = obj.eContainer();
var FN = (a as UseCase).getName() + "." + text + "." + (obj as Extension).getName();
然后你需要改变你的 RunTimeModulo 添加:
override Class<? extends IQualifiedNameProvider>
bindIQualifiedNameProvider() {
return typeof(MyDslQualifiedNameProvider);
}
在你里面 class RunTimeModule。
这对我有用。这些代码是从上面的 PDF 中精确摘录的,我只是想帮助理解需要做什么。