我正在创建一个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插件执行此操作,我也可以尝试对其进行反编译。
答案 0 :(得分:0)
我遇到了同样的问题,通过更改表达式的偏移量已更改且未更新。作为一种解决方法,我首先收集了应该替换的所有表达式,然后反转了集合,因此在代码末尾开始了更改。所以偏移量没有改变,我可以改变所有表达式。
这不是一个好的解决方案,但这对我有用。