Eclipse JDT ListRewrite在错误的位置插入新节点

时间:2018-04-05 14:50:22

标签: eclipse abstract-syntax-tree eclipse-jdt

我尝试使用Eclipse JDT基础结构向某些选定字段添加注释。但是,这不是作为插件运行的。我将所有必需的依赖项添加到单独的项目中,因此可以在批处理模式下运行。但是我发现,ListRewrite没有在正确的位置插入我的注释。我已经给出了下面的代码。我最初使用访问者在地图中获取所有字段声明,然后使用下面的代码逐个添加它们。

FieldDeclaration fld = lVrblDet.listStringVarMap.get(propName);
final MarkerAnnotation autoWiredAnnotate = ast.newMarkerAnnotation();                           autoWiredAnnotate.setTypeName(ast.newName("MyAnnot"));
lrw = rewriter.getListRewrite(fld, FieldDeclaration.MODIFIERS2_PROPERTY);
lrw.insertLast(autoWiredAnnotate, null);
Document document = new Document(cu.toString());
try {
    TextEdit edits = rewriter.rewriteAST(document, null);
    edits.apply(document);
} catch (MalformedTreeException | IllegalArgumentException | BadLocationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

然而,预期输出有时会偏移1个字符。输入和输出类别已在下面给出。

输入类:

@SuppressWarnings("unchecked")
public class SampleClassA {

    public SampleClassB classB;

    public SampleClassB getClassB() {
        return classB;
    }

    public void setClassB(SampleClassB classB) {
        this.classB = classB;
    }

    @Deprecated
    public void printNameFromSmapleClassB() {
        System.out.println(this.classB.name);
    }

}

输出类:

@SuppressWarnings("unchecked") public class SampleClassA {
  p @MyAnnot
ublic SampleClassB classB;
  public SampleClassB getClassB(){
    return classB;
  }
  public void setClassB(  SampleClassB classB){
    this.classB=classB;
  }
  @Deprecated public void printNameFromSmapleClassB(){
    System.out.println(this.classB.name);
  }
}

正如您在上面的代码中所看到的,Annotation与修饰符混淆了。我尝试过insertFirst的多个组合,insertLast。网上的例子不完整。有人能指出错误/正确的资源吗?

1 个答案:

答案 0 :(得分:0)

我无法让它与ListRewrite一起使用。我不知道自己做错了什么。所以我写了一个访问者来将所有FieldDeclarations存储在地图中。

@Override
public boolean visit(FieldDeclaration node) {
    for (Object obj : node.fragments()) {
        listStringVarMap.put(((VariableDeclarationFragment) obj).getName().toString(), node);
    }
    return false;
}

我循环遍历地图并将注释节点作为修饰符插入,以满足我的标准。请记住打开要修改的编译单元的录像。

CompilationUnit cu = jFileAst.getEquivCompilUnit();
cu.recordModifications();
FieldDeclaration fldDecl = lVrblDet.listStringVarMap.get(propName);
importVo = (JavaAnnotImportVo) javaAstNodeCreator
            .createASTNode(SpringAnnotationEnum.AutowireAnnotation, ast);
cu.imports().add(importVo.getImpDecl());
fldDecl.modifiers().add(0, importVo.getAnnotNode());

最后写入磁盘上的文件/保存回来。保存之前格式化(可选)是一个好主意,因为节点插入会弄乱代码格式化。