summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2014-05-22 08:36:53 +0000
committerDaniel Jasper <djasper@google.com>2014-05-22 08:36:53 +0000
commit5f3ea477cf3b48710a5ef839624606311f0c4ab7 (patch)
treecc197a160a9f1eabd3b911f487212cf6cdd04829 /clang
parent0f6272271e77b3b2b6325141c9798aed6ac966b8 (diff)
downloadbcm5719-llvm-5f3ea477cf3b48710a5ef839624606311f0c4ab7.tar.gz
bcm5719-llvm-5f3ea477cf3b48710a5ef839624606311f0c4ab7.zip
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; }}; llvm-svn: 209410
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Format/Format.cpp4
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp22
-rw-r--r--clang/unittests/Format/FormatTest.cpp22
-rw-r--r--clang/unittests/Format/FormatTestJS.cpp7
4 files changed, 30 insertions, 25 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 891a7188bba..03177e586ad 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -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);
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 47ecd6a4dc3..dca20d2d75d 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1178,6 +1178,12 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) {
}
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::calculateFormattingInformation(AnnotatedLine &Line) {
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::calculateFormattingInformation(AnnotatedLine &Line) {
}
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) {
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index cff851c4f77..3dbada81f01 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -8586,21 +8586,11 @@ TEST_F(FormatTest, FormatsWithWebKitStyle) {
}
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"
diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp
index 2aac89eac88..33bfe06e5f1 100644
--- a/clang/unittests/Format/FormatTestJS.cpp
+++ b/clang/unittests/Format/FormatTestJS.cpp
@@ -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) {
OpenPOWER on IntegriCloud