Improve formatting of #defines.
Two improvements:
1) Always leave at least one space before "\". Otherwise is can look bad
and there is a risk of unwillingly joining to characters to a different
token.
2) Use the full column limit for single-line #defines.
Fixes llvm.org/PR15148
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176245 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 18a853f..4aaae84 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -273,7 +273,7 @@
///
/// \returns The column after the last token in the last line of the
/// \c UnwrappedLine.
- unsigned format() {
+ unsigned format(const AnnotatedLine *NextLine) {
// Initialize state dependent on indent.
LineState State;
State.Column = FirstIndent;
@@ -295,7 +295,11 @@
moveStateToNextToken(State, /*DryRun=*/ false);
// If everything fits on a single line, just put it there.
- if (Line.Last->TotalLength <= getColumnLimit() - FirstIndent) {
+ unsigned ColumnLimit = Style.ColumnLimit;
+ if (NextLine && NextLine->InPPDirective &&
+ !NextLine->First.FormatTok.HasUnescapedNewline)
+ ColumnLimit = getColumnLimit();
+ if (Line.Last->TotalLength <= ColumnLimit - FirstIndent) {
while (State.NextToken != NULL) {
addTokenToState(false, false, State);
}
@@ -749,7 +753,7 @@
}
unsigned getColumnLimit() {
- return Style.ColumnLimit - (Line.InPPDirective ? 1 : 0);
+ return Style.ColumnLimit - (Line.InPPDirective ? 2 : 0);
}
/// \brief An edge in the solution space from \c Previous->State to \c State,
@@ -1112,7 +1116,8 @@
UnwrappedLineFormatter Formatter(Style, SourceMgr, TheLine, Indent,
TheLine.First, Whitespaces,
StructuralError);
- PreviousEndOfLineColumn = Formatter.format();
+ PreviousEndOfLineColumn =
+ Formatter.format(I + 1 != E ? &*(I + 1) : NULL);
IndentForLevel[TheLine.Level] = LevelIndent;
PreviousLineWasTouched = true;
} else {
@@ -1192,7 +1197,7 @@
if (I->Last->Type == TT_LineComment)
return;
- unsigned Limit = Style.ColumnLimit - (I->InPPDirective ? 1 : 0) - Indent;
+ unsigned Limit = Style.ColumnLimit - Indent;
// If we already exceed the column limit, we set 'Limit' to 0. The different
// tryMerge..() functions can then decide whether to still do merging.
Limit = I->Last->TotalLength > Limit ? 0 : Limit - I->Last->TotalLength;
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index cc68bcb..98e035a 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -857,29 +857,24 @@
}
TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
- // If the macro fits in one line, we still do not get the full
- // line, as only the next line decides whether we need an escaped newline and
- // thus use the last column.
- verifyFormat("#define A(B)", getLLVMStyleWithColumns(13));
-
- verifyFormat("#define A( \\\n B)", getLLVMStyleWithColumns(12));
- verifyFormat("#define AA(\\\n B)", getLLVMStyleWithColumns(12));
+ verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
+ verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
+ // FIXME: We never break before the macro name.
+ verifyFormat("#define AA(\\\n 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));
+ verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
+ verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
}
TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
EXPECT_EQ("// some comment\n"
"#include \"a.h\"\n"
- "#define A(A,\\\n"
- " B)\n"
+ "#define A( \\\n"
+ " A, B)\n"
"#include \"b.h\"\n"
"// some comment\n",
format(" // some comment\n"