forked from OSchip/llvm-project
[clang-tidy] Simplify function complexity check
Update test to note use of lambda instead of the invisible operator(). Differential Revision: https://reviews.llvm.org/D96131
This commit is contained in:
parent
038bd14712
commit
6852a29a3b
|
@ -502,27 +502,40 @@ void FunctionCognitiveComplexityCheck::storeOptions(
|
||||||
void FunctionCognitiveComplexityCheck::registerMatchers(MatchFinder *Finder) {
|
void FunctionCognitiveComplexityCheck::registerMatchers(MatchFinder *Finder) {
|
||||||
Finder->addMatcher(
|
Finder->addMatcher(
|
||||||
functionDecl(isDefinition(),
|
functionDecl(isDefinition(),
|
||||||
unless(anyOf(isDefaulted(), isDeleted(), isImplicit(),
|
unless(anyOf(isDefaulted(), isDeleted(), isWeak())))
|
||||||
isInstantiated(), isWeak())))
|
|
||||||
.bind("func"),
|
.bind("func"),
|
||||||
this);
|
this);
|
||||||
|
Finder->addMatcher(lambdaExpr().bind("lambda"), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCognitiveComplexityCheck::check(
|
void FunctionCognitiveComplexityCheck::check(
|
||||||
const MatchFinder::MatchResult &Result) {
|
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;
|
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)
|
if (Visitor.CC.Total <= Threshold)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
diag(Func->getLocation(),
|
if (TheDecl)
|
||||||
"function %0 has cognitive complexity of %1 (threshold %2)")
|
diag(Loc, "function %0 has cognitive complexity of %1 (threshold %2)")
|
||||||
<< Func << Visitor.CC.Total << Threshold;
|
<< 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.
|
// Output all the basic increments of complexity.
|
||||||
for (const auto &Detail : Visitor.CC.Details) {
|
for (const auto &Detail : Visitor.CC.Details) {
|
||||||
|
|
|
@ -31,6 +31,9 @@ public:
|
||||||
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
|
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
|
||||||
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
|
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
|
||||||
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
|
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
|
||||||
|
llvm::Optional<TraversalKind> getCheckTraversalKind() const override {
|
||||||
|
return TK_IgnoreUnlessSpelledInSource;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const unsigned Threshold;
|
const unsigned Threshold;
|
||||||
|
|
|
@ -666,7 +666,7 @@ void unittest_b2_08_02() {
|
||||||
// CHECK-NOTES: :[[@LINE-1]]:5: note: +2, including nesting penalty of 1, nesting level increased to 2{{$}}
|
// 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-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{{$}}
|
// CHECK-NOTES: :[[@LINE-5]]:5: note: +1, including nesting penalty of 0, nesting level increased to 1{{$}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue