首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将IdeContentProposalProvider用于xtext web编辑器?

如何正确地将IdeContentProposalProvider用于xtext web编辑器?
EN

Stack Overflow用户
提问于 2018-10-31 14:25:02
回答 1查看 624关注 0票数 1

我有困难,让我的建议供应商工作正常。我的目标是提供用户可以创建的所有可能导入的列表。我可以验证类是否被正确绑定,并在编辑器的协助请求时被调用。我甚至可以看到提案正在创建和传递给接受者,但在编辑中什么也没有出现。

因此,我的问题可能有两部分:

  1. 你能看到我在下面的代码中做错了什么吗?解释内容的帮助在编辑器中没有显示
  2. 您能解释分配、RuleCall和关键字的分派方法之间的区别吗?我发现,对于相同的内容辅助请求,这三种方法都会被击中,那么我到底有什么不同的代码,它们做什么不同呢?

此外,如果有任何效果,我将使用CodeMirror。

代码语言:javascript
复制
    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‘关键字时调用内容助手时才会被击中。但在键入importedNamespace字符串时却不是这样

EN

回答 1

Stack Overflow用户

发布于 2018-10-31 16:41:17

我试了一试,不能再繁殖了

语法:

代码语言:javascript
复制
Model:
    imports+=Import*;

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

急进

代码语言:javascript
复制
    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)
                }

            }
        }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53085669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档