Xtext中的交叉引用问题

时间:2016-12-26 12:59:02

标签: eclipse reference xtext scoping

我正在使用Xtext 2.10.0,似乎在交叉引用方面存在一些问题。简化,我的语法(使用org.eclipse.xtext.common.Terminals)如下:

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'。"的引用”。为解决此问题,我需要更改哪些内容?

2 个答案:

答案 0 :(得分: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
    }

}

答案 1 :(得分: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,一切似乎都很完美。