summaryrefslogtreecommitdiffstats
path: root/clang/lib/Format/Format.cpp
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2013-07-16 21:06:13 +0000
committerAlexander Kornienko <alexfh@google.com>2013-07-16 21:06:13 +0000
commit657c67b164b9c364ba2f2ab01541ebe41d7a4807 (patch)
tree12eaa917fca1a0b422c0ba231fcd257469b929f0 /clang/lib/Format/Format.cpp
parent8369aa5e12b6c5a0285c3e672e680e58be1d779c (diff)
downloadbcm5719-llvm-657c67b164b9c364ba2f2ab01541ebe41d7a4807.tar.gz
bcm5719-llvm-657c67b164b9c364ba2f2ab01541ebe41d7a4807.zip
Don't break line comments with escaped newlines.
Summary: These can appear when comments contain command lines with quoted line breaks. As the text (including escaped newlines and '//' from consecutive lines) is a single line comment, we used to break it even when it didn't exceed column limit. This is a temporary solution, in the future we may want to support this case completely - at least adjust leading whitespace when changing indentation of the first line. Reviewers: djasper Reviewed By: djasper CC: cfe-commits, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D1146 llvm-svn: 186456
Diffstat (limited to 'clang/lib/Format/Format.cpp')
-rw-r--r--clang/lib/Format/Format.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index c6927ecbe26..11ab58c18cd 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -905,6 +905,11 @@ private:
// Only break up default narrow strings.
if (!Current.TokenText.startswith("\""))
return 0;
+ // Don't break string literals with escaped newlines. As clang-format must
+ // not change the string's content, it is unlikely that we'll end up with
+ // a better format.
+ if (Current.TokenText.find("\\\n") != StringRef::npos)
+ return 0;
// Exempts unterminated string literals from line breaking. The user will
// likely want to terminate the string before any line breaking is done.
if (Current.IsUnterminatedLiteral)
@@ -919,6 +924,23 @@ private:
} else if (Current.Type == TT_LineComment &&
(Current.Previous == NULL ||
Current.Previous->Type != TT_ImplicitStringLiteral)) {
+ // Don't break line comments with escaped newlines. These look like
+ // separate line comments, but in fact contain a single line comment with
+ // multiple lines including leading whitespace and the '//' markers.
+ //
+ // FIXME: If we want to handle them correctly, we'll need to adjust
+ // leading whitespace in consecutive lines when changing indentation of
+ // the first line similar to what we do with block comments.
+ StringRef::size_type EscapedNewlinePos = Current.TokenText.find("\\\n");
+ if (EscapedNewlinePos != StringRef::npos) {
+ State.Column =
+ StartColumn +
+ encoding::getCodePointCount(
+ Current.TokenText.substr(0, EscapedNewlinePos), Encoding) +
+ 1;
+ return 0;
+ }
+
Token.reset(new BreakableLineComment(Current, StartColumn,
Line.InPPDirective, Encoding));
} else {
OpenPOWER on IntegriCloud