Eclipse JDT ListRewrite 在错误的位置插入新节点
Eclipse JDT ListRewrite inserts new node at wrong places
我正在尝试使用 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 character.The 输入和输出 类 已在下面给出。
输入Class:
@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);
}
}
输出Class:
@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);
}
}
正如您在上面的代码中看到的,注释与修饰符混淆了。我在网上尝试了多种 insertFirst,insertLast.Examples 的组合,都不完整。有人可以为我指出 mistake/the 正确的资源吗?
我只是无法让它与 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());
终于在 disk/save 上写入文件。保存前格式化(可选)是个好主意,因为节点插入会弄乱代码格式。
我正在尝试使用 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 character.The 输入和输出 类 已在下面给出。
输入Class:
@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);
}
}
输出Class:
@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);
}
}
正如您在上面的代码中看到的,注释与修饰符混淆了。我在网上尝试了多种 insertFirst,insertLast.Examples 的组合,都不完整。有人可以为我指出 mistake/the 正确的资源吗?
我只是无法让它与 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());
终于在 disk/save 上写入文件。保存前格式化(可选)是个好主意,因为节点插入会弄乱代码格式。