范围:在当前文件xtext

时间:2016-08-08 11:57:08

标签: eclipse xtext scoping cross-reference

关注我的问题: here 我正在尝试自定义范围。我希望在' 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范围内工作。

感谢。

1 个答案:

答案 0 :(得分:0)

在走路之前,你必须走到离路的根部。 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)