diff options
author | Daniel Jasper <djasper@google.com> | 2013-01-28 13:21:16 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-01-28 13:21:16 +0000 |
commit | 3b9a8fc5bee5434bebc9058646896423adac625b (patch) | |
tree | cdd279c39783db887030aab7d65f8d56485d91b5 /lib/Format/Format.cpp | |
parent | bfe6fd4f00257b113ea3bcb4efef8d9f9f245882 (diff) |
Initial support for formatting range-based for-loops.
Before (in good cases):
for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}
for (auto aaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa,
aaaa)) {}
After:
for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}
for (auto aaaaaaaaaaaaaaaaaaaa :
aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa, aaaa)) {}
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173684 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Format/Format.cpp')
-rw-r--r-- | lib/Format/Format.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 85f2c32a98..a6a53f48fd 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -40,6 +40,7 @@ enum TokenType { TT_CastRParen, TT_ConditionalExpr, TT_CtorInitializerColon, + TT_RangeBasedForLoopColon, TT_ImplicitStringLiteral, TT_LineComment, TT_ObjCBlockLParen, @@ -562,7 +563,8 @@ 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) && Previous.is(tok::comma)) { + } else if (RootToken.is(tok::kw_for) && ParenLevel == 1 && + Previous.is(tok::comma)) { State.Column = State.ForLoopVariablePos; } else if (State.NextToken->Parent->ClosesTemplateDeclaration) { State.Column = State.Stack[ParenLevel].Indent - 4; @@ -713,6 +715,9 @@ private: if (Left.is(tok::coloncolon)) return 500; + if (Left.Type == TT_RangeBasedForLoopColon) + return 5; + // In for-loops, prefer breaking at ',' and ';'. if (RootToken.is(tok::kw_for) && (Left.isNot(tok::comma) && Left.isNot(tok::semi))) @@ -869,7 +874,7 @@ public: public: AnnotatingParser(AnnotatedToken &RootToken) : CurrentToken(&RootToken), KeywordVirtualFound(false), - ColonIsObjCMethodExpr(false) {} + ColonIsObjCMethodExpr(false), ColonIsForRangeExpr(false) {} /// \brief A helper class to manage AnnotatingParser::ColonIsObjCMethodExpr. struct ObjCSelectorRAII { @@ -1077,8 +1082,10 @@ public: // Colons from ?: are handled in parseConditional(). if (Tok->Parent->is(tok::r_paren)) Tok->Type = TT_CtorInitializerColon; - if (ColonIsObjCMethodExpr) + else if (ColonIsObjCMethodExpr) Tok->Type = TT_ObjCMethodExpr; + else if (ColonIsForRangeExpr) + Tok->Type = TT_RangeBasedForLoopColon; break; case tok::kw_if: case tok::kw_while: @@ -1088,6 +1095,12 @@ public: return false; } break; + case tok::kw_for: + ColonIsForRangeExpr = true; + next(); + if (!parseParens()) + return false; + break; case tok::l_paren: if (!parseParens()) return false; @@ -1238,6 +1251,7 @@ public: AnnotatedToken *CurrentToken; bool KeywordVirtualFound; bool ColonIsObjCMethodExpr; + bool ColonIsForRangeExpr; }; void calculateExtraInformation(AnnotatedToken &Current) { @@ -1599,6 +1613,8 @@ private: return true; if (Right.Type == TT_ConditionalExpr || Right.is(tok::question)) return true; + if (Left.Type == TT_RangeBasedForLoopColon) + return true; if (Left.Type == TT_PointerOrReference || Left.Type == TT_TemplateCloser || Left.Type == TT_UnaryOperator || Left.Type == TT_ConditionalExpr || Left.is(tok::question)) |