作用域:获取当前文件 xtext 中特定类型的所有实例

scoping: get all instances of specific type in current file xtext

根据我的问题: 我正在尝试自定义范围。我希望在我的语言的 'Predicate' 范围内,一些对象将在范围内可见,类型如 'typeDef'.

Predicate:
    'predicate' name=ID ('(' params=TypedParamList ')')?
    (':' body=TemporalExpression TOK_SEMI)
    | ('{' body=TemporalExpression '}');

TypeDef:
    'type' name=ID '=' type=VarType TOK_SEMI;

这是我的语言的一些例子:

type
  move = {left, right};

predicate stop(move m1, move m2) : 
  m1=left and m2=right;

不认识左右(无法解析引用)

我试过这样的事情:

            val allContentsCurrFile  = EcoreUtil2.eAllOfType(context,TypeDef)
            val allContentsCurrFile2  = EcoreUtil2.getAllContentsOfType(context,TypeDef)

我将它作为 Scopes.scopeFor 方法的参数(除了 Predicate 的参数之外),这对我不起作用。我不知道该怎么做,如何在当前文件中找到特定类型的所有实例,以便交叉引用在 Predicate 范围内工作。

谢谢。

你必须先走到树根,然后才能走下去。 EcoreUtil2.getContainerOfType(context, YourRootType) 可能对此有所帮助。

更新:

语法和示例模型不符,但这似乎是一个完全不同的问题,所以我只能给出一些提示。

您只能引用命名元素以将这些元素放入范围。

语法:

TypedParam:
    (module=[Import] '.')? type=[TypeDef] name=ID;

Referrable:
    TypedParam | TypeDef | TypeConstant;

代码:

val root = EcoreUtil2.getContainerOfType(context, Domainmodel)
val allContentsCurrFile  = EcoreUtil2.getAllContentsOfType(root,TypeConstant)