我正在为C语言开发一个Eclipse插件。目前我正在开发内容辅助,我想为大多数常见语言结构引入模板。
在我的工作中,我关注this tutorial:
我想利用模板(例如here),例如:${id:var(type[,type]*)}
,例如为每个函数参数提供完成提议的函数调用模板,但过滤掉仅显示兼容类型的提案。不幸的是,我无法找到任何相关的教程或示例。
对于任何建议,链接,代码片段等,我将不胜感激。
提前致谢!
的Grzegorz
答案 0 :(得分:0)
通过反复试验,我终于设法提供了这样的完成建议。我将简要解释一下,但我不保证这是正确的方法,但它有效:)
如果我们有一个函数foo(boolean bar, boolean baz)
,我们可以创建相应的模板:foo(${bar:var(boolean)}, ${baz:var(boolean)})
。要处理此类模板,我们可以注册自定义TemplateVariableResolver
:
public final class VariableResolver extends TemplateVariableResolver {
public VariableResolver() {
super("var", "some description");
}
@Override
public void resolve(TemplateVariable variable, TemplateContext context) {
final String name = variable.getName(); /* bar or baz */
final List params = variable.getVariableType().getParams(); /* ["boolean"] */
variable.setValues(computeSuggestions(name, params));
variable.setResolved(true);
}
private String[] computeSuggestions(String name, List params) {
return new String[] {"true", "false"};
// TODO: more sophisticated proposals
}
// overwrite other methods!
}
下一步是让CompletionProcessor
延长TempateCompletionProcessor
。
以下是computeCompletionProposals()
TemplateCompletionProcessor
的(简化)默认实现
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
/* some code */
TemplateContext context= createContext(viewer, region);
if (context == null)
return new ICompletionProposal[0];
context.setVariable("selection", selection.getText()); // name of the selection variables {line, word}_selection //$NON-NLS-1$
Template[] templates= getTemplates(context.getContextType().getId());
/* some code */
return (ICompletionProposal[]) matches.toArray(new ICompletionProposal[matches.size()]);
}
然后VariableResolver
应在computeCompletionProposals
或其他地方注册:
context.getContextType().addResolver(new VariableResolver());
因此,如果getTemplates()
将返回我们的示例模板,并且用户将使用它,那么将调用参数bar
和baz
resolve()
,以便我们可以提供关于这些参数类型的每个foo
函数参数。