Xtext:名称内的交叉引用

问题描述 投票:0回答:1

我想在我的对象名称中有一个交叉引用。用我的语言,我会这样:

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”

xtext
1个回答
0
投票

有关问题的解决方案,您可以在这里看到:

http://www.cs.ru.nl/J.Hooman/DSL/AdvancedXtextManual.pdf

但是我会解释。

首先,您将创建一个扩展原始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中精确提取的,我只是想帮助您了解需要做什么。

© www.soinside.com 2019 - 2024. All rights reserved.