[PATCH] D36836: [clang-tidy] Implement readability-function-cognitive-complexity check
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 2 13:38:11 PDT 2020
aaron.ballman 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);
+
----------------
lebedev.ri wrote:
> 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.
Fine by me, thanks.
================
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:
----------------
lebedev.ri wrote:
> aaron.ballman wrote:
> > `BinaryConditionalOperatorClass` as well (for all the places we're dealing with `ConditionalOperatorClass`)?
> No, `BinaryConditionalOperator` is explicitly exempt.
I didn't see anything in the paper that talked about this (it's a GNU extension). I feel like anywhere we handle a ternary conditional we should also handle a binary conditional, e.g.,
```
foo ? foo : bar; // ternary form
foo ? : bar; // binary form of the same thing
```
but maybe I'm misunderstanding something.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:428
+ case Stmt::DoStmtClass:
+ case Stmt::CXXCatchStmtClass:
+ Reasons |= CognitiveComplexity::Criteria::PenalizeNesting;
----------------
lebedev.ri wrote:
> aaron.ballman wrote:
> > `SEHExceptStmtClass` as well?
> I'm very much unfamiliar with that extension.
> I would prefer to leave it as-is for now.
I'm fine handling it in a follow-up. I suspect there may be other esoteric AST nodes we want to add, I just tried to hit the ones that were most obvious to me.
================
Comment at: clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:473
+ case Decl::CXXConstructor:
+ case Decl::CXXDestructor:
+ break;
----------------
lebedev.ri wrote:
> 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.
>> 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.
They can, but I wasn't certain if they'd add to complexity or not given that you can nest them deeply. But now I see that the paper doesn't mention them in terms of C++ but does talk about something similar with JavaScript that suggests they should not contribute to complexity.
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