# 官方详细说明 https://clang.llvm.org/docs/ClangFormatStyleOptions.html

# 标准编程语言 None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp # 应用于C、C++

# 标准的样式 LLVM、Google、Chromium、Mozilla、WebKit、Microsoft、GNU
# BasedOnStyle:	LLVM 由于此次使用的为自定义的风格，因此此项未设置

# 访问修饰符的额外缩进(public、private等) Version3.3
AccessModifierOffset: -4 # LLVM: -2

# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket: Align

# 对结构数组使用初始化时，会将字段对齐到列中: Left ,Right Version13
AlignArrayOfStructures: Right  # 强制

# 连续赋值时，对齐所有等号
AlignConsecutiveAssignments: Consecutive

# 对齐连续行的位域分隔符
AlignConsecutiveBitFields: Consecutive

# 连续声明时，对齐所有声明的变量名
AlignConsecutiveDeclarations: None

# 对齐连续宏定义的样式
AlignConsecutiveMacros: Consecutive

# 右对齐逃脱换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlines: Right

# 水平对齐二元和三元表达式的操作数
AlignOperands: DontAlign

# 对齐连续尾随的注释
AlignTrailingComments: true

# 如果函数调用或大括号初始值设定项列表不适合一行，则允许将所有参数放在下一行
AllowAllArgumentsOnNextLine: true

# 不允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# true:
# void myFunction(
#     int a, int b, int c, int d, int e);

# false:
# void myFunction(int a,
#                 int b,
#                 int c,
#                 int d,
#                 int e);

# 不允许短的块放在同一行 true,Never,Empty,Always
AllowShortBlocksOnASingleLine: Never

# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: true

# 允许在单行上使用短枚举
AllowShortEnumsOnASingleLine: false

# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中，空函数), All
AllowShortFunctionsOnASingleLine: None

# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: Never

# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: true

# 总是在返回类型后换行: None, All, TopLevel(顶级函数，不包括在类中的函数),
# AllDefinitions(所有的定义，不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
AlwaysBreakAfterReturnType: None

# 总是在多行string字面量前换行
AlwaysBreakBeforeMultilineStrings: false

# 总是在template声明后换行
AlwaysBreakTemplateDeclarations: No

# false表示函数实参要么都在同一行，要么都各自一行
BinPackArguments: true

# false表示所有形参要么都在同一行，要么都各自一行
BinPackParameters: true

# 用于位域Both 每边:添加一个空格
BitFieldColonSpacing: Both

# 大括号换行，只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
  # 在包装箱标签
  AfterCaseLabel: true
  # class定义后面
  AfterClass: false
  # 控制语句后面
  AfterControlStatement: Always
  # enum定义后面
  AfterEnum: false
  # 函数定义后面
  AfterFunction: true
  # 命名空间定义后面
  AfterNamespace: false
  # struct定义后面
  AfterStruct: false
  # union定义后面
  AfterUnion: false
  # extern之后
  AfterExternBlock: false
  # catch之前
  BeforeCatch: false
  # else之前
  BeforeElse: true
  # while定义后面
  BeforeWhile: false
  # 缩进大括号
  IndentBraces: false
  # 分离空函数
  SplitEmptyFunction: false
  # 分离空语句
  SplitEmptyRecord: false
  # 分离空命名空间
  SplitEmptyNamespace: false
  AfterObjCDeclaration: false
  BeforeLambdaBody: false

# 在 Java 文件中的字段上的每个注释之后中断
BreakAfterJavaFieldAnnotations: true

# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: NonAssignment

# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义，与Attach类似),
#   Mozilla(除枚举、函数、记录定义，与Attach类似), Stroustrup(除函数定义、catch、else，与Attach类似),
#   Allman(总是在大括号前换行), GNU(总是在大括号前换行，并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
#   注：这里认为语句块也属于函数
BreakBeforeBraces: Custom

# 在三元运算符前换行
BreakBeforeTernaryOperators: false

# 在构造函数的初始化列表的冒号后换行
BreakConstructorInitializers: AfterColon

#BreakInheritanceList: AfterColon

BreakStringLiterals: false

# 每行字符的限制，0表示没有限制
ColumnLimit: 0

CompactNamespaces: true

# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4

# 延续的行的缩进宽度
ContinuationIndentWidth: 4

# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: true

# 分析格式化文件中最常用的行尾（\r\n 或\n）。UseCRLF仅在无法派生时用作备用
DeriveLineEnding: true

# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment: false

# 完全禁用格式化 Version3.7
DisableFormat: false

# 固定命名空间注释
FixNamespaceComments: true

# 缩进case标签
IndentCaseLabels: true

# 缩进 goto 标签
IndentGotoLabels: false

# 要使用的预处理器指令缩进样式
IndentPPDirectives: BeforeHash

#用于缩进预处理器语句的列数。当设置为 -1（默认）时IndentWidth，也用于预处理器语句 Version13
PPIndentWidth: 4

# 向后兼容缩进外部块
IndentExternBlock: AfterExternBlock

# 根据值的不同，#include可以将多个块归为一个，并根据类别进行划分
IncludeBlocks: Preserve

# 缩进宽度
IndentWidth: 4

