私の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])?
;
が、私はIQualifiedNameProvider
自分自身を作成する方法についてthis blog postを追っ:
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {
QualifiedName qualifiedName(Release e) {
Package p = (Package) e.eContainer();
return QualifiedName.create(p.getName(), e.getVersion());
}
}
は、私は私自身のスコーププロバイダ実装する必要があることを収集:
public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
IScope scope_Release_parent(Release release, EReference ref) {
Releases releases = (Releases) release.eContainer();
return Scopes.scopeFor(releases.getReleases());
}
}
をIました生成されたエディタを実行しているとき、私はこのようなファイルを作成
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;
}
}
:LSOは、ランタイムモジュールでこれらを拘束
release 1.2.3
release 1.2.2 extends 1.2.3
問題は、(1)エディタが上のオートコンプリートではないということです(2)エディタにエラーメッセージCouldn't resolve reference to Release '1.2.3'
が表示されます。
私には何が欠けていますか?
を[OK]を、ので、スコーププロバイダを削除すると、自動補完作業になりますが、それはまだ参照を解決するために失敗しました。 – JesperE