2016-12-26 2 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])? '{' '}'; 

Для того, чтобы обеспечить правильное квалифицированное имя для DTOS, я реализовал собственный DefaultDeclarativeQualifiedNameProvider, который собирает составное имя на основе имени пакета и имени DTO.

Теперь я создаю первый DTO в файле "base.dto":

package base 

dto BaseDTO {} 

Во втором файле "mydto.dto" Я создаю второй DTO:

package mydto 

dto MyDTO extends base.BaseDTO {} 

Часть «base.BaseDTO» даже предлагается механизмом автозаполнения. Однако Eclipse отмечает эту часть как ошибку и говорит: «Не удалось разрешить ссылку на базу данных DTO.BaseDTO». ». Что мне нужно изменить, чтобы разрешить эту ссылку?

+0

вы можете поделиться своим именем propvider 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 все работает идеально.

Смежные вопросы