Put simple preprocessor directives on a single line.

Before: #define A  \
          A
After:  #define A A
llvm-svn: 172423
This commit is contained in:
Daniel Jasper 2013-01-14 15:40:57 +00:00
parent 99d91289b6
commit 39825eaff5
2 changed files with 30 additions and 10 deletions

View File

@ -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<AnnotatedLine>::iterator &I,
std::vector<AnnotatedLine>::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<AnnotatedLine>::iterator &I,
std::vector<AnnotatedLine>::iterator E,
unsigned Limit) {

View File

@ -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"