如何现场获取用户输入的值来辅助提案生成?
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:\xyz
和 c:\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)
}
您可以看到我在 Xtend
的 val/var
约束下有些挣扎。必须为 lamda 使用 val,必须使用 var 来处理 pObj.name
为 null
.
的情况
这个问题没有一般性的答案。但这里有一些通常有效的提示
- 您可以检查 ContentAssistContext 的前缀
- 您可以检查当前 ast 的 ContentAssistContext
- 您可以检查 ContentAssistContext 以获取当前和最后一个完整的节点模型
您可以将语法更改为
Path: {Path}'path' name=STRING
然后将 EObject model
参数向下转换为 Path
并询问它的名称
我是 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:\xyz
和 c:\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)
}
您可以看到我在 Xtend
的 val/var
约束下有些挣扎。必须为 lamda 使用 val,必须使用 var 来处理 pObj.name
为 null
.
这个问题没有一般性的答案。但这里有一些通常有效的提示
- 您可以检查 ContentAssistContext 的前缀
- 您可以检查当前 ast 的 ContentAssistContext
- 您可以检查 ContentAssistContext 以获取当前和最后一个完整的节点模型
您可以将语法更改为
Path: {Path}'path' name=STRING
然后将 EObject model
参数向下转换为 Path
并询问它的名称