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; }
bool RemoveNamespaceRewriteVisitor::VisitNamespaceAliasDecl( NamespaceAliasDecl *D) { if (ConsumerInstance->isForUsingNamedDecls) return true; const NamespaceDecl *CanonicalND = D->getNamespace()->getCanonicalDecl(); if (D->getQualifier()) { TraverseNestedNameSpecifierLoc(D->getQualifierLoc()); if (CanonicalND == ConsumerInstance->TheNamespaceDecl) { NestedNameSpecifierLoc QualLoc = D->getQualifierLoc(); SourceLocation QualEndLoc = QualLoc.getEndLoc(); SourceLocation DeclEndLoc = D->getSourceRange().getEnd(); ConsumerInstance->TheRewriter.RemoveText( SourceRange(QualEndLoc, DeclEndLoc)); } } else { if (CanonicalND == ConsumerInstance->TheNamespaceDecl) ConsumerInstance->RewriteHelper->removeDecl(D); } return true; }