aboutsummaryrefslogtreecommitdiff
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
commit4128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4 (patch)
tree94e40fe83fbce94cd50cf4f433929ef3b2c0f7ae
parent74b9fa16e5d1e1a5f3adb065043db46ad20a4575 (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178638 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Format/UnwrappedLineParser.cpp7
-rw-r--r--unittests/Format/FormatTest.cpp8
2 files changed, 12 insertions, 3 deletions
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index d218f88e55..89a391bd19 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/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/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index 3f26b0a482..92a2363bbd 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/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) {