forked from OSchip/llvm-project
[clang-format/ObjC] Improve split priorities for ObjC methods
Reduce penalty for aligning ObjC method arguments using the colon alignment as this is the canonical way. Trying to fit a whole expression into one line should not force other line breaks (e.g. when ObjC method expression is a part of other expression). llvm-svn: 336520
This commit is contained in:
parent
e7c4b5901e
commit
6b475b730b
|
@ -248,6 +248,11 @@ struct FormatToken {
|
||||||
/// selector consist of.
|
/// selector consist of.
|
||||||
unsigned ObjCSelectorNameParts = 0;
|
unsigned ObjCSelectorNameParts = 0;
|
||||||
|
|
||||||
|
/// The 0-based index of the parameter/argument. For ObjC it is set
|
||||||
|
/// for the selector name token.
|
||||||
|
/// For now calculated only for ObjC.
|
||||||
|
unsigned ParameterIndex = 0;
|
||||||
|
|
||||||
/// Stores the number of required fake parentheses and the
|
/// Stores the number of required fake parentheses and the
|
||||||
/// corresponding operator precedence.
|
/// corresponding operator precedence.
|
||||||
///
|
///
|
||||||
|
|
|
@ -725,6 +725,8 @@ private:
|
||||||
Contexts.back().LongestObjCSelectorName)
|
Contexts.back().LongestObjCSelectorName)
|
||||||
Contexts.back().LongestObjCSelectorName =
|
Contexts.back().LongestObjCSelectorName =
|
||||||
Tok->Previous->ColumnWidth;
|
Tok->Previous->ColumnWidth;
|
||||||
|
Tok->Previous->ParameterIndex =
|
||||||
|
Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
|
||||||
++Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
|
++Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
|
||||||
}
|
}
|
||||||
} else if (Contexts.back().ColonIsForRangeExpr) {
|
} else if (Contexts.back().ColonIsForRangeExpr) {
|
||||||
|
@ -2142,8 +2144,20 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) {
|
||||||
// FIXME: Only calculate this if CanBreakBefore is true once static
|
// FIXME: Only calculate this if CanBreakBefore is true once static
|
||||||
// initializers etc. are sorted out.
|
// initializers etc. are sorted out.
|
||||||
// FIXME: Move magic numbers to a better place.
|
// FIXME: Move magic numbers to a better place.
|
||||||
Current->SplitPenalty = 20 * Current->BindingStrength +
|
|
||||||
splitPenalty(Line, *Current, InFunctionDecl);
|
// Reduce penalty for aligning ObjC method arguments using the colon
|
||||||
|
// alignment as this is the canonical way (still prefer fitting everything
|
||||||
|
// into one line if possible). Trying to fit a whole expression into one
|
||||||
|
// line should not force other line breaks (e.g. when ObjC method
|
||||||
|
// expression is a part of other expression).
|
||||||
|
Current->SplitPenalty = splitPenalty(Line, *Current, InFunctionDecl);
|
||||||
|
if (Style.Language == FormatStyle::LK_ObjC &&
|
||||||
|
Current->is(TT_SelectorName) && Current->ParameterIndex > 0) {
|
||||||
|
if (Current->ParameterIndex == 1)
|
||||||
|
Current->SplitPenalty += 5 * Current->BindingStrength;
|
||||||
|
} else {
|
||||||
|
Current->SplitPenalty += 20 * Current->BindingStrength;
|
||||||
|
}
|
||||||
|
|
||||||
Current = Current->Next;
|
Current = Current->Next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -678,6 +678,18 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
|
||||||
verifyFormat("[(id)foo bar:(id) ? baz : quux];");
|
verifyFormat("[(id)foo bar:(id) ? baz : quux];");
|
||||||
verifyFormat("4 > 4 ? (id)a : (id)baz;");
|
verifyFormat("4 > 4 ? (id)a : (id)baz;");
|
||||||
|
|
||||||
|
unsigned PreviousColumnLimit = Style.ColumnLimit;
|
||||||
|
Style.ColumnLimit = 50;
|
||||||
|
// Instead of:
|
||||||
|
// bool a =
|
||||||
|
// ([object a:42] == 0 || [object a:42
|
||||||
|
// b:42] == 0);
|
||||||
|
verifyFormat("bool a = ([object a:42] == 0 ||\n"
|
||||||
|
" [object a:42 b:42] == 0);");
|
||||||
|
Style.ColumnLimit = PreviousColumnLimit;
|
||||||
|
verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
|
||||||
|
" [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
|
||||||
|
|
||||||
// This tests that the formatter doesn't break after "backing" but before ":",
|
// This tests that the formatter doesn't break after "backing" but before ":",
|
||||||
// which would be at 80 columns.
|
// which would be at 80 columns.
|
||||||
verifyFormat(
|
verifyFormat(
|
||||||
|
@ -754,11 +766,10 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
|
||||||
"[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
|
"[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
|
||||||
" aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
|
" aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
|
||||||
" aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
|
" aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
|
||||||
|
|
||||||
verifyFormat("[self // break\n"
|
verifyFormat("[self // break\n"
|
||||||
" a:a\n"
|
" a:a\n"
|
||||||
" aaa:aaa];");
|
" aaa:aaa];");
|
||||||
verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
|
|
||||||
" [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
|
|
||||||
|
|
||||||
// Formats pair-parameters.
|
// Formats pair-parameters.
|
||||||
verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
|
verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
|
||||||
|
@ -803,6 +814,12 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
|
||||||
verifyFormat("[((Foo *)foo) bar];");
|
verifyFormat("[((Foo *)foo) bar];");
|
||||||
verifyFormat("[((Foo *)foo) bar:1 blech:2];");
|
verifyFormat("[((Foo *)foo) bar:1 blech:2];");
|
||||||
|
|
||||||
|
Style.ColumnLimit = 20;
|
||||||
|
verifyFormat("aaaaa = [a aa:aa\n"
|
||||||
|
" aa:aa];");
|
||||||
|
verifyFormat("aaaaaa = [aa aa:aa\n"
|
||||||
|
" aa:aa];");
|
||||||
|
|
||||||
Style.ColumnLimit = 70;
|
Style.ColumnLimit = 70;
|
||||||
verifyFormat(
|
verifyFormat(
|
||||||
"void f() {\n"
|
"void f() {\n"
|
||||||
|
|
Loading…
Reference in New Issue