alexfh added inline comments.

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:27
@@ +26,3 @@
+  // we only transform ASCII string literals
+  if (!Literal->isAscii())
+    return false;
----------------
Why can't the check convert non-ascii string literals to corresponding raw 
string literals?

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:57
@@ +56,3 @@
+
+  // already a raw string literal if R comes before "
+  if (Text.find_first_of("R") < Text.find_first_of(R"(")"))
----------------
nit: Capitalization, punctuation. Same for other comments in the file.

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:58
@@ +57,3 @@
+  // already a raw string literal if R comes before "
+  if (Text.find_first_of("R") < Text.find_first_of(R"(")"))
+    return false;
----------------
aaron.ballman wrote:
> I think it might make more sense to block on D16012 (which will hopefully be 
> reviewed relatively soon), and then just use the StringLiteral object to 
> specify whether it's a raw string literal or not.
Also, why `find_first_of` instead of just `find(char)`? It will allow you to 
get rid of the `R"(")"` awfulness ;)

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:61
@@ +60,3 @@
+
+  const bool HasBackSlash = Text.find(R"(\\)") != StringRef::npos;
+  const bool HasNewLine = Text.find(R"(\n)") != StringRef::npos;
----------------
I'd remove these variables and either just combine all these to a single 
condition (which would make the code benefit from short-circuiting) or just use 
a regular expression, which can be more effective than N lookups in a row (not 
sure for which N though). Another benefit of the regular expression is 
reduction of the number of `R"(`s in the code: `R"(\\[n'"?\\])"` ;).

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:77
@@ +76,3 @@
+  std::string Delimiter;
+  for (int Counter = 0; containsDelimiter(Bytes, Delimiter); ++Counter) {
+    if (Counter == 0) {
----------------
Why don't you try an empty delimiter? It will cover a majority of cases.

Also, even though the function is used only when generating fix-it hints, it 
still should be more effective than it is now. Most of the heap allocations and 
copies caused by the usage of std::ostringstream, std::string and 
std::string::operator+ can be avoided, e.g. like this:

  static const StringRef Delimiters[2][] =
    {{"", "R\"(", ")\""}, {"lit", "R\"lit(", ")lit\""}, {"str", "R\"str(", 
")str\""},
    /* add more different ones to make it unlikely to meet all of these in a 
single literal in the wild */};
  for (const auto &Delim : Delimiters) {
    if (Bytes.find(Delim[2]) != StringRef::npos)
      return (Delim[1] + Bytes + Delim[2]).str();
  }
  // Give up gracefully on literals having all our delimiters.

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:107
@@ +106,3 @@
+  if (const auto *Literal = Result.Nodes.getNodeAs<StringLiteral>("lit"))
+    preferRawStringLiterals(Result, Literal);
+}
----------------
I don't see a reason to have a separate function, I'd just inline it here.

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:113
@@ +112,3 @@
+  if (containsEscapedCharacters(Result, Literal)) {
+    SourceRange ReplacementRange = Literal->getSourceRange();
+    CharSourceRange CharRange = Lexer::makeFileCharRange(
----------------
I'd just use the expression instead of the variable.

================
Comment at: clang-tidy/modernize/RawStringLiteralCheck.cpp:117
@@ +116,3 @@
+        Result.Context->getLangOpts());
+    StringRef Replacement = asRawStringLiteral(Literal);
+    diag(Literal->getLocStart(),
----------------
`Replacement` will point to deleted memory right after this line.


http://reviews.llvm.org/D16529



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to