xtext 自定义作用域:函数的参数
xtext custom scoping: parameters of function
我正在尝试自定义范围,这样如果我在我的语言中有类似函数的东西来获取参数,我希望这些参数只在出现分号之前可见,并且在这个范围之外,我想要它不可见。
我尝试重新定义文件中的方法 getScope() MyDslScopeProvider.xtend
在 getScope 中我做了这样的事情:
if (EclassName=="TypedParam" && EFeatureName=="type" && contextType == "TypedParam"){
return Scopes.scopeFor(Collections.singleton(context),IScope.NULLSCOPE)
}
这显然是行不通的(它无法识别参数)。我该怎么做?
另外,我还有一个问题:
我试过实现如下方法:
def IScope scope_<EClass name>_<EFeature name>(<context type> context, EReference)
虽然我打印了名字并确保我写的名字是正确的,但这些方法根本就没有被调用过。 (我复制了从以下代码打印的内容)
class DomainmodelScopeProvider extends AbstractDomainmodelScopeProvider {
override def IScope getScope(EObject context, EReference reference)
{
System.out.println("scope_" + reference.getEContainingClass().getName()
+ "_" + reference.getName()
+ "(" + context.eClass().getName() + ", ..)"
);
return super.getScope(context,reference);
}
我做错了什么?
谢谢!!!
问题是 Xtext 2.9+ AbstractDeclarativeScopeProvider
不再是 YourdslScopeProvider
的默认超类。您应该覆盖 getScope(EObject context, EReference ref)
并在 elsing 那里执行。或者您手动更改超类。顺便说一句,您可以使用 YourdslPackage.Literals
中的常量,而不是使用手动字符串常量。
我正在尝试自定义范围,这样如果我在我的语言中有类似函数的东西来获取参数,我希望这些参数只在出现分号之前可见,并且在这个范围之外,我想要它不可见。
我尝试重新定义文件中的方法 getScope() MyDslScopeProvider.xtend
在 getScope 中我做了这样的事情:
if (EclassName=="TypedParam" && EFeatureName=="type" && contextType == "TypedParam"){
return Scopes.scopeFor(Collections.singleton(context),IScope.NULLSCOPE)
}
这显然是行不通的(它无法识别参数)。我该怎么做?
另外,我还有一个问题: 我试过实现如下方法:
def IScope scope_<EClass name>_<EFeature name>(<context type> context, EReference)
虽然我打印了名字并确保我写的名字是正确的,但这些方法根本就没有被调用过。 (我复制了从以下代码打印的内容)
class DomainmodelScopeProvider extends AbstractDomainmodelScopeProvider {
override def IScope getScope(EObject context, EReference reference)
{
System.out.println("scope_" + reference.getEContainingClass().getName()
+ "_" + reference.getName()
+ "(" + context.eClass().getName() + ", ..)"
);
return super.getScope(context,reference);
}
我做错了什么?
谢谢!!!
问题是 Xtext 2.9+ AbstractDeclarativeScopeProvider
不再是 YourdslScopeProvider
的默认超类。您应该覆盖 getScope(EObject context, EReference ref)
并在 elsing 那里执行。或者您手动更改超类。顺便说一句,您可以使用 YourdslPackage.Literals
中的常量,而不是使用手动字符串常量。