[cfe-dev] RecursiveAstVisitor: How to find the open brace of the corresponding function declaration within a VisitCallExpr?

Johannes Altmanninger via cfe-dev cfe-dev at lists.llvm.org
Thu Aug 17 08:02:26 PDT 2017


Marcel Schaible via cfe-dev <cfe-dev at lists.llvm.org> writes:

> Hi,
>
> I want to retrieve in my RecursiveAstVisitor inside a VisitCallExpr 
> method the open brace of the corresponding function declaration.
>
> The code below does not find anything..
>
> Any idea what I am doing wrong and is there a more elegant way to 
> generate a variable declaration with a Rewriter?

To find the opening brace of the enclosing function can store the
current FunctionDecl as class member.

class MyVisitor : RecursiveASTVisitor<MyVisitor> {

FunctionDecl *Func = nullptr;

bool VisitFunctionDecl(FunctionDecl *FD) {
    Func = FD;
    RecursiveASTVisitor<MyVisitor>::VisitFuncionDecl(FD);
}

};

However, if you want the one of the called function, then just use

FunctionDecl *FD = CallExpression->getDirectCallee();
if (FD) {
   ...
}

>
> Thanx
>
> Marcel
>
> bool VisitCallExpr(CallExpr *CallExpression) {
> ...
>          if (CallExpression != NULL) {
>              const auto& parents = TheContext->getParents(CallExpression);
>
>              if (parents.empty()) {
>                  llvm::errs() << "**** Can not find parent\n";
>                  return false;
>              }
>
>              auto parent = parents[0].get<DeclStmt>();
>
>              if (parent != NULL) {
>                  llvm::errs() << "**** FOUND DECL STATEMENT ****\n";
>                  SourceLocation l1 = parent->getLocStart();
>                  TheRewriter.InsertText(l1, "/** found decl**/");
>              }
>              else
>                  llvm::errs() << "**** DECL STATEMENT NOT FOUND ****\n";
>
> ...
>
> }
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev



More information about the cfe-dev mailing list