我是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-ray
和ctrl-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来处理这种情况。
答案 0 :(得分:1)
这个问题没有一般答案。但这里有一些通常可行的提示
您可以将语法更改为
Path: {Path}'path' name=STRING
然后将EObject model
参数向下转发到Path
并询问其名称