如何现场获取用户输入的值来辅助提案生成?

How to get the user entered value on the spot to assist proposal generation?

我是 xtext/xtend 的新手,非常感谢您的帮助。在网上阅读了很多 articles/documents/tutorials 之后,我找不到如何获取用户输入值的方法。

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

 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 它会在按下 ctrl-space 时建议 c:\xyzc:\x-ray。为此,我需要获取 name 值来进行检查,但我不知道要调用哪些 API。

编辑: 我能够从 Christian 的工作中得到最后的建议,即向下转换 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)
}

您可以看到我在 Xtendval/var 约束下有些挣扎。必须为 lamda 使用 val,必须使用 var 来处理 pObj.namenull.

的情况

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

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

您可以将语法更改为

Path: {Path}'path' name=STRING

然后将 EObject model 参数向下转换为 Path 并询问它的名称