diff options
author | Alexander Kornienko <alexfh@google.com> | 2013-04-03 12:38:53 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2013-04-03 12:38:53 +0000 |
commit | 4128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4 (patch) | |
tree | 94e40fe83fbce94cd50cf4f433929ef3b2c0f7ae /lib/Format | |
parent | 74b9fa16e5d1e1a5f3adb065043db46ad20a4575 (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
Diffstat (limited to 'lib/Format')
-rw-r--r-- | lib/Format/UnwrappedLineParser.cpp | 7 |
1 files changed, 4 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)) |