45 const auto *OuterCall = Result.Nodes.getNodeAs<CallExpr>(
"outer_call");
48 const auto *InnerCall = Result.Nodes.getNodeAs<CallExpr>(
"inner_call");
51 const auto *OuterCallee =
52 cast<DeclRefExpr>(OuterCall->getCallee()->IgnoreImplicit());
54 const StringRef InnerFuncName =
55 cast<NamedDecl>(InnerCall->getCalleeDecl())->getName();
58 const llvm::SmallDenseMap<StringRef, StringRef, 2>
59 InnerFuncNameToReplacementFuncName = {
60 {
"map_range",
"map_to_vector"},
61 {
"make_filter_range",
"filter_to_vector"},
63 const StringRef ReplacementFuncName =
64 InnerFuncNameToReplacementFuncName.lookup(InnerFuncName);
65 assert(!ReplacementFuncName.empty() &&
"Unhandled function?");
67 auto Diag = diag(OuterCall->getBeginLoc(),
"use '%0'") << ReplacementFuncName;
77 const SourceManager &SM = *Result.SourceManager;
78 const std::optional<Token> InnerLParen =
80 InnerCall->getCallee()->getEndLoc(), SM, getLangOpts());
81 if (!InnerLParen || InnerLParen->isNot(tok::l_paren))
84 Diag << FixItHint::CreateReplacement(
85 OuterCallee->getNameInfo().getSourceRange(), ReplacementFuncName)
86 << FixItHint::CreateRemoval(CharSourceRange::getCharRange(
87 InnerCall->getBeginLoc(), InnerLParen->getEndLoc()))
88 << FixItHint::CreateRemoval(InnerCall->getRParenLoc());
91 if (
auto IncludeFixit = Inserter.createIncludeInsertion(
92 SM.getFileID(OuterCall->getBeginLoc()),
93 "llvm/ADT/SmallVectorExtras.h"))
94 Diag << *IncludeFixit;
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.