Вставить узел за узлом в абстрактное синтаксическое дерево - Eclipse CDT - PullRequest
0 голосов
/ 28 мая 2018

Я хочу вставить узел после другого комментария

/**************/
/* 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 голосов
/ 30 мая 2018

ASTRewrite имеет метод insertBefore(IASTNode parent, IASTNode insertionPoint, IASTNode newNode, TextEditGroup editGroup), который вы можете использовать для этой цели.

В вашем случае вы захотите вызвать его с помощью:

  • Ваш simpleDeclaration в качестве аргумента для newNode
  • Объявление для int x = 5; (которое вы найдете во время обхода) в качестве аргумента для insertionPoint
  • Родитель insertionPoint (это может быть IASTTranslationUnit) в качестве аргумента для parent
  • Вы можете передать null для аргумента editGroup.(Основываясь на существующем использовании ASTRewrite в кодовой базе CDT, кажется, что цель этого необязательного аргумента - связать набор изменений с описанием / меткой, которые позже могут быть показаны, например, в пользовательском интерфейсе рефакторинга.)
...