# 函数返回类型换行时，缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames: false

# 保留在块开始处的空行
KeepEmptyLinesAtTheStartOfBlocks: false

# 缩进 case label 与 case label 相隔一层
IndentCaseBlocks: true

# 连续空行的最大数量
MaxEmptyLinesToKeep: 1

# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
NamespaceIndentation: None

# 指针和引用的对齐: Left, Right, Middle
PointerAlignment: Right   # 强制

# 参考对齐方式 Version13
ReferenceAlignment: Right  # 强制

# 允许重新排版注释
ReflowComments: true

# 允许排序#include
SortIncludes: false #Never

# 指定使用空行分隔定义块，包括类、结构、枚举和函数 Version14
SeparateDefinitionBlocks: Always

# 允许排序 using 声明
SortUsingDeclarations: false

# 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false

# 如果false, 空格将在 case 冒号之前被删除
SpaceBeforeCaseColon: false

# 在Template 关键字后面添加空格
SpaceAfterTemplateKeyword: true

# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true

# 如果true，则在逻辑非运算符 ( ) 之后插入一个空格!
SpaceAfterLogicalNot: false

# 不在C++11大括号列表之前添加空格
SpaceBeforeCpp11BracedList: false

# 在构造函数初始化器冒号之前添加空格
SpaceBeforeCtorInitializerColon: true

# 在继承冒号前添加空格
SpaceBeforeInheritanceColon: true

# 开圆括号之前添加一个空格: Never, ControlStatements, Always
SpaceBeforeParens: ControlStatements

SpaceBeforeRangeBasedForLoopColon: true

# {}中间不添加空格
SpaceInEmptyBlock: false

# 在空的圆括号中添加空格
SpaceInEmptyParentheses: false

# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 4

# 在尖括号的<后和>前添加空格
SpacesInAngles: Never

#行注释开头允许有多少个空格。要禁用最大值，请将其设置为-1，除此之外，最大值优先于最小值
SpacesInLineCommentPrefix:
  # 在包装箱标签
  Minimum: 1
  Maximum: 1

# 如果true，将在 if/for/switch/while 条件周围插入空格
SpacesInConditionalStatement: false

# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false

# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true

# 在圆括号的(后和)前添加空格
SpacesInParentheses: false

# 在方括号的[后和]前添加空格，lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets: false

# 对空格敏感的宏定义
WhitespaceSensitiveMacros:
  - STRINGIZE
  - PP_STRINGIZE
  - BOOST_PP_STRINGIZE
  - NS_SWIFT_NAME
  - CF_SWIFT_NAME

# 标准: Cpp03, Cpp11, Auto
Standard: Auto

# tab宽度
TabWidth: 4

# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never

AttributeMacros:
  - __capability

# 在concept前换行
BreakBeforeConceptDeclarations: true

# 继承列表样式
BreakInheritanceList: AfterComma

# 描述具有特殊意义的注释的正则表达式，它不应该被分割为多行或以其它方式改变
CommentPragmas: '^ IWYU pragma:'

# 删除访问修饰符后的所有空行
EmptyLineAfterAccessModifier: Never
# 仅当访问修饰符开始一个新的逻辑块时才添加空行
EmptyLineBeforeAccessModifier: LogicalBlock
# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
ExperimentalAutoDetectBinPacking: false

# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IfMacros:
  - KJ_IF_MAYBE

# 可以定义负数优先级从而保证某些#include永远在最前面
IncludeCategories:
  - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
    Priority: 2
    SortPriority: 0
    CaseSensitive: false
  - Regex: '^(<|"(gtest|gmock|isl|json)/)'
    Priority: 3
    SortPriority: 0
    CaseSensitive: false
  - Regex: '.*'
    Priority: 1
    SortPriority: 0
    CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
# 缩进访问修饰符
IndentAccessModifiers: false

# 缩进模板中的requires子句
IndentRequires: false

# 插入尾随逗号
InsertTrailingCommas: None

# 保留JavaScript字符串引号
JavaScriptQuotes: Leave

# 包装 JavaScript 导入/导出语句
JavaScriptWrapImports: true

# 相对于 lambda 签名对齐 lambda 主体
LambdaBodyIndentation: Signature

# 开始一个块的宏的正则表达式
MacroBlockBegin: ''

# 结束一个块的宏的正则表达式
MacroBlockEnd: ''
ObjCBinPackProtocolList: Auto

# 使用ObjC块时缩进宽度
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true

# 在ObjC的@property后添加一个空格
ObjCSpaceAfterProperty: false

# 在ObjC的protocol列表前添加一个空格
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0

# 短命名空间跨越的最大展开行数
ShortNamespaceLines: 1

# java静态导入放在非静态导入之前
SortJavaStaticImport: Before

# 不要确保指针限定符周围有空格，而是使用 PointerAlignment
SpaceAroundPointerQualifiers: Default

# 不在[前添加空格
SpaceBeforeSquareBrackets: false

# 在语句前面被忽略的宏定义，就好像它们是一个属性一样
StatementAttributeLikeMacros:
  - Q_EMIT

# 应该被解释为完整语句的宏定义
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION

# 使用\n换行
UseCRLF: false

