Настройка предложения контента в Xtext для веб-редакторов

У меня есть DSL, написанный в Xtext. Чтобы добавить предложение пользовательского контента, я отредактировал класс MyDslProposalProvider в проекте ui. Новые предложения присутствуют, когда я отлаживаю плагин в Eclipse, но не в веб-редакторе, чего я, в конечном счете, и хочу. Я хочу установить пользовательские предложения в одном месте и использовать их во всех сгенерированных редакторах. Возможно ли это сделать с помощью Xtext?


person Hristo Vrigazov    schedule 29.10.2017    source источник


Ответы (2)


Поскольку у меня была та же проблема, и я немного боролся с решением (поскольку я хотел бы использовать как редактор Eclipse, так и веб-редактор), я хотел бы предоставить более подробный отзыв о возможном решении здесь, которое хорошо сработало для меня. В моем решении я сделал следующие шаги.

  1. Реализовать MyDslIdeContentProposalProvider в подпроекте my.dsl.ide, расширяющем IdeContentProposalProvider, пакет my.dsl.ide.contentassistant (недавно созданный); пример такой реализации можно найти здесь. Реализация не такая удобная, как у известного поставщика UI-предложений для Eclipse. Мне пришлось реализовать переключатели на основе элементов MyDslGrammarAccess вместо элементов структурной грамматики, как в поставщике предложения пользовательского интерфейса. С другой стороны, у меня есть только одно предложение реализации для всех случаев редактора таким образом (принцип DRY!).
  2. Зарегистрируйте MyDslIdeContentProposalProvider в MyDslIdeModule в этом же проекте (только с тем, что он работает уже в веб-редакторе).

    def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
        MyDslIdeContentProposalProvider
    }
    
  3. Зарегистрируйте новый MyDslIdeContentProposalProvider и класс пересылки UiToIdeContentProposalProvider в MyDslUiModule в подпроекте my.dsl.ui. (Это то, что потребовало самого длительного расследования, поскольку это не может быть логически выведено.)

    override Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
        return UiToIdeContentProposalProvider
    }
    
    def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
        return JavaPOSConfigLanguageIdeContentProposalProvider
    }
    

    Полный пример см. в разделе здесь.

  4. Поскольку я реализовал MyDslIdeContentProposalProvider во вновь созданном пакете my.dsl.ide.contentassistant, этот пакет необходимо экспортировать в файл MANIFEST.MF подпроекта my.dsl.ide (последующие 2 экспорта уже были). В противном случае я бы получил сообщение об ошибке Ограничение доступа: тип недоступен из-за ограничения требуемого проекта в файле MyDslUiModule.

    Export-Package: my.dsl.ide.contentassist,
      my.dsl.ide.contentassist.antlr,
      my.dsl.ide.contentassist.antlr.internal
    

    Таким образом, он хорошо работал как для редакторов, Eclipse, так и для Интернета.

Еще раз спасибо Кристиану за первоначальный намек!

... Если бы я мог загадать желание, я хотел бы иметь тот же доступ к элементам структурной грамматики в MyDslIdeContentProposalProvider, что и сегодня в поставщике предложений пользовательского интерфейса.

person Denis Kuniß    schedule 23.08.2018
comment
Спасибо, это было очень информативно! Я также проверил JHipster, и он мне очень нравится! - person Hristo Vrigazov; 23.08.2018
comment
Только одно замечание: я не автор JHipster. :-) Я просто использовал его для примера, так как мой проект с закрытым исходным кодом. - person Denis Kuniß; 30.09.2018

вам нужно создать подкласс org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider и связать его с YourDslIdeModule и YourDslUiModule. Затем (в Xtext 2.13) вы можете использовать org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider, привязанный к YourDslUiModule, чтобы делегировать его в eclipse ui.

person Christian Dietrich    schedule 30.10.2017