bool VisitCallExpr(CallExpr *E) { llvm::errs() << "I see a CallExpr\n"; E->dump(); Expr *callee = E->getCallee(); if (ImplicitCastExpr *ica = llvm::dyn_cast<ImplicitCastExpr>(callee)) { callee = ica->getSubExpr(); } if (DeclRefExpr *dref = llvm::dyn_cast<DeclRefExpr>(callee)) { llvm::errs() << "declref:\n"; dref->dump(); NamedDecl *d = dref->getFoundDecl(); ASTContext &Context = d->getASTContext(); SourceManager &SM = Context.getSourceManager(); if (dref->hasQualifier()) { llvm::errs() << " has qualifier in name.\n"; NestedNameSpecifierLoc lc = dref->getQualifierLoc(); llvm::errs() << " begin loc: " << lc.getBeginLoc().printToString(SM) << "\n"; llvm::errs() << " end loc: " << lc.getEndLoc().printToString(SM) << "\n"; } if (UsingShadowDecl *sh = llvm::dyn_cast<UsingShadowDecl>(d)) { NamedDecl *td = sh->getTargetDecl(); FoundRealDecl(td); //d->dump(); } else { FoundRealDecl(d); //d->dump(); } } else if (UnresolvedLookupExpr *ule = dyn_cast<UnresolvedLookupExpr>(callee)) { llvm::errs() << "unresolved\n"; ASTContext* Context; SourceManager* SM; for (const auto *d : ule->decls()) { FoundRealDecl(d); Context = &d->getASTContext(); SM = &Context->getSourceManager(); } llvm::errs() << " begin loc: " << ule->getLocStart().printToString(*SM) << "\n"; llvm::errs() << " end loc: " << ule->getLocEnd().printToString(*SM) << "\n"; NestedNameSpecifierLoc ll = ule->getQualifierLoc(); llvm::errs() << " nested begin loc: " << ll.getBeginLoc().printToString(*SM) << "\n"; llvm::errs() << " nested end loc: " << ll.getEndLoc().printToString(*SM) << "\n"; } return true; }