我正在尝试自定义作用域,这样,如果在我的语言中有类似函数的东西来获取参数,我希望这些参数只在有分号之前是可见的,而在这个作用域之外,我希望它是不可见的。
我尝试在MyDslScopeProvider.xtend文件中重新定义getScope()方法
在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);
}
我做错了什么?
谢谢!
发布于 2016-07-29 05:01:53
问题是,在Xtext 2.9+中,AbstractDeclarativeScopeProvider
不再是YourdslScopeProvider
的默认超类。您需要覆盖getScope(EObject context, EReference ref)
,如果elsing在那里,则执行此操作。或者手动更改超类。顺便说一下,您可以在YourdslPackage.Literals
中使用常量,而不是使用手动字符串常量。
https://stackoverflow.com/questions/38636968
复制