diff options
| author | Daniel Jasper <djasper@google.com> | 2013-01-29 11:21:01 +0000 |
|---|---|---|
| committer | Daniel Jasper <djasper@google.com> | 2013-01-29 11:21:01 +0000 |
| commit | 38c11ce93d08c57834ca7dc99f3a04558b5068ce (patch) | |
| tree | 3e8bed472ff9b821b7e261fc112204ecd089c716 /clang | |
| parent | 39989dadd3cf3a82602c78a7e9d8ce535ab97017 (diff) | |
| download | bcm5719-llvm-38c11ce93d08c57834ca7dc99f3a04558b5068ce.tar.gz bcm5719-llvm-38c11ce93d08c57834ca7dc99f3a04558b5068ce.zip | |
Initial support for multiple variable declarations.
Before:
SomeType aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),
aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();
After:
SomeType aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),
aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();
llvm-svn: 173792
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Format/Format.cpp | 30 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 18 |
2 files changed, 33 insertions, 15 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 8eebda0740b..b32c7b6524f 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -366,7 +366,7 @@ public: State.Column = FirstIndent; State.NextToken = &RootToken; State.Stack.push_back(ParenState(FirstIndent + 4, FirstIndent)); - State.ForLoopVariablePos = 0; + State.VariablePos = 0; State.LineContainsContinuedForLoopSection = false; DEBUG({ @@ -504,10 +504,10 @@ private: /// \brief The token that needs to be next formatted. const AnnotatedToken *NextToken; - /// \brief The column of the first variable in a for-loop declaration. + /// \brief The column of first variable name in a variable declaration. /// - /// Used to align the second variable if necessary. - unsigned ForLoopVariablePos; + /// Used to align the further variables if necessary. + unsigned VariablePos; /// \brief \c true if this line contains a continued for-loop section. bool LineContainsContinuedForLoopSection; @@ -522,8 +522,8 @@ private: return Other.NextToken > NextToken; if (Other.Column != Column) return Other.Column > Column; - if (Other.ForLoopVariablePos != ForLoopVariablePos) - return Other.ForLoopVariablePos < ForLoopVariablePos; + if (Other.VariablePos != VariablePos) + return Other.VariablePos < VariablePos; if (Other.LineContainsContinuedForLoopSection != LineContainsContinuedForLoopSection) return LineContainsContinuedForLoopSection; @@ -566,9 +566,10 @@ private: State.Stack.back().Indent) + 4; } else if (Current.Type == TT_ConditionalExpr) { State.Column = State.Stack.back().QuestionColumn; - } else if (RootToken.is(tok::kw_for) && ParenLevel == 1 && - Previous.is(tok::comma)) { - State.Column = State.ForLoopVariablePos; + } else if (Previous.is(tok::comma) && State.VariablePos != 0 && + ((RootToken.is(tok::kw_for) && ParenLevel == 1) || + ParenLevel == 0)) { + State.Column = State.VariablePos; } else if (State.NextToken->Parent->ClosesTemplateDeclaration || Current.Type == TT_StartOfName) { State.Column = State.Stack[ParenLevel].Indent - 4; @@ -595,9 +596,9 @@ private: if (Current.is(tok::colon) && Current.Type != TT_ConditionalExpr) State.Stack[ParenLevel].Indent += 2; } else { - if (Current.is(tok::equal) && RootToken.is(tok::kw_for)) - State.ForLoopVariablePos = State.Column - - Previous.FormatTok.TokenLength; + if (Current.is(tok::equal) && + (RootToken.is(tok::kw_for) || ParenLevel == 0)) + State.VariablePos = State.Column - Previous.FormatTok.TokenLength; unsigned Spaces = State.NextToken->SpaceRequiredBefore ? 1 : 0; if (State.NextToken->Type == TT_LineComment) @@ -652,7 +653,7 @@ private: Previous.Type != TT_TemplateOpener) || !Style.AllowAllParametersOnNextLine) State.Stack.back().BreakAfterComma = true; - + // Any break on this level means that the parent level has been broken // and we need to avoid bin packing there. for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) { @@ -1008,7 +1009,7 @@ public: // FIXME: Do we incorrectly label ":" with this? StartsObjCMethodExpr = false; Left->Type = TT_Unknown; - } + } if (StartsObjCMethodExpr) objCSelector.markEnd(*CurrentToken); Left->MatchingParen = CurrentToken; @@ -1223,7 +1224,6 @@ public: return LT_PreprocessorDirective; } while (CurrentToken != NULL) { - if (CurrentToken->is(tok::kw_virtual)) KeywordVirtualFound = true; if (CurrentToken->is(tok::period) || CurrentToken->is(tok::arrow)) diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 63110bbfbe0..f8402c06a97 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1161,6 +1161,24 @@ TEST_F(FormatTest, BreaksConditionalExpressions) { " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); } +TEST_F(FormatTest, DeclarationsOfMultipleVariables) { + verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" + " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); + verifyFormat("bool a = true, b = false;"); + + // FIXME: Indentation looks weird. + verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" + " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); + + // FIXME: This is bad as we hide "d". + verifyFormat( + "bool aaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" + " cccccccccccccccccccccccccccc, d = e && f;"); + +} + TEST_F(FormatTest, ConditionalExpressionsInBrackets) { verifyFormat("arr[foo ? bar : baz];"); verifyFormat("f()[foo ? bar : baz];"); |

