forked from OSchip/llvm-project
clang-format: Add option for the offset of constructor initializers.
Some coding styles use a different indent for constructor initializers. Patch by Klemens Baum. Thank you. Review: http://llvm-reviews.chandlerc.com/D1360 Post review changes: Changed data type to unsigned as a negative indent width does not make sense and added test for configuration parsing. llvm-svn: 188260
This commit is contained in:
parent
5bd3fab901
commit
cdaffa45d4
|
@ -141,6 +141,10 @@ struct FormatStyle {
|
||||||
/// \brief The number of characters to use for indentation.
|
/// \brief The number of characters to use for indentation.
|
||||||
unsigned IndentWidth;
|
unsigned IndentWidth;
|
||||||
|
|
||||||
|
/// \brief The number of characters to use for indentation of constructor
|
||||||
|
/// initializer lists.
|
||||||
|
unsigned ConstructorInitializerIndentWidth;
|
||||||
|
|
||||||
/// \brief If \c true, always break after the \c template<...> of a template
|
/// \brief If \c true, always break after the \c template<...> of a template
|
||||||
/// declaration.
|
/// declaration.
|
||||||
bool AlwaysBreakTemplateDeclarations;
|
bool AlwaysBreakTemplateDeclarations;
|
||||||
|
@ -192,6 +196,8 @@ struct FormatStyle {
|
||||||
|
|
||||||
bool operator==(const FormatStyle &R) const {
|
bool operator==(const FormatStyle &R) const {
|
||||||
return AccessModifierOffset == R.AccessModifierOffset &&
|
return AccessModifierOffset == R.AccessModifierOffset &&
|
||||||
|
ConstructorInitializerIndentWidth ==
|
||||||
|
R.ConstructorInitializerIndentWidth &&
|
||||||
AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft &&
|
AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft &&
|
||||||
AlignTrailingComments == R.AlignTrailingComments &&
|
AlignTrailingComments == R.AlignTrailingComments &&
|
||||||
AllowAllParametersOfDeclarationOnNextLine ==
|
AllowAllParametersOfDeclarationOnNextLine ==
|
||||||
|
|
|
@ -91,6 +91,8 @@ template <> struct MappingTraits<clang::format::FormatStyle> {
|
||||||
}
|
}
|
||||||
|
|
||||||
IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);
|
IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);
|
||||||
|
IO.mapOptional("ConstructorInitializerIndentWidth",
|
||||||
|
Style.ConstructorInitializerIndentWidth);
|
||||||
IO.mapOptional("AlignEscapedNewlinesLeft", Style.AlignEscapedNewlinesLeft);
|
IO.mapOptional("AlignEscapedNewlinesLeft", Style.AlignEscapedNewlinesLeft);
|
||||||
IO.mapOptional("AlignTrailingComments", Style.AlignTrailingComments);
|
IO.mapOptional("AlignTrailingComments", Style.AlignTrailingComments);
|
||||||
IO.mapOptional("AllowAllParametersOfDeclarationOnNextLine",
|
IO.mapOptional("AllowAllParametersOfDeclarationOnNextLine",
|
||||||
|
@ -167,6 +169,7 @@ FormatStyle getLLVMStyle() {
|
||||||
LLVMStyle.BreakConstructorInitializersBeforeComma = false;
|
LLVMStyle.BreakConstructorInitializersBeforeComma = false;
|
||||||
LLVMStyle.ColumnLimit = 80;
|
LLVMStyle.ColumnLimit = 80;
|
||||||
LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
|
LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
|
||||||
|
LLVMStyle.ConstructorInitializerIndentWidth = 4;
|
||||||
LLVMStyle.Cpp11BracedListStyle = false;
|
LLVMStyle.Cpp11BracedListStyle = false;
|
||||||
LLVMStyle.DerivePointerBinding = false;
|
LLVMStyle.DerivePointerBinding = false;
|
||||||
LLVMStyle.ExperimentalAutoDetectBinPacking = false;
|
LLVMStyle.ExperimentalAutoDetectBinPacking = false;
|
||||||
|
@ -203,6 +206,7 @@ FormatStyle getGoogleStyle() {
|
||||||
GoogleStyle.BreakConstructorInitializersBeforeComma = false;
|
GoogleStyle.BreakConstructorInitializersBeforeComma = false;
|
||||||
GoogleStyle.ColumnLimit = 80;
|
GoogleStyle.ColumnLimit = 80;
|
||||||
GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
|
GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
|
||||||
|
GoogleStyle.ConstructorInitializerIndentWidth = 4;
|
||||||
GoogleStyle.Cpp11BracedListStyle = true;
|
GoogleStyle.Cpp11BracedListStyle = true;
|
||||||
GoogleStyle.DerivePointerBinding = true;
|
GoogleStyle.DerivePointerBinding = true;
|
||||||
GoogleStyle.ExperimentalAutoDetectBinPacking = false;
|
GoogleStyle.ExperimentalAutoDetectBinPacking = false;
|
||||||
|
@ -651,6 +655,10 @@ private:
|
||||||
Previous.isOneOf(tok::coloncolon, tok::equal) ||
|
Previous.isOneOf(tok::coloncolon, tok::equal) ||
|
||||||
Previous.Type == TT_ObjCMethodExpr) {
|
Previous.Type == TT_ObjCMethodExpr) {
|
||||||
State.Column = ContinuationIndent;
|
State.Column = ContinuationIndent;
|
||||||
|
} else if (Current.Type == TT_CtorInitializerColon) {
|
||||||
|
State.Column = FirstIndent + Style.ConstructorInitializerIndentWidth;
|
||||||
|
} else if (Current.Type == TT_CtorInitializerComma) {
|
||||||
|
State.Column = State.Stack.back().Indent;
|
||||||
} else {
|
} else {
|
||||||
State.Column = State.Stack.back().Indent;
|
State.Column = State.Stack.back().Indent;
|
||||||
// Ensure that we fall back to indenting 4 spaces instead of just
|
// Ensure that we fall back to indenting 4 spaces instead of just
|
||||||
|
@ -821,8 +829,9 @@ private:
|
||||||
// : First(...), ...
|
// : First(...), ...
|
||||||
// Next(...)
|
// Next(...)
|
||||||
// ^ line up here.
|
// ^ line up here.
|
||||||
if (!Style.BreakConstructorInitializersBeforeComma)
|
State.Stack.back().Indent =
|
||||||
State.Stack.back().Indent = State.Column + 2;
|
State.Column +
|
||||||
|
(Style.BreakConstructorInitializersBeforeComma ? 0 : 2);
|
||||||
if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
|
if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
|
||||||
State.Stack.back().AvoidBinPacking = true;
|
State.Stack.back().AvoidBinPacking = true;
|
||||||
State.Stack.back().BreakBeforeParameter = false;
|
State.Stack.back().BreakBeforeParameter = false;
|
||||||
|
|
|
@ -4186,7 +4186,7 @@ TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
|
||||||
" f();\n");
|
" f();\n");
|
||||||
|
|
||||||
// This is simply incomplete. Formatting is not important, but must not crash.
|
// This is simply incomplete. Formatting is not important, but must not crash.
|
||||||
verifyFormat("class A:");
|
verifyFormat("class A:");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
|
TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
|
||||||
|
@ -5660,6 +5660,8 @@ TEST_F(FormatTest, ParsesConfiguration) {
|
||||||
CHECK_PARSE_BOOL(IndentFunctionDeclarationAfterType);
|
CHECK_PARSE_BOOL(IndentFunctionDeclarationAfterType);
|
||||||
|
|
||||||
CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
|
CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
|
||||||
|
CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
|
||||||
|
ConstructorInitializerIndentWidth, 1234u);
|
||||||
CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
|
CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
|
||||||
CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
|
CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
|
||||||
CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
|
CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
|
||||||
|
@ -5789,6 +5791,53 @@ TEST_F(FormatTest, SplitsUTF8BlockComments) {
|
||||||
format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
|
format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
|
||||||
|
FormatStyle Style = getLLVMStyle();
|
||||||
|
|
||||||
|
Style.ConstructorInitializerIndentWidth = 4;
|
||||||
|
verifyFormat(
|
||||||
|
"SomeClass::Constructor()\n"
|
||||||
|
" : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
|
||||||
|
" aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
|
||||||
|
Style);
|
||||||
|
|
||||||
|
Style.ConstructorInitializerIndentWidth = 2;
|
||||||
|
verifyFormat(
|
||||||
|
"SomeClass::Constructor()\n"
|
||||||
|
" : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
|
||||||
|
" aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
|
||||||
|
Style);
|
||||||
|
|
||||||
|
Style.ConstructorInitializerIndentWidth = 0;
|
||||||
|
verifyFormat(
|
||||||
|
"SomeClass::Constructor()\n"
|
||||||
|
": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
|
||||||
|
" aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
|
||||||
|
Style);
|
||||||
|
|
||||||
|
Style.BreakConstructorInitializersBeforeComma = true;
|
||||||
|
Style.ConstructorInitializerIndentWidth = 4;
|
||||||
|
verifyFormat("SomeClass::Constructor()\n"
|
||||||
|
" : a(a)\n"
|
||||||
|
" , b(b)\n"
|
||||||
|
" , c(c) {}",
|
||||||
|
Style);
|
||||||
|
|
||||||
|
Style.ConstructorInitializerIndentWidth = 2;
|
||||||
|
verifyFormat("SomeClass::Constructor()\n"
|
||||||
|
" : a(a)\n"
|
||||||
|
" , b(b)\n"
|
||||||
|
" , c(c) {}",
|
||||||
|
Style);
|
||||||
|
|
||||||
|
Style.ConstructorInitializerIndentWidth = 0;
|
||||||
|
verifyFormat("SomeClass::Constructor()\n"
|
||||||
|
": a(a)\n"
|
||||||
|
", b(b)\n"
|
||||||
|
", c(c) {}",
|
||||||
|
Style);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_F(FormatTest, FormatsWithWebKitStyle) {
|
TEST_F(FormatTest, FormatsWithWebKitStyle) {
|
||||||
|
|
Loading…
Reference in New Issue