我正在创建一个 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/