У меня есть DSL, написанный в Xtext. Чтобы добавить предложение пользовательского контента, я отредактировал класс MyDslProposalProvider
в проекте ui
. Новые предложения присутствуют, когда я отлаживаю плагин в Eclipse, но не в веб-редакторе, чего я, в конечном счете, и хочу. Я хочу установить пользовательские предложения в одном месте и использовать их во всех сгенерированных редакторах. Возможно ли это сделать с помощью Xtext?
Настройка предложения контента в Xtext для веб-редакторов
Ответы (2)
Поскольку у меня была та же проблема, и я немного боролся с решением (поскольку я хотел бы использовать как редактор Eclipse, так и веб-редактор), я хотел бы предоставить более подробный отзыв о возможном решении здесь, которое хорошо сработало для меня. В моем решении я сделал следующие шаги.
- Реализовать
MyDslIdeContentProposalProvider
в подпроекте my.dsl.ide, расширяющемIdeContentProposalProvider
, пакет my.dsl.ide.contentassistant (недавно созданный); пример такой реализации можно найти здесь. Реализация не такая удобная, как у известного поставщика UI-предложений для Eclipse. Мне пришлось реализовать переключатели на основе элементовMyDslGrammarAccess
вместо элементов структурной грамматики, как в поставщике предложения пользовательского интерфейса. С другой стороны, у меня есть только одно предложение реализации для всех случаев редактора таким образом (принцип DRY!). Зарегистрируйте
MyDslIdeContentProposalProvider
вMyDslIdeModule
в этом же проекте (только с тем, что он работает уже в веб-редакторе).def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() { MyDslIdeContentProposalProvider }
Зарегистрируйте новый
MyDslIdeContentProposalProvider
и класс пересылкиUiToIdeContentProposalProvider
вMyDslUiModule
в подпроекте my.dsl.ui. (Это то, что потребовало самого длительного расследования, поскольку это не может быть логически выведено.)override Class<? extends IContentProposalProvider> bindIContentProposalProvider() { return UiToIdeContentProposalProvider } def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() { return JavaPOSConfigLanguageIdeContentProposalProvider }
Полный пример см. в разделе здесь.
Поскольку я реализовал
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
, что и сегодня в поставщике предложений пользовательского интерфейса.
вам нужно создать подкласс org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider
и связать его с YourDslIdeModule
и YourDslUiModule
. Затем (в Xtext 2.13) вы можете использовать org.eclipse.xtext.ui.editor.contentassist.UiToIdeContentProposalProvider
, привязанный к YourDslUiModule
, чтобы делегировать его в eclipse ui.