clang-format не сортирует основной файл

У меня есть следующее определение моего .clang-format файла:

---
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: false
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: true
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: false
  AfterClass: false
  AfterEnum: false
  AfterFunction: false
  AfterNamespace: false
  AfterStruct: false
  AfterUnion: false
  AfterExternBlock: false
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false
BreakBeforeTernaryOperators: false
BreakConstructorInitializers: AfterColon
BreakConstructorInitializersBeforeComma: false
BreakInheritanceList: AfterColon
BreakStringLiterals: true
ColumnLimit: 0
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: false
DerivePointerAlignment: false
FixNamespaceComments: true
IncludeBlocks: Regroup
IncludeCategories:
  - Regex:           '^<'
    Priority:        -1
  - Regex:           '^"(gtest|gmock)/'
    Priority:        1
  - Regex:           '^"boost/'
    Priority:        2
  # Other rules ...
  - Regex:           '^"tools/'
    Priority:        14
  - Regex:           '^"[\w]+/'
    Priority:        15
  - Regex:           '.*'
    Priority:        16
IndentCaseLabels: true
IndentGotoLabels: false
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
Language: Cpp
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
PointerAlignment: Left
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 4
UseTab: Never
...

Сортировка файлов заголовков работает хорошо, за исключением сопоставления файлов с основными включениями. Основной файл сортируется по правилу 16 и поэтому всегда появляется в конце.

Я попытался удалить сортировку включаемых файлов (т.е. закомментировать параметры IncludeBlocks и IncludeCategories, но это все еще не работает. Я подумал, что, поскольку резервный стиль - это LLVM, в этом случае он, по крайней мере, сработает.

Если я не использую свой файл, а вместо этого указываю -style=llvm в командной строке, сортировка основного файла работает.

Я использую VS Code 1.45.1 в Debian 10 с расширением Clang-Format пользователя xaver. Исполняемый файл clang-format имеет версию 10.0.0.

У кого-нибудь есть предложения?


person mfacchinelli    schedule 22.05.2020    source источник
comment
Вы используете .hpp для файлов заголовков? Я не думаю, что ClangFormat может обнаружить что-либо, кроме .h ...   -  person Matt F.    schedule 07.07.2021


Ответы (1)


  1. В вашем .clang-format файле отсутствует параметр IncludeIsMainRegex. Обычно я ожидал, что по умолчанию будет разумная настройка, и все будет работать нормально. Но, учитывая вашу проблему, вы должны убедиться, что он где-то не установлен (возможно, вы используете другой .clang-format файл, чем вы думаете? Или, возможно, ваш исполняемый файл clang-format был каким-то образом изменен?).

    Значение по умолчанию - IncludeIsMainRegex: '(Test)?$'. Другими разумными значениями могут быть '([-_](test|unittest))?$' (что соответствует тому, что используют предопределенные стили Google и Chromium), '$' (что означает отсутствие дополнительного суффикса имени файла) или '' (что означает любой суффикс имени файла). Дополнительную информацию см. В документации.

  2. Когда ваше Clang-Format расширение от xaver запускает исполняемый файл clang-format, предоставляет ли он имя файла в командной строке? Или он, возможно, передает файл в stdin? В последнем случае clang-format не будет знать имя файла и, следовательно, не сможет определить, какой включаемый файл является основным включаемым файлом. Одним из способов решения этой проблемы является использование параметра командной строки -assume-filename (задокументировано здесь), но, конечно, это зависит от расширения.

  3. Наконец, помните, что главный включаемый файл отсортирован с приоритетом 0. В вашей настройке для IncludeCategories все включаемые файлы, начинающиеся с <, отсортированы с приоритетом -1, поэтому они будут отсортированы перед основным включаемым файлом.

person Eric Backus    schedule 19.08.2020