我正在尝试让交叉引用在我的 DSL 中工作。这是语法的精简版本(标准示例 DSL 的修改版本):
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Releases:
releases+=Release*
;
terminal VERSION : ('0'..'9')+'.'('0'..'9')+('.'('0'..'9'|'x')+)?;
Release:
'release' version = VERSION ('extends' parent = [Release|VERSION])?
;
由于我没有使用标准name = ID
模式,因此我关注了这篇关于如何创建自己的博客文章IQualifiedNameProvider
:
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {
QualifiedName qualifiedName(Release e) {
Package p = (Package) e.eContainer();
return QualifiedName.create(p.getName(), e.getVersion());
}
}
从关于 SO 的另一个答案中,我收集到我应该实现自己的范围提供程序:
public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
IScope scope_Release_parent(Release release, EReference ref) {
Releases releases = (Releases) release.eContainer();
return Scopes.scopeFor(releases.getReleases());
}
}
我还在运行时模块中绑定了这些:
public class MyDslRuntimeModule extends
org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
@Override
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return MyDslQNP.class;
}
@Override
public Class<? extends IScopeProvider> bindIScopeProvider() {
return MyDslScopeProvider.class;
}
}
运行生成的编辑器时,我创建了一个如下所示的文件:
release 1.2.3
release 1.2.2 extends 1.2.3
问题是(1)编辑器不会自动完成“扩展”子句,(2)编辑器显示错误消息Couldn't resolve reference to Release '1.2.3'
。
我错过了什么?