steveire created this revision. steveire added reviewers: aaron.ballman, njames93. Herald added subscribers: nullptr.cpp, lebedev.ri, xazax.hun. Herald added a reviewer: lebedev.ri. steveire requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Update test to note use of lambda instead of the invisible operator(). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D96131 Files: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp Index: clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp @@ -666,8 +666,8 @@ // CHECK-NOTES: :[[@LINE-1]]:5: note: +2, including nesting penalty of 1, nesting level increased to 2{{$}} } }; -// CHECK-NOTES: :[[@LINE-6]]:14: warning: function 'operator()' has cognitive complexity of 1 (threshold 0) [readability-function-cognitive-complexity] -// CHECK-NOTES: :[[@LINE-5]]:5: note: +1, including nesting penalty of 0, nesting level increased to 1{{$}} + // CHECK-NOTES: :[[@LINE-6]]:14: warning: lambda has cognitive complexity of 1 (threshold 0) [readability-function-cognitive-complexity] + // CHECK-NOTES: :[[@LINE-5]]:5: note: +1, including nesting penalty of 0, nesting level increased to 1{{$}} } void unittest_b2_09() { Index: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h =================================================================== --- clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h +++ clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h @@ -31,6 +31,9 @@ void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + llvm::Optional<TraversalKind> getCheckTraversalKind() const override { + return TK_IgnoreUnlessSpelledInSource; + } private: const unsigned Threshold; Index: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp +++ clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp @@ -501,28 +501,38 @@ void FunctionCognitiveComplexityCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( - functionDecl(isDefinition(), - unless(anyOf(isDefaulted(), isDeleted(), isImplicit(), - isInstantiated(), isWeak()))) - .bind("func"), - this); + functionDecl(isDefinition(), unless(isWeak())).bind("func"), this); + Finder->addMatcher(lambdaExpr().bind("lambda"), this); } void FunctionCognitiveComplexityCheck::check( const MatchFinder::MatchResult &Result) { - const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func"); - assert(Func->hasBody() && "The matchers should only match the functions that " - "have user-provided body."); FunctionASTVisitor Visitor; - Visitor.TraverseDecl(const_cast<FunctionDecl *>(Func), true); + SourceLocation Loc; + + const auto *TheDecl = Result.Nodes.getNodeAs<FunctionDecl>("func"); + const auto *TheLambdaExpr = Result.Nodes.getNodeAs<LambdaExpr>("lambda"); + if (TheDecl) { + assert(TheDecl->hasBody() && + "The matchers should only match the functions that " + "have user-provided body."); + Loc = TheDecl->getLocation(); + Visitor.TraverseDecl(const_cast<FunctionDecl *>(TheDecl), true); + } else { + Loc = TheLambdaExpr->getBeginLoc(); + Visitor.TraverseLambdaExpr(const_cast<LambdaExpr *>(TheLambdaExpr)); + } if (Visitor.CC.Total <= Threshold) return; - diag(Func->getLocation(), - "function %0 has cognitive complexity of %1 (threshold %2)") - << Func << Visitor.CC.Total << Threshold; + if (TheDecl) + diag(Loc, "function %0 has cognitive complexity of %1 (threshold %2)") + << TheDecl << Visitor.CC.Total << Threshold; + else + diag(Loc, "lambda has cognitive complexity of %0 (threshold %1)") + << Visitor.CC.Total << Threshold; // Output all the basic increments of complexity. for (const auto &Detail : Visitor.CC.Details) {
Index: clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-function-cognitive-complexity.cpp @@ -666,8 +666,8 @@ // CHECK-NOTES: :[[@LINE-1]]:5: note: +2, including nesting penalty of 1, nesting level increased to 2{{$}} } }; -// CHECK-NOTES: :[[@LINE-6]]:14: warning: function 'operator()' has cognitive complexity of 1 (threshold 0) [readability-function-cognitive-complexity] -// CHECK-NOTES: :[[@LINE-5]]:5: note: +1, including nesting penalty of 0, nesting level increased to 1{{$}} + // CHECK-NOTES: :[[@LINE-6]]:14: warning: lambda has cognitive complexity of 1 (threshold 0) [readability-function-cognitive-complexity] + // CHECK-NOTES: :[[@LINE-5]]:5: note: +1, including nesting penalty of 0, nesting level increased to 1{{$}} } void unittest_b2_09() { Index: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h =================================================================== --- clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h +++ clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.h @@ -31,6 +31,9 @@ void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + llvm::Optional<TraversalKind> getCheckTraversalKind() const override { + return TK_IgnoreUnlessSpelledInSource; + } private: const unsigned Threshold; Index: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp +++ clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp @@ -501,28 +501,38 @@ void FunctionCognitiveComplexityCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( - functionDecl(isDefinition(), - unless(anyOf(isDefaulted(), isDeleted(), isImplicit(), - isInstantiated(), isWeak()))) - .bind("func"), - this); + functionDecl(isDefinition(), unless(isWeak())).bind("func"), this); + Finder->addMatcher(lambdaExpr().bind("lambda"), this); } void FunctionCognitiveComplexityCheck::check( const MatchFinder::MatchResult &Result) { - const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func"); - assert(Func->hasBody() && "The matchers should only match the functions that " - "have user-provided body."); FunctionASTVisitor Visitor; - Visitor.TraverseDecl(const_cast<FunctionDecl *>(Func), true); + SourceLocation Loc; + + const auto *TheDecl = Result.Nodes.getNodeAs<FunctionDecl>("func"); + const auto *TheLambdaExpr = Result.Nodes.getNodeAs<LambdaExpr>("lambda"); + if (TheDecl) { + assert(TheDecl->hasBody() && + "The matchers should only match the functions that " + "have user-provided body."); + Loc = TheDecl->getLocation(); + Visitor.TraverseDecl(const_cast<FunctionDecl *>(TheDecl), true); + } else { + Loc = TheLambdaExpr->getBeginLoc(); + Visitor.TraverseLambdaExpr(const_cast<LambdaExpr *>(TheLambdaExpr)); + } if (Visitor.CC.Total <= Threshold) return; - diag(Func->getLocation(), - "function %0 has cognitive complexity of %1 (threshold %2)") - << Func << Visitor.CC.Total << Threshold; + if (TheDecl) + diag(Loc, "function %0 has cognitive complexity of %1 (threshold %2)") + << TheDecl << Visitor.CC.Total << Threshold; + else + diag(Loc, "lambda has cognitive complexity of %0 (threshold %1)") + << Visitor.CC.Total << Threshold; // Output all the basic increments of complexity. for (const auto &Detail : Visitor.CC.Details) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits