зеркало из https://github.com/microsoft/clang-1.git
Initial support for multiple variable declarations.
Before: SomeType aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(), aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa(); After: SomeType aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(), aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa(); git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173792 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
98f988dc1b
Коммит
2e60377273
|
@ -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))
|
||||
|
|
|
@ -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];");
|
||||
|
|
Загрузка…
Ссылка в новой задаче