[PATCH] D36836: [clang-tidy] Implement readability-function-cognitive-complexity check

Jonas Toth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 15 07:36:26 PDT 2017


JonasToth added a comment.

Looking up to the Visitor, i will do this next.



================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:27
+  // Here are all the possible reasons:
+  enum Criteria : unsigned char {
+    None = 0,
----------------
i think clarifying which language constructs relative to what criteria would help here.

with the document next to me here its clear, but i think we shouldn't expect that. a link/refernce to the page would be nice, too.


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:51
+    const SourceLocation Loc; // what caused the increment?
+    const unsigned short Nesting; // how deeply nestedly is Loc located?
+    const Criteria C : 3; // the criteria of the increment
----------------
s/nestedly/nested/

and make the trailing comments doxygen style? might help, but not so important i think.


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:52
+    const unsigned short Nesting; // how deeply nestedly is Loc located?
+    const Criteria C : 3; // the criteria of the increment
+
----------------
is this a bitfield? How does it help here? A byte should already be started anyway, so leaving 5 bits empty wouldn't have an impact on the size of `Detail`


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:57
+
+    // To minimize the the sizeof(Detail), we only store the minimal info there.
+    // This function is used to convert from the stored info into the usable
----------------
duplicated 'the'


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:62
+    std::pair<const char *, unsigned short> Process() const {
+      assert(C != Criteria::None && "invalid criteria");
+
----------------
You acces `Critera` always scoped. I think you could declare `Criteria` to be a `enum class`, not just a plain `enum`


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:102-114
+const std::array<const char *const, 4> CognitiveComplexity::Msgs = {{
+    // B1 + B2 + B3
+    "+%0, including nesting penalty of %1, nesting level increased to %2",
+
+    // B1 + B2
+    "+%0, nesting level increased to %2",
+
----------------
could this initialization land in line 45? that would be directly close to the criteria. 


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:116-146
+// Criteria is a bitset, thus a few helpers are needed
+static CognitiveComplexity::Criteria
+operator|(CognitiveComplexity::Criteria lhs,
+          CognitiveComplexity::Criteria rhs) {
+  return static_cast<CognitiveComplexity::Criteria>(
+      static_cast<std::underlying_type<CognitiveComplexity::Criteria>::type>(
+          lhs) |
----------------
`Criteria` could be moved out of the `Detail` struct. That would allow closer definiton of the helper code to the `enum`.


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:154
+  Details.emplace_back(Loc, Nesting, C);
+  const Detail &d(Details.back());
+
----------------
s/d/D/ naming convention


================
Comment at: clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp:168
+  // Used to efficiently know the last type of binary sequence operator that
+  // was encoutered. It would make sense for the function call to start the
+  // new sequence, thus it is a stack.
----------------
s/encoutered/encountered/


Repository:
  rL LLVM

https://reviews.llvm.org/D36836





More information about the cfe-commits mailing list