# SPDX-FileCopyrightText: 2019 Kitsune Ral <Kitsune-Ral@users.sf.net>
# SPDX-FileCopyrightText: 2019 Marc Deop <marc@marcdeop.com>

# SPDX-License-Identifier: LGPL-2.1-or-later

# This is the clang-format configuration style to be used by libQuotient.
# Inspired by:
# https://code.qt.io/cgit/qt/qt5.git/plain/_clang-format
# https://wiki.qt.io/Qt_Coding_Style
# https://wiki.qt.io/Coding_Conventions
# Further information: https://clang.llvm.org/docs/ClangFormatStyleOptions.html

# For convenience, the file includes commented out settings that we assume
# to borrow from the WebKit style. The values for such settings try to but
# are not guaranteed to coincide with the latest version of the WebKit style.

# This file assumes ClangFormat 12 or newer

---
Language: Cpp
BasedOnStyle: WebKit
#AccessModifierOffset: -4
AlignAfterOpenBracket: Align
#AlignArrayOfStructures: None # ClangFormat 13
#AlignConsecutiveMacros: None
#AlignConsecutiveAssignments: None
#AlignConsecutiveDeclarations: None
AlignEscapedNewlines: Left
AlignOperands: Align
#AlignTrailingComments: false
#AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
#AllowAllParametersOfDeclarationOnNextLine: true
#AllowShortEnumsOnASingleLine: true
#AllowShortBlocksOnASingleLine: Empty
AllowShortCaseLabelsOnASingleLine: true
#AllowShortFunctionsOnASingleLine: All
#AllowShortLambdasOnASingleLine: All
#AllowShortIfStatementsOnASingleLine: Never
#AllowShortLoopsOnASingleLine: false
#AlwaysBreakAfterDefinitionReturnType: None # deprecated
#AlwaysBreakAfterReturnType: None
#AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
#AttributeMacros:
#  - __capability
#BinPackArguments: true
#BinPackParameters: true
BraceWrapping:
#  AfterCaseLabel:  false
#  AfterClass:      false
  AfterControlStatement: Never # Switch to MultiLine with ClangFormat 14 (https://bugs.llvm.org/show_bug.cgi?id=47936)
#  AfterEnum:       false
  AfterFunction:   true
#  AfterNamespace:  false
#  AfterStruct:     false
#  AfterUnion:      false
#  AfterExternBlock: false
#  BeforeCatch:     false
#  BeforeElse:      false
#  BeforeLambdaBody: false # Blows up lambdas vertically, even if they become _very_ readable
#  BeforeWhile:     false
#  IndentBraces:    false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false
BreakBeforeBinaryOperators: NonAssignment
#BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Custom
#BreakBeforeInheritanceComma: false # deprecated?
#BreakInheritanceList: BeforeColon
#BreakBeforeTernaryOperators: true
#BreakConstructorInitializersBeforeComma: false # deprecated?
#BreakConstructorInitializers: BeforeComma
#BreakStringLiterals: true
ColumnLimit: 80
#QualifierAlignment: Leave # ClangFormat 14?
#CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
#ConstructorInitializerIndentWidth: 4
#ContinuationIndentWidth: 4
#Cpp11BracedListStyle: true
#DeriveLineEnding: true
#DerivePointerAlignment: false
#EmptyLineAfterAccessModifier: Never # ClangFormat 14
EmptyLineBeforeAccessModifier: LogicalBlock
#FixNamespaceComments: false # See ShortNamespaces below
IncludeBlocks: Regroup
IncludeCategories:
  - Regex:    '^<Qt.+/'
    Priority: 24
  - Regex:    '^<'
    Priority: 32
  - Regex:    '"csapi/'
    Priority: 2
  - Regex:    '"e2ee/'
    Priority: 3
  - Regex:    '"(events|jobs)/'
    Priority: 4
  - Regex:    '.*'
    Priority: 1
IncludeIsMainRegex: '(_test)?$'
#IncludeIsMainSourceRegex: ''
#IndentAccessModifiers: false # ClangFormat 13
#IndentCaseLabels: false
#IndentCaseBlocks: false
IndentGotoLabels: false
IndentPPDirectives: AfterHash
#IndentExternBlock: AfterExternBlock
IndentRequires: true
#IndentWidth: 4
#IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
#LambdaBodyIndentation: Signature # ClangFormat 13
#MacroBlockBegin: ''
#MacroBlockEnd:   ''
#MaxEmptyLinesToKeep: 1
#NamespaceIndentation: Inner
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 70
PenaltyBreakComment: 45
#PenaltyBreakFirstLessLess: 120
#PenaltyBreakOpenParenthesis: 0 # ClangFormat 14
PenaltyBreakString: 200
#PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 40
PenaltyReturnTypeOnItsOwnLine: 200
#PenaltyIndentedWhitespace: 0
#PointerAlignment: Left
#PPIndentWidth: -1
#ReferenceAlignment: Pointer # ClangFormat 13
#ReflowComments: true
#ShortNamespaceLines: 1 # ClangFormat 13 - to use with FixNamespaceComments
#SortIncludes: true
#SortUsingDeclarations: true
#SpaceAfterCStyleCast: false
#SpaceAfterLogicalNot: false
#SpaceAfterTemplateKeyword: true
#SpaceBeforeAssignmentOperators: true
#SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
#SpaceBeforeCtorInitializerColon: true
#SpaceBeforeInheritanceColon: true
#SpaceBeforeParens: ControlStatements
#SpaceBeforeParensOptions: # ClangFormat 14
#  AfterControlStatements: true
#  AfterForeachMacros: true
#  AfterFunctionDefinitionName: false
#  AfterFunctionDeclarationName: false
#  AfterIfMacros:   true
#  AfterOverloadedOperator: false
#  BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: After
#SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
#SpaceInEmptyParentheses: false
#SpacesBeforeTrailingComments: 1
#SpacesInAngles: false # 'Never' since ClangFormat 13
#SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
#SpacesInCStyleCastParentheses: false
#SpacesInLineCommentPrefix: # ClangFormat 13
#  Minimum:         1
#  Maximum:         -1
#SpacesInParentheses: false
#SpacesInSquareBrackets: false
#SpaceBeforeSquareBrackets: false
#BitFieldColonSpacing: Both
Standard: c++20
StatementAttributeLikeMacros:
  - Q_EMIT
  - emit
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
  - DEFINE_EVENT_TYPEID
TabWidth: 4
#UseCRLF: false
#UseTab: Never
#WhitespaceSensitiveMacros: [] # Whatever's the default, not using it
...