作用域:获取当前文件 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)
根据我的问题:
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)