summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2013-04-03 12:38:53 +0000
committerAlexander Kornienko <alexfh@google.com>2013-04-03 12:38:53 +0000
commitb1be9d6e7437ccf921ae6bfb273dc10cb92cb48c (patch)
tree4d05f5fdff65cdde925fb0f1e353d7a5dd388277
parent5816ca117b87d20047ebb108a1aebbf654524921 (diff)
downloadbcm5719-llvm-b1be9d6e7437ccf921ae6bfb273dc10cb92cb48c.tar.gz
bcm5719-llvm-b1be9d6e7437ccf921ae6bfb273dc10cb92cb48c.zip
Even better way to handle comments adjacent to preprocessor directives.
Summary: It turns out that we don't need to store CommentsBeforeNextToken in the line state, but rather flush them before we start parsing preprocessor directives. This fixes wrong comment indentation in code blocks in macro calls (the test is included). Reviewers: klimek Reviewed By: klimek CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D617 llvm-svn: 178638
-rw-r--r--clang/lib/Format/UnwrappedLineParser.cpp7
-rw-r--r--clang/unittests/Format/FormatTest.cpp8
2 files changed, 12 insertions, 3 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index d218f88e551..89a391bd192 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -100,7 +100,6 @@ public:
Parser.Line.reset(new UnwrappedLine());
Parser.Line->Level = PreBlockLine->Level;
Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
- Parser.CommentsBeforeNextToken.swap(CommentsBeforeNextToken);
}
~ScopedLineState() {
@@ -112,7 +111,6 @@ public:
Parser.MustBreakBeforeNextToken = true;
if (SwitchToPreprocessorLines)
Parser.CurrentLines = &Parser.Lines;
- Parser.CommentsBeforeNextToken.swap(CommentsBeforeNextToken);
}
private:
@@ -120,7 +118,6 @@ private:
const bool SwitchToPreprocessorLines;
UnwrappedLine *PreBlockLine;
- SmallVector<FormatToken, 1> CommentsBeforeNextToken;
};
UnwrappedLineParser::UnwrappedLineParser(
@@ -830,6 +827,10 @@ void UnwrappedLineParser::readToken() {
bool SwitchToPreprocessorLines =
!Line->Tokens.empty() && CurrentLines == &Lines;
ScopedLineState BlockState(*this, SwitchToPreprocessorLines);
+ // Comments stored before the preprocessor directive need to be output
+ // before the preprocessor directive, at the same level as the
+ // preprocessor directive, as we consider them to apply to the directive.
+ flushComments(FormatTok.NewlinesBefore > 0);
parsePPDirective();
}
if (!FormatTok.Tok.is(tok::comment))
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 3f26b0a4821..92a2363bbdb 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -592,6 +592,14 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) {
verifyGoogleFormat(
"aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
" aaaaaaaaaaaaaaaaaaaaaa); // 81 cols with this comment");
+ EXPECT_EQ("D(a, {\n"
+ " // test\n"
+ " int a;\n"
+ "});",
+ format("D(a, {\n"
+ "// test\n"
+ "int a;\n"
+ "});"));
}
TEST_F(FormatTest, CanFormatCommentsLocally) {
OpenPOWER on IntegriCloud