2016-04-07 5 views
0

Я Xtend/Xtext новичок. В настоящее время я работаю с новым форматировочной API, и я пытаюсь правило формата, который выглядит следующим образом:Xtext 2.8+ форматирование, форматирование простого правила

Expression: 
    Error|Warning|Enum|Text 
; 

с методом Xtend доставки, как этот

def dispatch void format(Expression e){ 
     if (e instanceof ErrorImpl) 
      ((ErrorImpl)e).format 
} 

Проблема в том, что выражение типа е это uncovertable, я ПОЛУЧАТЬ эту ошибку

Type mismatch: cannot convert from Class<ErrorImpl> to Expression 

Почему я не могу сделать это преобразование (я подозреваю Xtend семантику конечно) (даже Eclipse говорит мне, что выражение - это просто интерфейс, из которого создаются дети.) и как я могу назвать формат метод для каждого ребенка этого правила? Благодарю.

enter image description here

ответ

3

Синтаксис Xtend для приведение типов отличается: вместо (ErrorImpl) e вы пишете e as ErrorImpl. В этом случае корпус типа даже не надо: из-за предыдущие instanceof проверки, переменная e неявно отлита в ErrorImpl, так что вы можете написать тот же код,

def dispatch void format(Expression e) { 
    if (e instanceof ErrorImpl) 
     e.format 
} 

Однако, этот код будет вызывать стек переполнение, потому что метод format(EObject) называется рекурсивно с тем же входом. Для того, чтобы правильно использовать силу методов отправки, вы должны написать код так:

def dispatch void format(Error error) { 
    // Code for handling Errors 
} 
def dispatch void format(Warning warning) { 
    // Code for handling Warnings 
} 
def dispatch void format(Enum enum) { 
    // Code for handling Enums 
} 
def dispatch void format(Text text) { 
    // Code for handling Texts 
} 

создается метод format(Expression), который автоматически отправляет в более конкретные методы в зависимости от типа аргумента.

Обратите внимание, что методы форматировщик диспетчерские также нужен второй аргумент типа IFormattableDocument, поэтому они должны выглядеть

def dispatch void format(Error error, extension IFormattableDocument document) { 
    // Code for handling Errors 
} 
...