如何在当场获得用户输入的值以协助提案生成?

时间:2016-01-22 00:38:14

标签: xtext xtend

我是xtext / xtend的新手,非常感谢您的帮助。在阅读了很多在线文章/文档/教程后,我找不到如何获取用户输入值的方法。

例如,假设我有一个简单的语法:

 Path: 'path' name=STRING

在编辑器中,用户输入了:

 path c:/x

我有一个自定义提案提供商,签名为:

 class DomainmodelProposalProvider extends AbstractDomainmodelProposalProvider {

   def override completePath_Name(EObject model,
                                         Assignment assignment,
                                         ContentAssistContext context,
                                         ICompletionProposalAcceptor acceptor) {
        ...
      }
  }

将尝试根据用户的当前输入建议有效路径列表。例如,对于path c:/x,当按下c:\xyz时,它会建议c:\x-rayctrl-space。为此,我需要获取name值来进行检查,但我不知道要调用哪些API。

修改 我能够得到基督徒工作的最后一个建议,即通过向下传播Emodel对象。以下是代码片段:

 val pObj = model as Path
 val allowedList = DomainmodelStandaloneSetup.readAllowedPaths()

 var String tmp
 if (pObj.name == null) tmp = "" else tmp = pObj.name

 val target = tmp
 val proposedList = allowedList.filter[startsWith(target)] 

 for (item : proposedList) {
    val p = createCompletionProposal(item.toString(), context)
    acceptor.accept(p)
}

你可以看到我在val/var Xtend pObj.name的约束下苦苦挣扎。不得不为lamda使用val,在null为{{1}}时必须使用var来处理这种情况。

1 个答案:

答案 0 :(得分:1)

这个问题没有一般答案。但这里有一些通常可行的提示

  • 您可以检查ContentAssistContext的前缀
  • 您可以检查当前ast的ContentAssistContext
  • 您可以检查当前和最后一个完整节点模型的ContentAssistContext

您可以将语法更改为

Path: {Path}'path' name=STRING

然后将EObject model参数向下转发到Path并询问其名称