From 9fdc00a237fe19b892f22780321ddfd1a3691d61 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Thu, 28 Mar 2013 18:40:55 +0000 Subject: [PATCH] Fixed handling of comments before preprocessor directives. Comments before preprocessor directives used to be stored with InPPDirective flag set, which prevented correct comment splitting in this case. Fixed by flushing comments before switching on InPPDirective. Added a new test and fixed one of the existing tests. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178261 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/UnwrappedLineParser.cpp | 1 + unittests/Format/FormatTest.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 8408ce3a0d..b24d5141e0 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -822,6 +822,7 @@ void UnwrappedLineParser::readToken() { while (!Line->InPPDirective && FormatTok.Tok.is(tok::hash) && ((FormatTok.NewlinesBefore > 0 && FormatTok.HasUnescapedNewline) || FormatTok.IsFirst)) { + flushComments(FormatTok.NewlinesBefore > 0); // If there is an unfinished unwrapped line, we flush the preprocessor // directives only after that unwrapped line was finished later. bool SwitchToPreprocessorLines = diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 7fbb9f3ac4..83c7a2adbf 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -699,6 +699,13 @@ TEST_F(FormatTest, SplitsLongCxxComments) { "//Don't add leading\n" "//whitespace", format("//Don't add leading whitespace", getLLVMStyleWithColumns(20))); + EXPECT_EQ("// A comment before\n" + "// a macro\n" + "// definition\n" + "#define a b", + format("// A comment before a macro definition\n" + "#define a b", + getLLVMStyleWithColumns(20))); } TEST_F(FormatTest, SplitsLongLinesInComments) { @@ -1203,13 +1210,13 @@ TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { } TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { - EXPECT_EQ("// some comment\n" + EXPECT_EQ("// somecomment\n" "#include \"a.h\"\n" "#define A( \\\n" " A, B)\n" "#include \"b.h\"\n" "// somecomment\n", - format(" // some comment\n" + format(" // somecomment\n" " #include \"a.h\"\n" "#define A(A,\\\n" " B)\n"