2012-04-25 14 views
3

私の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を追っ:

SO上の別の答えから
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'が表示されます。

私には何が欠けていますか?

答えて

1

Scopes.scopeForは静的メソッドであるため、構成されたIQualifiedNameProviderは使用されません。 明示的 Scopes.scopeFor(反復処理可能な、機能、IScope)

を使用して、それを渡す必要がありますしかし、あなたの場合には、あなたが修飾された名前を持つローカル要素以来、全くスコーププロバイダで特別な処理を必要としません。プロバイダは自動的にスコープに入れられます。

+0

を[OK]を、ので、スコーププロバイダを削除すると、自動補完作業になりますが、それはまだ参照を解決するために失敗しました。 – JesperE

2

あなたのQualifiedNameProviderは、偽の修飾名を作成しているようです。リリース1.2.2の名前には、[release] [1] [2] [2]という2つのセグメント[release] [1.2.2]があります。

このような適切な修飾された名前を作成してみてください。

QualifiedName qualifiedName(Release e) { 
    Package p = (Package) e.eContainer(); 
    QualifiedName release = getConverter().toQualifiedName(e.getVersion()); 
    return QualifiedName.create(pack.getName()).append(releaseSuffix);   
} 
関連する問題