Eclipse中的模板变量 - var()

时间:2014-04-12 09:30:24

标签: java eclipse eclipse-plugin

我正在为C语言开发一个Eclipse插件。目前我正在开发内容辅助,我想为大多数常见语言结构引入模板。

在我的工作中,我关注this tutorial

我想利用模板(例如here),例如:${id:var(type[,type]*)},例如为每个函数参数提供完成提议的函数调用模板,但过滤掉仅显示兼容类型的提案。不幸的是,我无法找到任何相关的教程或示例。

对于任何建议,链接,代码片段等,我将不胜感激。

提前致谢!

的Grzegorz

1 个答案:

答案 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()将返回我们的示例模板,并且用户将使用它,那么将调用参数barbaz resolve(),以便我们可以提供关于这些参数类型的每个foo函数参数。