[PATCH] D36836: [clang-tidy] Implement readability-function-cognitive-complexity check
Roman Lebedev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 2 13:28:36 PDT 2020
lebedev.ri added inline comments.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:367-368
+ bool TraverseStmt(Stmt *Node) {
+ if (!Node)
+ return Base::TraverseStmt(Node);
+
----------------
aaron.ballman wrote:
> If there's not a node, do we really need to traverse it?
This is consistent across this whole `FunctionASTVisitor`, and is consistent with other `RecursiveASTVisitor<>`s,
so i'll leave this as-is. If this is wrong, other places should be changed too.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:381
+ // FIXME: "each method in a recursion cycle" Increment is not implemented.
+ case Stmt::ConditionalOperatorClass:
+ case Stmt::SwitchStmtClass:
----------------
aaron.ballman wrote:
> `BinaryConditionalOperatorClass` as well (for all the places we're dealing with `ConditionalOperatorClass`)?
No, `BinaryConditionalOperator` is explicitly exempt.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:388
+ case Stmt::CXXCatchStmtClass:
+ case Stmt::GotoStmtClass:
+ Reasons |= CognitiveComplexity::Criteria::Increment;
----------------
aaron.ballman wrote:
> Should `IndirectGotoStmtClass` be handled the same way?
Right, it should be.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:410
+ case Stmt::CXXCatchStmtClass:
+ case Stmt::LambdaExprClass:
+ Reasons |= CognitiveComplexity::Criteria::IncrementNesting;
----------------
aaron.ballman wrote:
> `BlockExprClass` as well?
>
> Should GNU statement expressions also be treated like a lambda or block?
> BlockExprClass as well?
Thank you for the example, that seems obvious & straight-forward to support.
As discussed, we should handle decls thought, not exprs.
> Should GNU statement expressions also be treated like a lambda or block?
Hm, i guess it should be.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:428
+ case Stmt::DoStmtClass:
+ case Stmt::CXXCatchStmtClass:
+ Reasons |= CognitiveComplexity::Criteria::PenalizeNesting;
----------------
aaron.ballman wrote:
> `SEHExceptStmtClass` as well?
I'm very much unfamiliar with that extension.
I would prefer to leave it as-is for now.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:473
+ case Decl::CXXConstructor:
+ case Decl::CXXDestructor:
+ break;
----------------
aaron.ballman wrote:
> What about other special member functions like overloaded operators and whatnot? How about block declarations?
>
> Namespaces is another one I was curious about but suspect may not want to be handled here.
> What about other special member functions like overloaded operators and whatnot?
Those are `CXXMethodDecl`, but i'll add a test.
> How about block declarations?
Right, we should handle them, not blockstatements.
> Namespaces is another one I was curious about but suspect may not want to be handled here.
To the best of my knowledge, those can only appear at the global scope.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D36836/new/
https://reviews.llvm.org/D36836
More information about the cfe-commits
mailing list