virtual void HandleTranslationUnit(TranslationUnit& tu) { // called when everything is done UsageMap uses; for (int i = 0; i < globals.size(); ++i) { uses[globals[i]] = vector<DeclRefExpr*>(); } FindUsages fu(uses); for (int i = 0; i < functions.size(); ++i) { fu.process(functions[i]); } for (int i = 0; i < globals.size(); ++i) { VarDecl* VD = globals[i]; FullSourceLoc loc(VD->getLocation(), *sm); bool isStatic = VD->getStorageClass() == VarDecl::Static; cout << "<span class=\"global\">" << loc.getSourceName() << ": " << (isStatic?"static ":"") << VD->getName() << " (" << uses[VD].size() << " local uses)" << "\n</span>"; cout << "<span class=\"uses\">"; for (int j = 0; j < uses[VD].size(); ++j) { DeclRefExpr* dre = uses[VD][j]; FunctionDecl* fd = enclosing[dre]; FullSourceLoc loc(dre->getLocStart(), *sm); cout << " " << fd->getName() << ":" << loc.getLogicalLineNumber() << "\n"; } cout << "</span>"; } }
void UnnecessaryValueParamCheck::handleMoveFix(const ParmVarDecl &Var, const DeclRefExpr &CopyArgument, const ASTContext &Context) { auto Diag = diag(CopyArgument.getLocStart(), "parameter %0 is passed by value and only copied once; " "consider moving it to avoid unnecessary copies") << &Var; // Do not propose fixes in macros since we cannot place them correctly. if (CopyArgument.getLocStart().isMacroID()) return; const auto &SM = Context.getSourceManager(); auto EndLoc = Lexer::getLocForEndOfToken(CopyArgument.getLocation(), 0, SM, Context.getLangOpts()); Diag << FixItHint::CreateInsertion(CopyArgument.getLocStart(), "std::move(") << FixItHint::CreateInsertion(EndLoc, ")"); if (auto IncludeFixit = Inserter->CreateIncludeInsertion( SM.getFileID(CopyArgument.getLocStart()), "utility", /*IsAngled=*/true)) Diag << *IncludeFixit; }
void Fix(CompoundStmt* CS) { if (!CS->size()) return; typedef llvm::SmallVector<Stmt*, 32> Statements; Statements Stmts; Stmts.append(CS->body_begin(), CS->body_end()); for (Statements::iterator I = Stmts.begin(); I != Stmts.end(); ++I) { if (!TraverseStmt(*I) && !m_HandledDecls.count(m_FoundDRE->getDecl())) { Sema::DeclGroupPtrTy VDPtrTy = m_Sema->ConvertDeclToDeclGroup(m_FoundDRE->getDecl()); StmtResult DS = m_Sema->ActOnDeclStmt(VDPtrTy, m_FoundDRE->getLocStart(), m_FoundDRE->getLocEnd()); assert(!DS.isInvalid() && "Invalid DeclStmt."); I = Stmts.insert(I, DS.take()); m_HandledDecls.insert(m_FoundDRE->getDecl()); } } CS->setStmts(m_Sema->getASTContext(), Stmts.data(), Stmts.size()); }