2014-09-02 63 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

我有同样的问题,通过更改表达式的偏移量已更改,而不是更新。作为一种解决方法,我首先收集了所有应该替换的表达式,然后颠倒了集合,并在代码末尾开始了更改。所以偏移量没有改变,我可以改变所有的表达式。

这不是一个好的解决方案,但是这对我有用。