使用JDT在If-else语句中插入块/大括号

时间:2014-09-02 10:06:35

标签: eclipse eclipse-plugin eclipse-jdt

我正在创建一个Eclipse插件,它应该将块插入一行if-else语句。

[就像Eclipse通过在Save-action上设置编辑器的首选项一样方便]

例如。

if (isFormed)
    if (i == 1)
        System.out.println("i is 1");
    else
        System.out.println("i is undefined");

应替换为

if (isFormed)
{
    if (i == 1)
        {
           System.out.println("i is 1");
        }
    else
        {
        System.out.println("i is undefined");
        }
}

以下是我如何访问&替换AST中的语句

node.accept(new ASTVisitor() {
                @Override
                public boolean visit(IfStatement ifStatement) {
                    //Add Block in case of IfStatemnet if it is not there.
                    if(ifStatement != null){
                        Statement thenStatement = ifStatement.getThenStatement();
                        Statement elseStatement = ifStatement.getElseStatement();
                        String codeToReplace = "if("+ifStatement.getExpression()+")";
                        if(thenStatement instanceof Block)
                            codeToReplace += "\n"+ thenStatement + "";
                        else
                            codeToReplace += "{\n"+ thenStatement + "\n}";
                        if(elseStatement != null){
                            if(elseStatement instanceof Block)
                                codeToReplace += "else" + elseStatement +"\n";
                            else
                                codeToReplace += "else{\n" + elseStatement +"\n}";
                        }
                        replaceStatment(rewriter, getBlockInstence(ifStatement), codeToReplace , ifStatement);
                    }
                    return super.visit(ifStatement);
                }
            });

&安培;一旦它完整访问我提交工作副本。 这增加了外部if-else的块,&不是内心的。

我也尝试更换文件&如下访问时提交它:

IDocument document = new org.eclipse.jface.text.Document(iCompilationUnit.getSource());
TextEdit edits = mCompilationUnit.rewrite(document, null);
document.replace(ifStatement.getStartPosition(), ifStatement.getLength(), codeToReplace);
edits.apply(document);
iCompilationUnit.getBuffer().setContents(document.get());
iCompilationUnit.commitWorkingCopy(true, new NullProgressMonitor());

但是这会增加内部if-else&&整个代码搞砸为 IT没有更新“偏移”&更换代码的“长度”&因此,它一直在错误的地方更换搞砸了。

// void org.eclipse.jface.text.IDocument.replace(int offset,int length,String textTobeReplaced)

我也试过了eclipse如何做到这一点。但无法达到这一点。 任何人都可以帮忙解决这个问题吗?或者我应该参考任何类型的插件代码?即使我可以哪个eclipse插件执行此操作,我也可以尝试对其进行反编译。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,通过更改表达式的偏移量已更改且未更新。作为一种解决方法,我首先收集了应该替换的所有表达式,然后反转了集合,因此在代码末尾开始了更改。所以偏移量没有改变,我可以改变所有表达式。

这不是一个好的解决方案,但这对我有用。