2016-12-26 2 views
1

Xtext 2.10.0を使用していますが、相互参照に問題があるようです。簡体字、(org.eclipse.xtext.common.Terminalsと)私の文法は以下の通りです:のDTOの正しい修飾名を提供するためにクロスリファレンスXtextで問題が発生しました

Model: 
    package=Package 
    dtos+=DTO*; 

Package: 
    'package' name=FQN; 

FQN: 
    ID ('.' ID)*; 

DTO: 
    'dto' name=ID ('extends' extendedDTO=[DTO|FQN])? '{' '}'; 

、私は修飾名を組み立てた、独自のDefaultDeclarativeQualifiedNameProviderを実装しましたパッケージの名前とDTOの名前に基づいています。

今、私が最初のファイルでDTO "base.dto" を作成します。

package base 

dto BaseDTO {} 

秒のファイルでは "mydto.dto" 私は二DTOを作成します。

package mydto 

dto MyDTO extends base.BaseDTO {} 

一部"base.BaseDTO"はオートコンプリートメカニズムによっても提案されています。しかし、Eclipseはこの部分をエラーとしてマークし、 "DTO 'base.BaseDTO'への参照を解決できませんでした。"この参照を解決するにはどうすればよいですか?ここで

+0

あなたはあなたのnameprovider implを共有してください。 –

+0

これは正しいヒントだったと思います。もともと、私はこれを使いました: "QualifiedName.create(packageName、dtoName)"。ただし、パッケージ名はいくつかの要素で構成されています。私はパッケージ名をセグメント(ドット)に分割し、すべてのセグメントをQualifiedNameに入れます。これは機能します。どうもありがとうございました! – user3575404

答えて

0

私私NameProvider Implを

class MyDslNameProvider extends DefaultDeclarativeQualifiedNameProvider { 

    def QualifiedName qualifiedName(DTO dto) { 
     val model = EcoreUtil2.getContainerOfType(dto, Model) 
     val packageName = converter.toQualifiedName(model.package.name) 
     val result = packageName.append(dto.name) 
     result 
    } 

} 
0

課題であった、私の元NameProviderは、以下の方法を持っていたこと(ここで、「qualifiedPackageNameは、」パッケージの名前を提供する拡張メソッドです):

def qualifiedName(DTO dto) { 
    val packageName = dto.qualifiedPackageName 
    val dtoName = dto.name 

    val qualifiedName = QualifiedName.create(packageName, dtoName) 

    qualifiedName 
} 

ただし、パッケージ名は完全修飾名であり、単一のセグメントに分割する必要があるようです。

static val PACKAGE_SEPARATOR = '\\.' 

def qualifiedName(DTO dto) { 
    val packageName = dto.qualifiedPackageName 
    val packageNameSegments = packageName.split(PACKAGE_SEPARATOR) 
    val dtoName = dto.name 

    val segments = packageNameSegments + #[dtoName] 
    val qualifiedName = QualifiedName.create(segments) 

    qualifiedName 
} 

変更されたNameProviderでは、すべてが完璧に機能しているようです。

関連する問題