I am trying to get cross-references to work in my DSL. Here's a stripped down version of the grammar (a modified version of the standard DSL example):
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])?
;
Since I am not using a standard template name = ID, I followed in this blog post on how to create your own IQualifiedNameProvider:
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {
QualifiedName qualifiedName(Release e) {
Package p = (Package) e.eContainer();
return QualifiedName.create(p.getName(), e.getVersion());
}
}
From another answer on SO, I realized that I had to implement my own scope provider:
public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
IScope scope_Release_parent(Release release, EReference ref) {
Releases releases = (Releases) release.eContainer();
return Scopes.scopeFor(releases.getReleases());
}
}
I also linked them in a runtime module:
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;
}
}
When starting the generated editor, I create a file that looks like this:
release 1.2.3
release 1.2.2 extends 1.2.3
The problem is that (1) the editor will not be autocomplete in the 'extends' clause, and (2) the editor displays an error message Couldn't resolve reference to Release '1.2.3'.
What am I missing?