Нужна помощь в выяснении некоторых параметров формата clang - PullRequest
1 голос
/ 30 июня 2019

При использовании clang-format (8.0.0) я сталкиваюсь со странными проблемами форматирования, которые, как мне кажется, могут быть ошибками.Я не хочу бросать оружие и сообщать о них как об ошибках, не зная, правильно ли я что-то делаю или пропустил настройку конфигурации.У меня есть несколько примеров, когда я чувствую, что мои настройки не соблюдаются, и вместо этого форматер в некотором смысле становится «жуликом».

Вот мой файл настроек формата .clang:

---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
  AfterClass: false
  AfterControlStatement: true
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterObjCDeclaration: true
  AfterStruct: true
  AfterUnion: true
  AfterExternBlock: true
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeInheritanceComma: true
BreakInheritanceList: BeforeComma
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
BreakConstructorInitializers: BeforeComma
BreakAfterJavaFieldAnnotations: true
BreakStringLiterals: true
ColumnLimit: 0
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories: 
  - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
    Priority: 2
  - Regex: '^(<|"(gtest|gmock|isl|json)/)'
    Priority: 3
  - Regex: '.*'
    Priority: 1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: false
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: false
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
ReflowComments: false
SortIncludes: false
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 4
UseTab: Never
...

Пример 1 - Назначения в одну строку с несколькими круглыми скобками:

Перед форматированием:

extern "C"
{
    HBITMAP     (WINAPI *Real_LoadBitmapW)(HINSTANCE, LPCWSTR) = LoadBitmapW;
    HANDLE      (WINAPI *Real_OpenMutexA)(DWORD, BOOL, LPCSTR) = OpenMutexA;
}

После форматирования:

    HBITMAP(WINAPI* Real_LoadBitmapW)
    (HINSTANCE, LPCWSTR) = LoadBitmapW;
    HANDLE(WINAPI* Real_OpenMutexA)
    (DWORD, BOOL, LPCSTR)                                                        = OpenMutexA;

Ожидаемые результаты:

    HBITMAP (WINAPI* Real_LoadBitmapW)(HINSTANCE, LPCWSTR)                                                                       = LoadBitmapW;
    HANDLE (WINAPI* Real_OpenMutexA)(DWORD, BOOL, LPCSTR)                                                                        = OpenMutexA;

Здесь средство форматирования случайным образом разбивает мои назначения на новые строки по своему усмотрению.Настройка ColumnWidth здесь, кажется, не соблюдается.Если я установлю для ColumnWidth фактическое число, скажем, 200, то строки не будут разбиваться, но форматирование все равно будет неправильным, поскольку теперь после возвращаемого типа помещается пробел.Но использование ColumnWidth нарушает другое форматирование.Я хочу, чтобы ColumnWidth был установлен на 0 в целом.Я не уверен, какое правило вызывает это для новой строки и удаляет пробелы после возвращаемого типа.


Пример 2 - Не учитывается установка пространства приведения в стиле C:

Перед форматированием:

    auto prodVer = (LPVOID)nullptr;
    auto prodVerSize = (UINT)0;

После форматирования:

    auto prodVer     = (LPVOID) nullptr;
    auto prodVerSize = (UINT)0;

Ожидаемые результаты:

    auto prodVer     = (LPVOID)nullptr;
    auto prodVerSize = (UINT)0;

Здесь пробел добавляется передnullptr.Кажется, это происходит только при использовании nullptr в качестве значения приведения.Если переключить на число или переменную, он работает нормально.Также, если переключить LPVOID на void *, это также исправит проблему.Кроме того, в связи с этой проблемой изменение параметра «Стандарт» с Cpp11 на Cpp03 также исправляет это, но затем вводит другое форматирование, которое я не хочу из-за стандартных изменений.Мой код использует C ++ 11,14,17,20, поэтому здесь необходимо использовать настройку Cpp11 Standard.


Я только начал использовать формат clang вчера вечером, поэтому я очень новичок в этом ипытаясь понять, как правила влияют друг на друга.Я прочитал страницу документации, посвященную каждому правилу и тому, что оно делает, просто кажется, что в определенные моменты они игнорируются, как указано выше.

У меня есть другие случаи / проблемы, но я чувствую, что они могут сыграть в вышеупомянутые два,Если я сначала исправлю их, другие могут быть уже исправлены, так что я смогу создать другой вопрос позже, если будут сохраняться другие проблемы.

...