clang-format: как сохранить каждый элемент списка инициализатора конструктора на отдельной строке - PullRequest
2 голосов
/ 28 июня 2019

У меня есть класс C ++, подобный этому:

class A {
public:
    A() :
        m_a(someValue1),
        m_b(someValue2),
        m_c(someValue3)
    {
    }

    // .... other class members

private:
    A m_a;
    B m_b;
    C m_c;
};

После форматирования этого кода в clang-формате я получаю:

class A {
public:
    A() :
        m_a(someValue1), m_b(someValue2), m_c(someValue3)
    {
    }

    // .... other class members

private:
    A m_a;
    B m_b;
    C m_c;
};

т.е. список инициализатора в конструкторе форматируется на одну строку, пока не будет достигнута максимальная длина строки.

Мой вопрос заключается в том, как заставить clang-формат оставить каждый элемент в отдельной строке, как это было в моем исходном коде до форматирования? Я не мог найти подходящий параметр. Я попытался установить параметр AllowShortBlocksOnASingleLine, который показался мне наиболее подходящим, как true, так и false, но это никак не повлияло на это. Так может кто-нибудь подсказать, как реализовать такое форматирование?

Вот мой формат .clang:

BasedOnStyle: Google
AccessModifierOffset: '-4'
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: Left
AlignOperands: 'true'
AlignTrailingComments: 'false'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'true'
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: 'true'
AllowShortLoopsOnASingleLine: 'false'
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'false'
AlwaysBreakTemplateDeclarations: 'true'
BinPackArguments: 'true'
BinPackParameters: 'true'
BreakAfterJavaFieldAnnotations: 'true'
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BraceWrapping:
AfterFunction: true
SplitEmptyFunction: true
BreakBeforeInheritanceComma: 'false'
BreakBeforeTernaryOperators: 'true'
BreakConstructorInitializers: AfterColon
BreakStringLiterals: 'true'
ColumnLimit: '100'
CompactNamespaces: 'false'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'false'
ConstructorInitializerIndentWidth: '4'
ContinuationIndentWidth: '8'
Cpp11BracedListStyle: 'true'
DerivePointerAlignment: 'false'
DisableFormat: 'false'
ExperimentalAutoDetectBinPacking: 'false'
FixNamespaceComments: 'true'
IncludeBlocks: Preserve
IndentCaseLabels: 'true'
IndentPPDirectives: None
IndentWidth: '4'
IndentWrappedFunctionNames: 'false'
JavaScriptQuotes: Double
JavaScriptWrapImports: 'true'
KeepEmptyLinesAtTheStartOfBlocks: 'false'
NamespaceIndentation: None
PointerAlignment: Left
ReflowComments: 'false'
SortIncludes: 'true'
SortUsingDeclarations: 'true'
SpaceAfterCStyleCast: 'true'
SpaceAfterTemplateKeyword: 'false'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: 'false'
SpacesBeforeTrailingComments: '2'
SpacesInAngles: 'false'
SpacesInCStyleCastParentheses: 'false'
SpacesInContainerLiterals: 'false'
SpacesInParentheses: 'false'
SpacesInSquareBrackets: 'false'
Standard: Cpp11
TabWidth: '4'
UseTab: Never

ОБНОВЛЕНИЕ : в формате clang есть опция «ConstructorInitializerAllOnOneLineOrOnePerLine», описанная следующим образом: «Если инициализаторы конструктора не помещаются в строку, поместите каждый инициализатор в свою собственную строку». Тем не менее, он по-прежнему не делает то, что я хочу, потому что он перемещает инициализатор на новую строку, если он не подходит к пределу столбца. Похоже, что нет никакого способа заставить clang-формат поместить последующий инициализатор в следующую строку, даже если предел столбца не достигнут. Было бы хорошо, если вышеупомянутая опция превратилась в enum с дополнительным значением, которое заставляет инициализатор переводить на следующую строку, даже если предел столбца не достигнут.

1 Ответ

1 голос
/ 28 июня 2019

Я лично использую

BreakConstructorInitializers: BeforeComma

, но доступны и другие варианты.См. Параметры стиля Clang-формата , в разделе BreakConstructorInitializers.Похоже, ваш стиль будет AfterColon.

...