2016-09-16 6 views
1

Я пытаюсь реализовать пользовательский HoverProvider в соответствии с этой обучающей программы: enter link description hereРегистрация HoverProvider с Xtend

Однако я застрял перевод на Java код MyDSLUiModule к Xtend. Регистр-метод должен прочитать так:

def Class<? extends IEObjectDocumentationProvider> bindIEObjectDocumentationProviderr() { 
    return MyDSLHoverProvider.class 
} 

Однако, это не компилируется, так как только MyDSLHoverProviderimplementsIEObjectDocumentationProvider, но не extend этот класс (MyDSLHoverProvider такое же, как в учебнике).

Поэтому эта ошибка возникает: Type mismatch: cannot convert from Class<? extends Class> to Class<? extends IEObjectDocumentationProvider>

Как я могу обойти эту ошибку?

Btw: Если я проверить мой DSL в экземпляре Eclipse, я получаю странную NPE:

ENTRY org.eclipse.oomph.setup.ui 2 0 2016-09-16 16:42: 34,203 ! MESSAGE java.lang.NullPointerException ! СТЕК 0 java.lang.NullPointerException в org.eclipse.oomph.setup.ui.SetupUIPlugin.performStartup (SetupUIPlugin.java:373) в org.eclipse.oomph.setup .ui.SetupUIPlugin.access $ 4 (SetupUIPlugin.java:344) at org.eclipse.oomph.setup.ui.SetupUIPlugin $ 1 $ 1.run (SetupUIPlugin.java:241) at org.eclipse.core.internal .jobs.Worker.run (Worker.java:55)

У меня нет ни малейшего понятия, откуда взялось это исключение.

Класс MyDSLHoverProvider выглядит следующим образом:

import org.eclipse.emf.ecore.EObject 
import org.eclipse.xtext.documentation.IEObjectDocumentationProvider 

class MyDSLHoverProvider implements IEObjectDocumentationProvider { 

    override getDocumentation(EObject o) { 
     println("Hover: " + o) 
     if (o instanceof MyFieldElements) { 
      return "This is a nice Greeting with nice <b>markup</b> in the <i>documentation</i>"; 
     } 
    } 

} 

Edit: Я нашел способ отображения всплывающих подсказок, но это кажется странным. всплывающей подсказке отображается для этого правила:

name = ID 

, но если я переименовать его в

myField = ID 

подсказка не срабатывает.

Является ли это ожидаемым поведением?

ответ

1

правильный синтаксис Xtend является

def Class<? extends IEObjectDocumentationProvider> bindIEObjectDocumentationProviderr() { 
    return MyDSLHoverProvider 
} 

или

def Class<? extends IEObjectDocumentationProvider> bindIEObjectDocumentationProviderr() { 
    MyDSLHoverProvider 
} 

MyDSLHoverProvider.class таким же, как MyDslHoverProvider.class.getClass() в Java

+0

Ах, да, исчезла ошибка компиляции! :-) Однако всплывающая подсказка пока не отображается. Метод 'bindIEObjectDocumentationProviderr' определенно называется, но метод в MyDSLHoverProvider никогда не запускается. Я обновил свой пост, чтобы дать полный код «MyDSLHoverProvider» и трассировку прообразного NPE при запуске Eclipse. –

+0

Можете ли вы дать больше контекста: грамматика, примерная модель, ваш impl и как вы ее тестируете –

+0

Я обновил свой стартовый пост. Мне нужно было переименовать свои поля в 'name', чтобы отобразить всплывающие подсказки. Это ожидаемое поведение? –