From e0b15ea7edeceb41decddfeabaf6fac935ed7baf Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Mon, 14 Jan 2013 15:40:57 +0000 Subject: [PATCH] Put simple preprocessor directives on a single line. Before: #define A \ A After: #define A A git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172423 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/Format.cpp | 16 ++++++++++++++++ unittests/Format/FormatTest.cpp | 24 ++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index ceeb5d0428..c8dc7bf55c 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -185,6 +185,7 @@ static void replacePPWhitespace( static bool fitsIntoLimit(const AnnotatedToken &RootToken, unsigned Limit, unsigned *Length = 0) { unsigned Columns = RootToken.FormatTok.TokenLength; + if (Columns > Limit) return false; const AnnotatedToken *Tok = &RootToken; while (!Tok->Children.empty()) { Tok = &Tok->Children[0]; @@ -1415,10 +1416,25 @@ private: tryMergeSimpleBlock(I, E, Limit); } else if (I->First.is(tok::kw_if)) { tryMergeSimpleIf(I, E, Limit); + } else if (I->InPPDirective && (I->First.FormatTok.HasUnescapedNewline || + I->First.FormatTok.IsFirst)) { + tryMergeSimplePPDirective(I, E, Limit); } return true; } + void tryMergeSimplePPDirective(std::vector::iterator &I, + std::vector::iterator E, + unsigned Limit) { + AnnotatedLine &Line = *I; + if (!(I + 1)->InPPDirective) return; + if (I + 2 != E && (I + 2)->InPPDirective && + !(I + 2)->First.FormatTok.HasUnescapedNewline) + return; + if (!fitsIntoLimit((I + 1)->First, Limit)) return; + join(Line, *(++I)); + } + void tryMergeSimpleIf(std::vector::iterator &I, std::vector::iterator E, unsigned Limit) { diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index e5279c442f..c088089211 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -50,8 +50,8 @@ protected: if (JustReplacedNewline) MessedUp[i - 1] = '\n'; InComment = true; - } else if (MessedUp[i] == '#' && JustReplacedNewline) { - MessedUp[i - 1] = '\n'; + } else if (MessedUp[i] == '#' && (JustReplacedNewline || i == 0)) { + if (i != 0) MessedUp[i - 1] = '\n'; InPreprocessorDirective = true; } else if (MessedUp[i] == '\\' && MessedUp[i + 1] == '\n') { MessedUp[i] = ' '; @@ -469,7 +469,7 @@ TEST_F(FormatTest, BreaksOnHashWhenDirectiveIsInvalid) { TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { EXPECT_EQ("#line 42 \"test\"\n", format("# \\\n line \\\n 42 \\\n \"test\"\n")); - EXPECT_EQ("#define A \\\n B\n", + EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", getLLVMStyleWithColumns(12))); } @@ -477,9 +477,8 @@ TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { TEST_F(FormatTest, EndOfFileEndsPPDirective) { EXPECT_EQ("#line 42 \"test\"", format("# \\\n line \\\n 42 \\\n \"test\"")); - EXPECT_EQ("#define A \\\n B", - format("# \\\n define \\\n A \\\n B", - getLLVMStyleWithColumns(12))); + EXPECT_EQ("#define A B", + format("# \\\n define \\\n A \\\n B")); } TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { @@ -491,6 +490,13 @@ TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { verifyFormat("#define A( \\\n B)", getLLVMStyleWithColumns(12)); verifyFormat("#define AA(\\\n B)", getLLVMStyleWithColumns(12)); verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); + + verifyFormat("#define A A\n#define A A"); + verifyFormat("#define A(X) A\n#define A A"); + + verifyFormat("#define Something Other", getLLVMStyleWithColumns(24)); + verifyFormat("#define Something \\\n" + " Other", getLLVMStyleWithColumns(23)); } TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { @@ -548,8 +554,7 @@ TEST_F(FormatTest, HashInMacroDefinition) { verifyFormat("#define A(a, b, c) \\\n" " void a##b##c()", getLLVMStyleWithColumns(22)); - verifyFormat("#define A \\\n" - " void # ## #", getLLVMStyleWithColumns(22)); + verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); } TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) { @@ -605,8 +610,7 @@ TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { "functionCallTo(someOtherFunction(\n" " withSomeParameters, whichInSequence,\n" " areLongerThanALine(andAnotherCall,\n" - "#define A \\\n" - " B\n" + "#define A B\n" " withMoreParamters,\n" " whichStronglyInfluenceTheLayout),\n" " andMoreParameters),\n" -- 2.40.0