Как правильно использовать IdeContentProposalProvider для веб-редактора xtext - PullRequest
0 голосов
/ 31 октября 2018

У меня проблемы с настройкой поставщика предложений для правильной работы. Моя цель - предоставить список всех возможных импортов, которые может создать пользователь. Я могу убедиться, что класс привязан правильно и вызывается по запросу помощника редактора. Я даже вижу, как предложения создаются и передаются получателю, но в редакторе ничего не отображается.

Так что мой вопрос может состоять из двух частей:

  1. Можете ли вы увидеть, что я могу делать неправильно в следующем коде, чтобы объяснить, что помощь с содержимым не отображается в редакторе
  2. Можете ли вы объяснить разницу между методами отправки для Назначения, RuleCall и Ключевого слова? Я обнаружил, что все три метода используются для одного и того же запроса на поддержку контента, так что именно я по-разному кодирую и что они делают по-разному?

Также я использую CodeMirror, если это имеет какой-либо эффект.

    class mydslContentAssist extends IdeContentProposalProvider{
    @Inject extension mydslGrammarAccess stAccess
    @Inject mydslGlobalScopeProvider sp
    @Inject extension IQualifiedNameProvider

    override dispatch createProposals(Assignment assignment, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
        switch(assignment) {
            case stAccess.libraryModelAccess.importsAssignment_0: {
                var libs = sp.descriptionData.getExportedObjectsByType(ModelPackage.eINSTANCE.libraryModel)
                for (lib : libs.filter[(EObjectOrProxy as LibraryModel).name.startsWith(context.prefix)]) {
                    var proposal = proposalCreator.createProposal('import ' + (lib.EObjectOrProxy as LibraryModel).name + ".*;", context) [
                        source = lib
                        description = "import entire library contents"
                    ]
                    acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                }
            }
            default : {
                super._createProposals(assignment, context, acceptor)
            }
        }
    }
    override dispatch createProposals(RuleCall rulecall, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
        switch(rulecall.rule) {
            case importRule: {
                var libs = sp.descriptionData.getExportedObjectsByType(ModelPackage.eINSTANCE.libraryModel)
                for (lib : libs) {
                    var proposal = proposalCreator.createProposal('import ' + (lib.EObjectOrProxy as LibraryModel).name + ".*;", context) [
                        source = lib
                        description = "import entire library contents"
                    ]
                    acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                }
            }
            default : {
                super._createProposals(rulecall, context, acceptor)
            }
        }
    }

    override dispatch createProposals(Keyword keyword, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
        switch (keyword) {
            case stAccess.importAccess.importKeyword_0: {
                var libs = sp.descriptionData.getExportedObjectsByType(ModelPackage.eINSTANCE.libraryModel)
                for (lib : libs) {
                    var proposal = proposalCreator.createProposal('import ' + (lib.EObjectOrProxy as LibraryModel).name + ".*;", context) [
                        source = lib
                        description = "import entire library contents"
                    ]
                    acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                }
            }
            default: {
                super._createProposals(keyword, context, acceptor)
            }

        }
    }
    }

РЕДАКТИРОВАТЬ: мой код срабатывает только при вызове помощника по контенту при вводе ключевого слова import. Но не при наборе строки importNamespace

1 Ответ

0 голосов
/ 31 октября 2018

я попробовал и не смог воспроизвести

Грамматика:

Model:
    imports+=Import*;

Import: 'import' importedNamespace=QualifiedNameWithWildcard ';'
    ;
    QualifiedNameWithWildcard:
        ID ("." ID)* (".*")?
;

и импл

    package org.xtext.example.mydsl.web

import com.google.inject.Inject
import org.eclipse.xtext.Assignment
import org.eclipse.xtext.Keyword
import org.eclipse.xtext.RuleCall
import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext
import org.eclipse.xtext.ide.editor.contentassist.IIdeContentProposalAcceptor
import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.xtext.example.mydsl.services.MyDslGrammarAccess

class MydslContentAssist extends IdeContentProposalProvider {
        @Inject extension MyDslGrammarAccess stAccess
        static val LIBS = #[
            "XX1", "XX2", "YY1", "YY2"
        ]

        override dispatch createProposals(Assignment assignment, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
            switch(assignment) {
                case stAccess.importAccess.importedNamespaceAssignment_1: {
                    for (lib : LIBS.filter[it.startsWith(context.prefix)]) {
                        var proposal = proposalCreator.createProposal(lib + ".*;", context) [
                            source = lib
                            description = "import entire library contents"
                        ]
                        acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                    }
                }
                default : {
                    super._createProposals(assignment, context, acceptor)
                }
            }
        }
        override dispatch createProposals(RuleCall rulecall, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
            switch(rulecall.rule) {
                case importRule: {
                    for (lib : LIBS) {
                        var proposal = proposalCreator.createProposal('import ' + lib + ".*;", context) [
                            source = lib
                            description = "import entire library contents"
                        ]
                        acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                    }
                }
                default : {
                    super._createProposals(rulecall, context, acceptor)
                }
            }
        }

        override dispatch createProposals(Keyword keyword, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) {
            switch (keyword) {
                case stAccess.importAccess.importKeyword_0: {
                    for (lib : LIBS) {
                        var proposal = proposalCreator.createProposal('import ' + lib + ".*;", context) [
                            source = lib
                            description = "import entire library contents"
                        ]
                        acceptor.accept(proposal, proposalPriorities.getDefaultPriority(proposal))
                    }
                }
                default: {
                    super._createProposals(keyword, context, acceptor)
                }

            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...