clang-format: Improve formatting of ObjC dict literals.

Before:
  NSDictionary *d = @{ @"nam" : NSUserNam(), @"dte" : [NSDate date],
                       @"processInfo" : [NSProcessInfo processInfo]
  };

After:
  NSDictionary *d = @{
    @"nam" : NSUserNam(),
    @"dte" : [NSDate date],
    @"processInfo" : [NSProcessInfo processInfo]
  };

llvm-svn: 193049
This commit is contained in:
Daniel Jasper 2013-10-20 16:45:46 +00:00
parent 80b5a9d2d0
commit d489dd342b
2 changed files with 18 additions and 8 deletions

View File

@ -136,6 +136,9 @@ bool ContinuationIndenter::mustBreak(const LineState &State) {
!Previous.isOneOf(tok::kw_return, tok::lessless) &&
Previous.Type != TT_InlineASMColon && NextIsMultilineString(State))
return true;
if (Previous.Type == TT_ObjCDictLiteral && Previous.is(tok::l_brace) &&
getLengthToMatchingParen(Previous) + State.Column > getColumnLimit(State))
return true;
if (!Style.BreakBeforeBinaryOperators) {
// If we need to break somewhere inside the LHS of a binary expression, we
@ -593,11 +596,15 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
// If this '[' opens an ObjC call, determine whether all parameters fit into
// one line and put one per line if they don't.
if (Current.is(tok::l_square) && Current.Type == TT_ObjCMethodExpr &&
if (Current.isOneOf(tok::l_brace, tok::l_square) &&
(Current.Type == TT_ObjCDictLiteral ||
Current.Type == TT_ObjCMethodExpr) &&
Current.MatchingParen != NULL) {
if (getLengthToMatchingParen(Current) + State.Column >
getColumnLimit(State))
getColumnLimit(State)) {
State.Stack.back().BreakBeforeParameter = true;
State.Stack.back().AvoidBinPacking = true;
}
}
// If we encounter a closing ), ], } or >, we can remove a level from our

View File

@ -5363,14 +5363,17 @@ TEST_F(FormatTest, ObjCLiterals) {
verifyFormat(
"NSDictionary *settings = @{ AVEncoderKey : @(AVAudioQualityMax) };");
// FIXME: Nested and multi-line array and dictionary literals need more work.
verifyFormat(
"NSDictionary *d = @{ @\"nam\" : NSUserNam(), @\"dte\" : [NSDate date],\n"
" @\"processInfo\" : [NSProcessInfo processInfo] };");
"NSDictionary *d = @{\n"
" @\"nam\" : NSUserNam(),\n"
" @\"dte\" : [NSDate date],\n"
" @\"processInfo\" : [NSProcessInfo processInfo]\n"
"};");
verifyFormat(
"@{ NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
" regularFont, };");
"@{\n"
" NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
"regularFont,\n"
"};");
}
TEST_F(FormatTest, ReformatRegionAdjustsIndent) {