diff options
author | Daniel Jasper <djasper@google.com> | 2013-02-21 15:00:29 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-02-21 15:00:29 +0000 |
commit | 7d81281fc39f6d40d86be6600adba13c05b4a639 (patch) | |
tree | 59b902e3f6861ec73f781d3547f75bc92a8fddcf /lib/Format/Format.cpp | |
parent | 3aada3c305a0f0ecfad2e4d0cf977ee9d2b2c71f (diff) |
Allow breaking between type and name in for loops.
This fixes llvm.org/PR15033.
Also: Always break before a parameter, if the previous parameter was
split over multiple lines. This was necessary to make the right
decisions in for-loops, almost always makes the code more readable and
also fixes llvm.org/PR14873.
Before:
for (llvm::ArrayRef<NamedDecl *>::iterator I = FD->getDeclsInPrototypeScope()
.begin(), E = FD->getDeclsInPrototypeScope().end();
I != E; ++I) {
}
foo(bar(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,
ccccccccccccccccccccccccccccc), d, bar(e, f));
After:
for (llvm::ArrayRef<NamedDecl *>::iterator
I = FD->getDeclsInPrototypeScope().begin(),
E = FD->getDeclsInPrototypeScope().end();
I != E; ++I) {
}
foo(bar(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,
ccccccccccccccccccccccccccccc),
d, bar(e, f));
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175741 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Format/Format.cpp')
-rw-r--r-- | lib/Format/Format.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 44a91a96ec..2bd5332227 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -258,6 +258,12 @@ private: tooling::Replacements Replaces; }; +static bool isVarDeclName(const AnnotatedToken &Tok) { + return Tok.Parent != NULL && Tok.is(tok::identifier) && + (Tok.Parent->Type == TT_PointerOrReference || + Tok.Parent->is(tok::identifier)); +} + class UnwrappedLineFormatter { public: UnwrappedLineFormatter(const FormatStyle &Style, SourceManager &SourceMgr, @@ -512,7 +518,7 @@ private: State.Stack.back().ColonPos = State.Column + Current.FormatTok.TokenLength; } - } else if (Previous.Type == TT_ObjCMethodExpr) { + } else if (Previous.Type == TT_ObjCMethodExpr || isVarDeclName(Current)) { State.Column = State.Stack.back().Indent + 4; } else { State.Column = State.Stack.back().Indent; @@ -610,7 +616,9 @@ private: (!Style.AllowAllParametersOfDeclarationOnNextLine && Line.MustBeDeclaration)) State.Stack.back().BreakBeforeParameter = true; + } + if (Newline) { // 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) { @@ -634,13 +642,10 @@ private: State.Stack.back().FirstLessLess = State.Column; if (Current.is(tok::question)) State.Stack.back().QuestionColumn = State.Column; - if (Current.Type == TT_CtorInitializerColon && - Style.ConstructorInitializerAllOnOneLineOrOnePerLine) - State.Stack.back().AvoidBinPacking = true; - if (Current.is(tok::l_brace) && Current.MatchingParen != NULL && - !Current.MatchingParen->MustBreakBefore) { - if (getLengthToMatchingParen(Current) + State.Column > getColumnLimit()) - State.Stack.back().BreakBeforeParameter = true; + if (Current.Type == TT_CtorInitializerColon) { + if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine) + State.Stack.back().AvoidBinPacking = true; + State.Stack.back().BreakBeforeParameter = false; } // Insert scopes created by fake parenthesis. @@ -908,7 +913,8 @@ private: if (State.NextToken->Parent->is(tok::comma) && State.Stack.back().BreakBeforeParameter && !isTrailingComment(*State.NextToken) && - State.NextToken->isNot(tok::r_paren)) + State.NextToken->isNot(tok::r_paren) && + State.NextToken->isNot(tok::r_brace)) return true; // FIXME: Comparing LongestObjCSelectorName to 0 is a hacky way of finding // out whether it is the first parameter. Clean this up. |