我试图让交叉引用在我的DSL中工作。下面是语法的一个精简版(标准例如DSL的修改版本):因为我没有使用标准的name = ID
模式使用自定义终端规则的Xtext交叉引用
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])?
;
,我也跟着this blog post有关如何创建自己的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());
}
}
我有一个LSO运行时模块中结合这些:
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'
。
我错过了什么?
好了,所以去除范围提供商使得自动完成的工作,但它仍然未能解决的参考。 – JesperE 2012-04-26 07:52:25