forked from OSchip/llvm-project
clang-format: Add option to disable alignment after opening brackets
Before: SomeFunction(parameter, parameter); After: SomeFunction(parameter, parameter); Patch by Harry Terkelsen, thank you! llvm-svn: 222284
This commit is contained in:
parent
6761b42b90
commit
3aa9a6a126
|
@ -228,6 +228,16 @@ struct FormatStyle {
|
|||
/// <tt>Foo <Protocol></tt> instead of \c Foo<Protocol>.
|
||||
bool ObjCSpaceBeforeProtocolList;
|
||||
|
||||
/// \brief If \c true, horizontally aligns arguments after an open bracket.
|
||||
///
|
||||
/// This applies to round brackets (parentheses), angle brackets and square
|
||||
/// brackets. This will result in formattings like
|
||||
/// \code
|
||||
/// someLongFunction(argument1,
|
||||
/// argument2);
|
||||
/// \endcode
|
||||
bool AlignAfterOpenBracket;
|
||||
|
||||
/// \brief If \c true, aligns trailing comments.
|
||||
bool AlignTrailingComments;
|
||||
|
||||
|
@ -394,6 +404,7 @@ struct FormatStyle {
|
|||
|
||||
bool operator==(const FormatStyle &R) const {
|
||||
return AccessModifierOffset == R.AccessModifierOffset &&
|
||||
AlignAfterOpenBracket == R.AlignAfterOpenBracket &&
|
||||
AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft &&
|
||||
AlignTrailingComments == R.AlignTrailingComments &&
|
||||
AllowAllParametersOfDeclarationOnNextLine ==
|
||||
|
|
|
@ -300,7 +300,8 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
|
|||
State.Stack.back().ColonPos = State.Column + Spaces + Current.ColumnWidth;
|
||||
}
|
||||
|
||||
if (Previous.opensScope() && Previous.Type != TT_ObjCMethodExpr &&
|
||||
if (Style.AlignAfterOpenBracket &&
|
||||
Previous.opensScope() && Previous.Type != TT_ObjCMethodExpr &&
|
||||
(Current.Type != TT_LineComment || Previous.BlockKind == BK_BracedInit))
|
||||
State.Stack.back().Indent = State.Column + Spaces;
|
||||
if (State.Stack.back().AvoidBinPacking && startsNextParameter(Current, Style))
|
||||
|
@ -735,11 +736,13 @@ void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,
|
|||
ParenState NewParenState = State.Stack.back();
|
||||
NewParenState.ContainsLineBreak = false;
|
||||
|
||||
// Indent from 'LastSpace' unless this the fake parentheses encapsulating a
|
||||
// builder type call after 'return'. If such a call is line-wrapped, we
|
||||
// commonly just want to indent from the start of the line.
|
||||
// Indent from 'LastSpace' unless these are fake parentheses encapsulating
|
||||
// a builder type call after 'return' or, if the alignment after opening
|
||||
// brackets is disabled.
|
||||
if (!Current.isTrailingComment() &&
|
||||
(!Previous || Previous->isNot(tok::kw_return) || *I > 0))
|
||||
(!Previous || Previous->isNot(tok::kw_return) || *I > 0) &&
|
||||
(Style.AlignAfterOpenBracket || *I != prec::Comma ||
|
||||
Current.NestingLevel == 0))
|
||||
NewParenState.Indent =
|
||||
std::max(std::max(State.Column, NewParenState.Indent),
|
||||
State.Stack.back().LastSpace);
|
||||
|
|
|
@ -170,6 +170,7 @@ template <> struct MappingTraits<FormatStyle> {
|
|||
}
|
||||
|
||||
IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);
|
||||
IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket);
|
||||
IO.mapOptional("AlignEscapedNewlinesLeft", Style.AlignEscapedNewlinesLeft);
|
||||
IO.mapOptional("AlignTrailingComments", Style.AlignTrailingComments);
|
||||
IO.mapOptional("AllowAllParametersOfDeclarationOnNextLine",
|
||||
|
@ -324,6 +325,7 @@ FormatStyle getLLVMStyle() {
|
|||
LLVMStyle.Language = FormatStyle::LK_Cpp;
|
||||
LLVMStyle.AccessModifierOffset = -2;
|
||||
LLVMStyle.AlignEscapedNewlinesLeft = false;
|
||||
LLVMStyle.AlignAfterOpenBracket = true;
|
||||
LLVMStyle.AlignTrailingComments = true;
|
||||
LLVMStyle.AllowAllParametersOfDeclarationOnNextLine = true;
|
||||
LLVMStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
|
||||
|
@ -411,6 +413,7 @@ FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language) {
|
|||
GoogleStyle.PenaltyBreakBeforeFirstCallParameter = 1;
|
||||
|
||||
if (Language == FormatStyle::LK_Java) {
|
||||
GoogleStyle.AlignAfterOpenBracket = false;
|
||||
GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
|
||||
GoogleStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
|
||||
GoogleStyle.ColumnLimit = 100;
|
||||
|
@ -458,6 +461,7 @@ FormatStyle getMozillaStyle() {
|
|||
FormatStyle getWebKitStyle() {
|
||||
FormatStyle Style = getLLVMStyle();
|
||||
Style.AccessModifierOffset = -4;
|
||||
Style.AlignAfterOpenBracket = false;
|
||||
Style.AlignTrailingComments = false;
|
||||
Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
|
||||
Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
|
||||
|
|
|
@ -1525,7 +1525,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
if (Left.is(tok::colon) && Left.Type == TT_ObjCMethodExpr)
|
||||
return Line.MightBeFunctionDecl ? 50 : 500;
|
||||
|
||||
if (Left.is(tok::l_paren) && InFunctionDecl)
|
||||
if (Left.is(tok::l_paren) && InFunctionDecl && Style.AlignAfterOpenBracket)
|
||||
return 100;
|
||||
if (Left.is(tok::equal) && InFunctionDecl)
|
||||
return 110;
|
||||
|
@ -1533,9 +1533,12 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
return 1;
|
||||
if (Left.Type == TT_TemplateOpener)
|
||||
return 100;
|
||||
if (Left.opensScope())
|
||||
if (Left.opensScope()) {
|
||||
if (!Style.AlignAfterOpenBracket)
|
||||
return 0;
|
||||
return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter
|
||||
: 19;
|
||||
}
|
||||
|
||||
if (Right.is(tok::lessless)) {
|
||||
if (Left.is(tok::string_literal)) {
|
||||
|
|
|
@ -4026,6 +4026,44 @@ TEST_F(FormatTest, AlignsAfterReturn) {
|
|||
" code == a || code == b;");
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, AlignsAfterOpenBracket) {
|
||||
verifyFormat(
|
||||
"void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
|
||||
" aaaaaaaaa aaaaaaa) {}");
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
|
||||
" aaaaaaaaaaa aaaaaaaaa);");
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
|
||||
" aaaaaaaaaaaaaaaaaaaaa));");
|
||||
FormatStyle Style = getLLVMStyle();
|
||||
Style.AlignAfterOpenBracket = false;
|
||||
verifyFormat(
|
||||
"void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
|
||||
" aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
|
||||
Style);
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someVeryLongFunctionName(\n"
|
||||
" aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
|
||||
Style);
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someFunction(\n"
|
||||
" foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
|
||||
Style);
|
||||
verifyFormat(
|
||||
"void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
|
||||
" aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
|
||||
Style);
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
|
||||
" aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
|
||||
Style);
|
||||
verifyFormat(
|
||||
"SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
|
||||
" aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
|
||||
Style);
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, BreaksConditionalExpressions) {
|
||||
verifyFormat(
|
||||
"aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
|
||||
|
@ -9088,7 +9126,7 @@ TEST_F(FormatTest, FormatsWithWebKitStyle) {
|
|||
verifyFormat("Constructor()\n"
|
||||
" : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
|
||||
" , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
|
||||
" aaaaaaaaaaaaaa)\n"
|
||||
" aaaaaaaaaaaaaa)\n"
|
||||
" , aaaaaaaaaaaaaaaaaaaaaaa()\n"
|
||||
"{\n"
|
||||
"}",
|
||||
|
|
|
@ -264,5 +264,16 @@ TEST_F(FormatTestJava, ImportDeclarations) {
|
|||
getStyleWithColumns(50));
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJava, MethodDeclarations) {
|
||||
verifyFormat("void methodName(Object arg1,\n"
|
||||
" Object arg2, Object arg3) {\n"
|
||||
"}",
|
||||
getStyleWithColumns(40));
|
||||
verifyFormat("void methodName(\n"
|
||||
" Object arg1, Object arg2) {\n"
|
||||
"}",
|
||||
getStyleWithColumns(40));
|
||||
}
|
||||
|
||||
} // end namespace tooling
|
||||
} // end namespace clang
|
||||
|
|
Loading…
Reference in New Issue