10 #include "../utils/OptionsUtils.h"
11 #include "clang/AST/ASTContext.h"
12 #include "clang/ASTMatchers/ASTMatchFinder.h"
18 namespace readability {
21 "::std::basic_string;::std::basic_string_view;::std::vector;::std::array";
23 SimplifySubscriptExprCheck::SimplifySubscriptExprCheck(
30 const auto TypesMatcher = hasUnqualifiedDesugaredType(
31 recordType(hasDeclaration(cxxRecordDecl(hasAnyName(
32 llvm::SmallVector<StringRef, 8>(Types.begin(), Types.end()))))));
35 arraySubscriptExpr(hasBase(ignoringParenImpCasts(
37 has(memberExpr().bind(
"member")),
39 unless(anyOf(substTemplateTypeParmType(),
40 hasDescendant(substTemplateTypeParmType()))),
41 anyOf(TypesMatcher, pointerType(pointee(TypesMatcher)))))),
42 callee(namedDecl(hasName(
"data"))))
48 const auto *Call = Result.Nodes.getNodeAs<CXXMemberCallExpr>(
"call");
49 if (Result.Context->getSourceManager().isMacroBodyExpansion(
53 const auto *Member = Result.Nodes.getNodeAs<MemberExpr>(
"member");
55 diag(Member->getMemberLoc(),
56 "accessing an element of the container does not require a call to "
57 "'data()'; did you mean to use 'operator[]'?");
58 if (Member->isArrow())
59 DiagBuilder << FixItHint::CreateInsertion(Member->getBeginLoc(),
"(*")
60 << FixItHint::CreateInsertion(Member->getOperatorLoc(),
")");
61 DiagBuilder << FixItHint::CreateRemoval(
62 {Member->getOperatorLoc(), Call->getEndLoc()});