r209410 - clang-format: Correctly calculate line lenghts for nest blocks.
Daniel Jasper
djasper at google.com
Thu May 22 01:36:54 PDT 2014
Author: djasper
Date: Thu May 22 03:36:53 2014
New Revision: 209410
URL: http://llvm.org/viewvc/llvm-project?rev=209410&view=rev
Log:
clang-format: Correctly calculate line lenghts for nest blocks.
If simple (one-statement) blocks can be inlined, the length needs to be
calculated correctly.
Before (in JavaScript but this also affects lambdas, etc.):
var x = {
valueOf: function() { return 1; }
};
After:
var x = {valueOf: function() { return 1; }};
Modified:
cfe/trunk/lib/Format/Format.cpp
cfe/trunk/lib/Format/TokenAnnotator.cpp
cfe/trunk/unittests/Format/FormatTest.cpp
cfe/trunk/unittests/Format/FormatTestJS.cpp
Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=209410&r1=209409&r2=209410&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Thu May 22 03:36:53 2014
@@ -828,8 +828,10 @@ public:
if (TheLine.Last->TotalLength + Indent <= ColumnLimit) {
LineState State = Indenter->getInitialState(Indent, &TheLine, DryRun);
- while (State.NextToken)
+ while (State.NextToken) {
+ formatChildren(State, /*Newline=*/false, /*DryRun=*/false, Penalty);
Indenter->addTokenToState(State, /*Newline=*/false, DryRun);
+ }
} else if (Style.ColumnLimit == 0) {
// FIXME: Implement nested blocks for ColumnLimit = 0.
NoColumnLimitFormatter Formatter(Indenter);
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=209410&r1=209409&r2=209410&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Thu May 22 03:36:53 2014
@@ -1178,6 +1178,12 @@ void TokenAnnotator::annotate(AnnotatedL
}
void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) {
+ for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(),
+ E = Line.Children.end();
+ I != E; ++I) {
+ calculateFormattingInformation(**I);
+ }
+
Line.First->TotalLength =
Line.First->IsMultiline ? Style.ColumnLimit : Line.First->ColumnWidth;
if (!Line.First->Next)
@@ -1222,12 +1228,18 @@ void TokenAnnotator::calculateFormatting
Current->CanBreakBefore =
Current->MustBreakBefore || canBreakBefore(Line, *Current);
- if (Current->MustBreakBefore || !Current->Children.empty() ||
+ unsigned ChildSize = 0;
+ if (Current->Previous->Children.size() == 1) {
+ FormatToken &LastOfChild = *Current->Previous->Children[0]->Last;
+ ChildSize = LastOfChild.isTrailingComment() ? Style.ColumnLimit
+ : LastOfChild.TotalLength + 1;
+ }
+ if (Current->MustBreakBefore || Current->Previous->Children.size() > 1 ||
Current->IsMultiline)
Current->TotalLength = Current->Previous->TotalLength + Style.ColumnLimit;
else
Current->TotalLength = Current->Previous->TotalLength +
- Current->ColumnWidth +
+ Current->ColumnWidth + ChildSize +
Current->SpacesRequiredBefore;
if (Current->Type == TT_CtorInitializerColon)
@@ -1249,12 +1261,6 @@ void TokenAnnotator::calculateFormatting
}
DEBUG({ printDebugInfo(Line); });
-
- for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(),
- E = Line.Children.end();
- I != E; ++I) {
- calculateFormattingInformation(**I);
- }
}
void TokenAnnotator::calculateUnbreakableTailLengths(AnnotatedLine &Line) {
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=209410&r1=209409&r2=209410&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Thu May 22 03:36:53 2014
@@ -8586,21 +8586,11 @@ TEST_F(FormatTest, FormatsWithWebKitStyl
}
TEST_F(FormatTest, FormatsLambdas) {
- verifyFormat("int c = [b]() mutable {\n"
- " return [&b] { return b++; }();\n"
- "}();\n");
- verifyFormat("int c = [&] {\n"
- " [=] { return b++; }();\n"
- "}();\n");
- verifyFormat("int c = [&, &a, a] {\n"
- " [=, c, &d] { return b++; }();\n"
- "}();\n");
- verifyFormat("int c = [&a, &a, a] {\n"
- " [=, a, b, &c] { return b++; }();\n"
- "}();\n");
- verifyFormat("auto c = {[&a, &a, a] {\n"
- " [=, a, b, &c] { return b++; }();\n"
- "}}\n");
+ verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
+ verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
+ verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
+ verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
+ verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
verifyFormat("void f() {\n"
" other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
@@ -8676,7 +8666,7 @@ TEST_F(FormatTest, FormatsBlocks) {
verifyFormat("int a = [operation block:^int(int *i) { return 1; }];");
verifyFormat("[myObject doSomethingWith:arg1\n"
" aaa:^int(int *a) { return 1; }\n"
- " bbb:f(a * b)];");
+ " bbb:f(a * bbbbbbbb)];");
verifyFormat("[operation setCompletionBlock:^{\n"
" [self.delegate newDataAvailable];\n"
Modified: cfe/trunk/unittests/Format/FormatTestJS.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTestJS.cpp?rev=209410&r1=209409&r2=209410&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTestJS.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTestJS.cpp Thu May 22 03:36:53 2014
@@ -137,6 +137,13 @@ TEST_F(FormatTestJS, Closures) {
" foo();\n"
" bar();\n"
"}, this);");
+
+ verifyFormat("var x = {a: function() { return 1; }};",
+ getGoogleJSStyleWithColumns(38));
+ verifyFormat("var x = {\n"
+ " a: function() { return 1; }\n"
+ "};",
+ getGoogleJSStyleWithColumns(37));
}
TEST_F(FormatTestJS, ReturnStatements) {
More information about the cfe-commits
mailing list