我正在创建一个Eclipse插件,该插件应该将块插入一行if-else语句。在使用JDT的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);
}
});
&一旦它的整个访问我提交工作副本的声明。 这会将块添加到外部的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 &整个代码被搞砸为它不会有更新增加了牙套“偏移”&“长度”代码将被替换 &因此它不断更换错误的地方&弄乱了。
//无效org.eclipse.jface.text.IDocument.replace(INT抵消,诠释长度字符串textTobeReplaced)
我也试图让日食是怎么做的吧。但无法达到这一点。 任何人都可以帮助解决这个问题吗?或我应该参考的任何种类的插件代码?即使我可以得到哪个eclipse插件可以这么做我可以试着去编译它。
您正在访问的这个“节点”是否仅指外部的'if-else'语句?你如何获得'node'? – Axarydax 2014-09-02 10:15:35
首先访问外部的IfStatement,然后访问内部的一个。我回顾了所有的CompilationUnit类型声明,并且访问了它们。 – jQueen 2014-09-02 10:20:31
,但是当您提交外部语句的修改时,不会引用无效的内部语句? – Axarydax 2014-09-02 10:22:08