2016-12-26 94 views
1

我正在使用Xtext 2.10.0,並且似乎在交叉引用中存在一些問題。簡體中文,我的語法(與org.eclipse.xtext.common.Terminals)如下:Xtext中的交叉引用問題

Model: 
    package=Package 
    dtos+=DTO*; 

Package: 
    'package' name=FQN; 

FQN: 
    ID ('.' ID)*; 

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

爲了爲DTO的提供正確的合格的名字,我實現了一個自己的DefaultDeclarativeQualifiedNameProvider,其裝配合格的名稱基於包的名稱和DTO的名稱。

現在我在一個文件中 「base.dto」 開創DTO:

package base 

dto BaseDTO {} 

在第二個文件 「mydto.dto」 我創建第二個DTO:

package mydto 

dto MyDTO extends base.BaseDTO {} 

的一部分「base.BaseDTO」甚至由自動完成機制提出。但是,Eclipse將這部分標記爲錯誤,並且說「無法解析對DTO的引用base.BaseDTO'」。爲了解決這個問題,我需要改變什麼?

+0

可以請你分享你的名字提供者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,一切看起來都很完美。