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

标签 eclipse eclipse-plugin eclipse-jdt

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

[就像 Eclipse 通过在保存操作上设置编辑器首选项来促进一样]

例如

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);
                }
            });

& 一旦访问完毕,我提交工作副本。 这将 block 添加到外部 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 添加大括号,并且整个代码会变得一团糟,因为它没有为要替换的代码更新“偏移量”和“长度”,因此它总是在错误的地方更换并弄乱。

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

我也尝试了解 eclipse 是如何做到的。却达不到那个地步。 任何人都可以帮助解决这个问题吗? 或者我应该引用任何类型的插件代码?即使我可以获得哪个 eclipse 插件执行此操作,我也可以尝试反编译它。

最佳答案

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

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

关于eclipse - 使用 JDT 在 If-else 语句中插入 block /大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25620828/

相关文章:

eclipse - 导入 scala.io.StdIn

android - Android 项目的 Eclipse Gradle 导出不执行任何操作

java - 如何使用 ASTRewrite 插入代码片段插入方法体?

java - Eclipse 中的值(value)跟踪

java - 在 intellij 13 中存储有关方法参数的信息(可通过反射使用)

java - 在 Xtext 大纲 View 中隐藏父节点

java - Eclipse 片段项目是否有等效于 BundleActivator 的东西?

multithreading - 如何将 Eclipse RCP TableView 绑定(bind)到其他线程数据

Java : Import a class programmatically

java - org.eclipse.jdt.core.dom.ASTNode 的 child