在抽象语法树中插入节点之后的节点 - Eclipse CDT

时间:2018-05-28 15:05:39

标签: java c eclipse-cdt abstract-syntax-tree

我想在另一条评论之后插入节点

/**************/
/* Prototypes */
/**************/
--->want to declare function prototype here
int x = 5;

所以我通过这段代码在ast中获得了注释节点

@Override
protected int visit(IASTComment comment) {
    if(comment.getRawSignature().contains("Prototypes")) {
        prototypeNode = comment;
    }
    return super.visit(comment);
}

然后我想在评论

之后插入此节点
INodeFactory factory = ast.getASTNodeFactory();
IASTSimpleDeclaration simpleDeclaration = factory.newSimpleDeclaration(functionDef.getDeclSpecifier());
simpleDeclaration.addDeclarator(functionDef.getDeclarator());

ASTRewrite rewriter = ASTRewrite.create(ast);
//I want to insert the simpleDeclaration node after the comment node  
**enter code here**


Change c = rewriter.rewriteAST();
try {
    c.perform(new NullProgressMonitor());
} catch (CoreException e) {
    e.printStackTrace();
}

1 个答案:

答案 0 :(得分:0)

ASTRewrite有一个insertBefore(IASTNode parent, IASTNode insertionPoint, IASTNode newNode, TextEditGroup editGroup)方法,您可以将其用于此目的。

在您的情况下,您希望通过以下方式调用它:

  • 您的simpleDeclaration作为newNode
  • 的参数
  • int x = 5;的声明(您将在遍历期间找到)作为insertionPoint的参数
  • insertionPoint的父级(可能是IASTTranslationUnit)作为parent的参数
  • 您可以为null参数传递editGroup。 (基于CDT代码库中ASTRewrite的现有用法,似乎这个可选参数的目的是将一组编辑与描述/标签相关联,以后可以在例如重构UI中显示。)