如何正确使用xtext web编辑器的IdeContentProposalProvider



我很难让我的提案提供程序正常工作。我的目标是提供一个用户可以创建的所有可能导入的列表。我可以验证该类是否正确绑定,并且在编辑器的协助请求下被调用。我甚至可以看到提案被创建并传递给接受者,但编辑器中没有显示任何内容。

所以我的问题可能有两部分:

  1. 你能看到我在下面的代码中可能做错了什么吗?来解释编辑器中没有显示的内容辅助
  2. 你能解释一下Assignment、RuleCall和Keyword的调度方法之间的区别吗?我发现这三种方法都适用于相同的内容辅助请求,那么我的代码到底有什么不同,它们的作用又有什么不同呢

如果有任何效果,我也在使用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"关键字时调用内容辅助时,我的代码才会被命中。但在键入importedNamespace字符串时不会

我尝试了一下,但无法复制

语法:

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

和impl

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)
}
}
}
}

最新更新