Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 174 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
Language: Cpp
IndentWidth: 2
UseTab: Never
ColumnLimit: 120
SortIncludes: false
AccessModifierOffset: -2
ReflowComments: false
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
AllowShortFunctionsOnASingleLine: None
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would propose to use
AllowShortFunctionsOnASingleLine: Inline
here.

This way short inline functions in the header are put into one line.

BreakBeforeBraces: Custom
BraceWrapping:
AfterExternBlock: true
AfterClass: true
AfterFunction: true
AfterNamespace: false
AfterEnum: false
AfterCaseLabel: false
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'AfterCaseLabel: true' better matches the current style.

I rather dislike that the break behind a closing brace is put onto the same line, but found no option to influence this. The developers of clang-format seem to believe that this is as it should be.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is the option BreakBeforeBraces: Allman which would put all braces on a separate line, including the break. I would be fine with this, but it would be a larger change for the existing code base.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nah, I don't like that, in my opinion this takes up too much space.

AfterControlStatement: Never
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like this to be
AfterControlStatement: MultiLine
that is, put the brace on the next line if the if condition has more than one line.

AfterStruct: false
AfterUnion: false
BeforeLambdaBody: false
BeforeElse: false
BeforeCatch: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: false
SplitEmptyNamespace: true
PPIndentWidth: 2
FixNamespaceComments: false
# ??????
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

IndentPPDirectives: BeforeHash
SpaceBeforeParens: Custom
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
# ??
#SpacesBeforeTrailingComments: -1
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
IndentCaseBlocks: false
IndentCaseLabels: false
AlignAfterOpenBracket: DontAlign
BreakConstructorInitializers: BeforeComma
AlwaysBreakTemplateDeclarations: true
NamespaceIndentation: None
AlignArrayOfStructures: None
AlignConsecutiveAssignments:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveBitFields:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: false
AcrossEmptyLines: true
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignEscapedNewlines: DontAlign
AlignOperands: Align
AlignTrailingComments: false
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting
AlignTrailingComments: true
neatly arranges the comments in the initialization lists of Python objects.

Speaking of initializer lists of Python objects: I noticed that clang-format collapses lines without trailing comments in these lists, which makes these less tidy. We should add trailing comments for these lines to keep the Python style (search for _HEAD_INIT in the code).

# ??
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Empty
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: true
# AllowShortIfStatementsOnASingleLine: Nevers
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The value for this option is Never!

AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
BinPackArguments: true
BinPackParameters: true
BitFieldColonSpacing: After
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeConceptDeclarations: Always
BreakBeforeTernaryOperators: true
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
CompactNamespaces: false
Cpp11BracedListStyle: true
PointerAlignment: Right
QualifierAlignment: Leave
ReferenceAlignment: Pointer
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Leave
MaxEmptyLinesToKeep: 1
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
Macros:
- >-
PyObject_HEAD_INIT(type)={
{ 0xFFFFFFFF },
(type)
},
- >-
PyVarObject_HEAD_INIT(type, size)={
{
{ 0xFFFFFFFF },
(type)
},
(size)
},
ForEachMacros:
- foreach
- Q_FOREACH
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
- Q_OBJECT
- PyObject_HEAD
IndentAccessModifiers: false
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentRequiresClause: true
IndentWrappedFunctionNames: false
InsertBraces: false
InsertTrailingCommas: None
KeepEmptyLinesAtTheStartOfBlocks: true
# ???
LambdaBodyIndentation: OuterScope
PackConstructorInitializers: BinPack
RemoveBracesLLVM: false
RequiresClausePosition: OwnLine
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortUsingDeclarations: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Latest
27 changes: 27 additions & 0 deletions run-clang-format.sh
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You may want to consider adding the clang-format hook to a pre-commit-config yaml as 3D Slicer and other related projects have adopted (see https://github.com/Slicer/Slicer/blob/1b1bbb22b4f858ff3d47d196de4ac491a0b9ea5c/.pre-commit-config.yaml#L27-L39). Pre-commit-config yml usage has been adopted by many projects and something that is generally called in a GitHub actions workflow file (e.g. lint.yml) using the pre-commit github action (https://github.com/pre-commit/action).

^This way new styling is applied consistently and enforced for every PR.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, good point! I'm using pre-commit in all Python projects, just didn't think about it here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jamesobutler - pre-commit is added now, thanks for the suggestion!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great! Now just need a lint github workflow to run pre-commit where the workflow will fail if pre-commit detects issues.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had also enabled pre-commit.ci (as I do usually with pre-commit), so indeed the workflow will fail in this case.

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/bash
set -xeuo pipefail
which -a clang-format-20 > /dev/null \
|| (echo -e "20.0.0\n$(clang-format${1+-$1} --version | grep -Eo '([0-9]+\.[0-9]+\.[0-9]+)')" | sort -CV ) \
|| { echo "use '${0} <clang-format-version-not-less-than-20>' to call exact proper version" ; exit 1 ; }

IGNORED_DIRS=(
"./generated_cpp_50"
"./generated_cpp_511"
"./generated_cpp_515"
"./generated_cpp_53"
"./generated_cpp_54"
"./generated_cpp_56"
"./examples"
"./generator/simplecpp"
"./build"
)

IGNORE_CMD=""

for DIR in "${IGNORED_DIRS[@]}"; do
IGNORE_CMD+=" -path $DIR -o"
done

IGNORE_CMD=${IGNORE_CMD% -o}

find . \( $IGNORE_CMD \) -prune -o -name '*.cpp' -print0 -o -name '*.h' -print0 | xargs -0 clang-format-20 --style=file -i