void FunctionCognitiveComplexityCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
functionDecl(isDefinition(),
- unless(anyOf(isDefaulted(), isDeleted(), isImplicit(),
- isInstantiated(), isWeak())))
+ unless(anyOf(isDefaulted(), isDeleted(), 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) {