Search code examples
eclipsedslxtext

Customizing content proposal in Xtext for web editors


I have a DSL written in Xtext. In order to add custom content proposal, I have edited the MyDslProposalProvider class in the ui project. The new proposals are present when I debug the plugin in Eclipse, but not in the web editor, which is ultimately what I want. I want to set the custom proposals at a single place and all generated editors to use them. Is it possible to do that with Xtext?


Solution

  • As I had the same problem and struggled a little bit with the solution (as I would like to use both, Eclipse editor and Web editor) I would like to provide some more detailed feedback on a possible solution here, which worked well for me. In my solution I did the following steps.

    1. Implement a MyDslIdeContentProposalProvider in my.dsl.ide sub project extending from IdeContentProposalProvider, package my.dsl.ide.contentassistant (newly created); an example of such an implementation may be found here. The implementation is not such convenient as at the well known UI proposal provider for Eclipse. I had to implement switch cases based on MyDslGrammarAccess elements instead of structural grammar elements like in the UI proposal provider. On the other hand, I have only one proposal implementation for all editor cases that way (DRY principle!).
    2. Register the MyDslIdeContentProposalProvider at MyDslIdeModule in the same project (only with that it works already in the web editor).

      def Class<? extends IdeContentProposalProvider> bindIdeContentProposalProvider() {
          MyDslIdeContentProposalProvider
      }
      
    3. Register the new MyDslIdeContentProposalProvider and the forwarding class UiToIdeContentProposalProvider at the MyDslUiModule in the my.dsl.ui sub project. (That's what took the longest investigation as it cannot be logically derived.)

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

      For an full example see here.

    4. As I had implemented the MyDslIdeContentProposalProvider in the newly created package my.dsl.ide.contentassistant, this package has to be exported in the MANIFEST.MF file of the sub project my.dsl.ide (the subsequent 2 exports were already there). Otherwise i would get an an error Access restriction: The type is not accessible due to restriction on required project in the MyDslUiModule.

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

      That way it worked well for for both editors, Eclipse and web.

    Thanks Christian again for the initial hint!

    ... If I could make a wish, I would like to have the same structural grammar element access in the MyDslIdeContentProposalProvider as we have it today in UI proposal provider.