From 296c6e85c19b7fc224109fe43af2fd9ed1d3d510 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 29 Dec 2020 13:43:06 +0000 Subject: [PATCH] [clang-tidy] Simplify shrink to fit check Differential Revision: https://reviews.llvm.org/D97144 --- .../clang-tidy/modernize/ShrinkToFitCheck.cpp | 35 +++++++++------------- .../clang-tidy/modernize/ShrinkToFitCheck.h | 3 ++ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp index 7911a56..411f04e 100644 --- a/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp @@ -21,31 +21,24 @@ namespace modernize { void ShrinkToFitCheck::registerMatchers(MatchFinder *Finder) { // Swap as a function need not to be considered, because rvalue can not // be bound to a non-const reference. - const auto ShrinkableAsMember = - memberExpr(member(valueDecl().bind("ContainerDecl"))); - const auto ShrinkableAsDecl = - declRefExpr(hasDeclaration(valueDecl().bind("ContainerDecl"))); - const auto CopyCtorCall = cxxConstructExpr(hasArgument( - 0, anyOf(ShrinkableAsMember, ShrinkableAsDecl, - unaryOperator(has(ignoringParenImpCasts(ShrinkableAsMember))), - unaryOperator(has(ignoringParenImpCasts(ShrinkableAsDecl)))))); - const auto SwapParam = - expr(anyOf(memberExpr(member(equalsBoundNode("ContainerDecl"))), - declRefExpr(hasDeclaration(equalsBoundNode("ContainerDecl"))), - unaryOperator(has(ignoringParenImpCasts( - memberExpr(member(equalsBoundNode("ContainerDecl")))))), - unaryOperator(has(ignoringParenImpCasts(declRefExpr( - hasDeclaration(equalsBoundNode("ContainerDecl")))))))); + const auto ShrinkableExpr = mapAnyOf(memberExpr, declRefExpr); + const auto Shrinkable = + ShrinkableExpr.with(hasDeclaration(valueDecl().bind("ContainerDecl"))); + const auto BoundShrinkable = ShrinkableExpr.with( + hasDeclaration(valueDecl(equalsBoundNode("ContainerDecl")))); Finder->addMatcher( cxxMemberCallExpr( - on(hasType(hasCanonicalType(hasDeclaration(namedDecl( - hasAnyName("std::basic_string", "std::deque", "std::vector")))))), callee(cxxMethodDecl(hasName("swap"))), - has(ignoringParenImpCasts( - memberExpr(traverse(TK_AsIs, hasDescendant(CopyCtorCall))))), - hasArgument(0, SwapParam.bind("ContainerToShrink")), - unless(isInTemplateInstantiation())) + hasArgument( + 0, anyOf(Shrinkable, unaryOperator(hasUnaryOperand(Shrinkable)))), + on(cxxConstructExpr(hasArgument( + 0, + expr(anyOf(BoundShrinkable, + unaryOperator(hasUnaryOperand(BoundShrinkable))), + hasType(hasCanonicalType(hasDeclaration(namedDecl(hasAnyName( + "std::basic_string", "std::deque", "std::vector")))))) + .bind("ContainerToShrink"))))) .bind("CopyAndSwapTrick"), this); } diff --git a/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.h b/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.h index 3364855..6ea0522 100644 --- a/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.h @@ -30,6 +30,9 @@ public: } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + llvm::Optional getCheckTraversalKind() const override { + return TK_IgnoreUnlessSpelledInSource; + } }; } // namespace modernize -- 2.7.4