
# Z3 Theorem Prover clang-format configuration
# Based on analysis of existing codebase style patterns

BasedOnStyle: LLVM

# Indentation
IndentWidth: 4
TabWidth: 4
UseTab: Never


# Column width
ColumnLimit: 120

# Braces
Cpp11BracedListStyle: true

# Classes and structs
BreakConstructorInitializers: BeforeColon
ConstructorInitializerIndentWidth: 4
AccessModifierOffset: -4

# Function definitions
AlwaysBreakAfterReturnType: None
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
# Ensure function-opening brace is attached to the signature
BreakBeforeBraces: Custom
# Explicitly ensure function brace is not placed on a new line
BraceWrapping:
   AfterFunction: false
   AfterClass: false
   AfterControlStatement: false
   AfterNamespace: false
   AfterStruct: false
   BeforeElse : true
   AfterCaseLabel: false
# Spacing
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false

# Alignment
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignOperands: true
AlignTrailingComments: true

# Line breaks
AllowAllParametersOfDeclarationOnNextLine: true
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
# BreakBeforeElse: true

# Includes
SortIncludes: false  # Z3 has specific include ordering conventions

# Namespaces
NamespaceIndentation: All

# Switch statements
IndentCaseLabels: false
AllowShortCaseLabelsOnASingleLine: true
IndentCaseBlocks: false

# Comments and documentation
ReflowComments: true
SpacesBeforeTrailingComments: 2

# Language standards
Standard: c++20

# Penalties (for line breaking decisions)
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60

# Misc
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 1