我正在創建一個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