2014-09-02 55 views
3

我正在創建一個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插件可以這麼做我可以試着去編譯它。

+0

您正在訪問的這個「節點」是否僅指外部的'if-else'語句?你如何獲得'node'? – Axarydax 2014-09-02 10:15:35

+0

首先訪問外部的IfStatement,然後訪問內部的一個。我回顧了所有的CompilationUnit類型聲明,並且訪問了它們。 – jQueen 2014-09-02 10:20:31

+0

,但是當您提交外部語句的修改時,不會引用無效的內部語句? – Axarydax 2014-09-02 10:22:08

回答

0

我有同樣的問題,通過更改表達式的偏移量已更改,而不是更新。作爲一種解決方法,我首先收集了所有應該替換的表達式,然後顛倒了集合,並在代碼末尾開始了更改。所以偏移量沒有改變,我可以改變所有的表達式。

這不是一個好的解決方案,但是這對我有用。