[PATCH] D50862: [clang-tidy] Abseil: faster strsplit delimiter check

Jonas Toth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 16 14:11:09 PDT 2018


JonasToth added inline comments.


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:24
+
+ast_matchers::internal::Matcher<Expr>
+constructExprWithArg(llvm::StringRef ClassName,
----------------
you dont need the `ast_matchers` namespace as there is a `using namespace ast_matchers` at the top, same at other places.


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:49
+  // in the character literal.
+  if (Result == R"("'")") {
+    return std::string(R"('\'')");
----------------
The comment suggest, that all single quotes need to be escaped and then further processing happens, but you check on identity to `'` and return the escaped version of it. 
That confuses me.


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:54
+  // Now replace the " with '.
+  auto Pos = Result.find_first_of('"');
+  if (Pos == Result.npos)
----------------
This expects at max 2 `"` characters. couldnt there be more?


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:71
+
+  // One character string literal.
+  const auto SingleChar =
----------------
Please make the comments full sentences


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:75
+
+  // string_view passed by value and contructed from string literal.
+  auto StringViewArg =
----------------
What about the `std::string_view`?


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:108
+
+  auto Replacement = makeCharacterLiteral(Literal);
+  if (!Replacement)
----------------
Please dont use auto here


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:118
+  diag(Literal->getBeginLoc(),
+       "absl::StrSplit()/ByAnyChar()/MaxSplits() called with a string literal "
+       "consisting of a single character; consider using the more efficient "
----------------
You can configure this diagnostic with `%select{option1|option2}`.

See https://clang.llvm.org/docs/InternalsManual.html#formatting-a-diagnostic-argument
or `bugprone/ForwardingReferenceOverloadCheck.cpp` line 133 as an example (there are of course other places that technique is used)


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp:119
+       "absl::StrSplit()/ByAnyChar()/MaxSplits() called with a string literal "
+       "consisting of a single character; consider using the more efficient "
+       "overload accepting a character")
----------------
This diagnostic is really long, maybe you can shorten it a bit?

E.g. `consider using character overload` for the second part
and `.. called with single character string literal;`

My diagnostics are usually not so good, maybe you come up with something better :)


================
Comment at: clang-tidy/abseil/FasterStrsplitDelimiterCheck.h:20
+/// Finds instances of absl::StrSplit() or absl::MaxSplits() where the delimiter
+/// is a single character string literal and replaces with a character.
+///
----------------
s/replaces with/replaces it with/


================
Comment at: docs/ReleaseNotes.rst:63
+
+  Finds instances of absl::StrSplit() or absl::MaxSplits() where the delimiter
+  is a single character string literal and replaces with a character.
----------------
Please highlight code with two `


================
Comment at: docs/clang-tidy/checks/abseil-faster-strsplit-delimiter.rst:8
+where the delimiter is a single character string literal. The check will offer
+a suggestion to change the string literal into a character. It will also catch
+when code uses ``absl::ByAnyChar()`` for just a single character and will
----------------
I think:
It will also catch code using ...

sounds a little better


================
Comment at: test/clang-tidy/abseil-faster-strsplit-delimiter.cpp:42
+void SplitDelimiters() {
+  absl::StrSplit("ABC", "A");
+  // CHECK-MESSAGES: [[@LINE-1]]:25: warning: absl::StrSplit()/ByAnyChar()/MaxSplits() called with a string literal consisting of a single character; consider using the more efficient overload accepting a character [abseil-faster-strsplit-delimiter]
----------------
Please add a test, where `"A"` is used as an arbitray function argument (similar to the template case, but without templates involved)


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D50862





More information about the cfe-commits mailing list