blob: 48f5fb441575704ece96966e57fb988649e4ff72 [file] [log] [blame]
//===--- Format.h - Format C++ code -----------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Various functions to configurably format source code.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_FORMAT_FORMAT_H
#define LLVM_CLANG_FORMAT_FORMAT_H
#include "clang/Basic/LangOptions.h"
#include "clang/Tooling/Core/Replacement.h"
#include "clang/Tooling/Inclusions/IncludeStyle.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/Regex.h"
#include "llvm/Support/SourceMgr.h"
#include <optional>
#include <system_error>
namespace llvm {
namespace vfs {
class FileSystem;
}
} // namespace llvm
namespace clang {
namespace format {
enum class ParseError {
Success = 0,
Error,
Unsuitable,
BinPackTrailingCommaConflict,
InvalidQualifierSpecified,
DuplicateQualifierSpecified,
MissingQualifierType,
MissingQualifierOrder
};
class ParseErrorCategory final : public std::error_category {
public:
const char *name() const noexcept override;
std::string message(int EV) const override;
};
const std::error_category &getParseCategory();
std::error_code make_error_code(ParseError e);
/// The ``FormatStyle`` is used to configure the formatting to follow
/// specific guidelines.
struct FormatStyle {
// If the BasedOn: was InheritParentConfig and this style needs the file from
// the parent directories. It is not part of the actual style for formatting.
// Thus the // instead of ///.
bool InheritsParentConfig;
/// The extra indent or outdent of access modifiers, e.g. ``public:``.
/// \version 3.3
int AccessModifierOffset;
/// Different styles for aligning after open brackets.
enum BracketAlignmentStyle : int8_t {
/// Align parameters on the open bracket, e.g.:
/// \code
/// someLongFunction(argument1,
/// argument2);
/// \endcode
BAS_Align,
/// Don't align, instead use ``ContinuationIndentWidth``, e.g.:
/// \code
/// someLongFunction(argument1,
/// argument2);
/// \endcode
BAS_DontAlign,
/// Always break after an open bracket, if the parameters don't fit
/// on a single line, e.g.:
/// \code
/// someLongFunction(
/// argument1, argument2);
/// \endcode
BAS_AlwaysBreak,
/// Always break after an open bracket, if the parameters don't fit
/// on a single line. Closing brackets will be placed on a new line.
/// E.g.:
/// \code
/// someLongFunction(
/// argument1, argument2
/// )
/// \endcode
///
/// \note
/// This currently only applies to braced initializer lists (when
/// ``Cpp11BracedListStyle`` is ``true``) and parentheses.
/// \endnote
BAS_BlockIndent,
};
/// If ``true``, horizontally aligns arguments after an open bracket.
///
/// This applies to round brackets (parentheses), angle brackets and square
/// brackets.
/// \version 3.8
BracketAlignmentStyle AlignAfterOpenBracket;
/// Different style for aligning array initializers.
enum ArrayInitializerAlignmentStyle : int8_t {
/// Align array column and left justify the columns e.g.:
/// \code
/// struct test demo[] =
/// {
/// {56, 23, "hello"},
/// {-1, 93463, "world"},
/// {7, 5, "!!" }
/// };
/// \endcode
AIAS_Left,
/// Align array column and right justify the columns e.g.:
/// \code
/// struct test demo[] =
/// {
/// {56, 23, "hello"},
/// {-1, 93463, "world"},
/// { 7, 5, "!!"}
/// };
/// \endcode
AIAS_Right,
/// Don't align array initializer columns.
AIAS_None
};
/// if not ``None``, when using initialization for an array of structs
/// aligns the fields into columns.
///
/// \note
/// As of clang-format 15 this option only applied to arrays with equal
/// number of columns per row.
/// \endnote
///
/// \version 13
ArrayInitializerAlignmentStyle AlignArrayOfStructures;
/// Alignment options.
///
/// They can also be read as a whole for compatibility. The choices are:
/// - None
/// - Consecutive
/// - AcrossEmptyLines
/// - AcrossComments
/// - AcrossEmptyLinesAndComments
///
/// For example, to align across empty lines and not across comments, either
/// of these work.
/// \code
/// <option-name>: AcrossEmptyLines
///
/// <option-name>:
/// Enabled: true
/// AcrossEmptyLines: true
/// AcrossComments: false
/// \endcode
struct AlignConsecutiveStyle {
/// Whether aligning is enabled.
/// \code
/// #define SHORT_NAME 42
/// #define LONGER_NAME 0x007f
/// #define EVEN_LONGER_NAME (2)
/// #define foo(x) (x * x)
/// #define bar(y, z) (y + z)
///
/// int a = 1;
/// int somelongname = 2;
/// double c = 3;
///
/// int aaaa : 1;
/// int b : 12;
/// int ccc : 8;
///
/// int aaaa = 12;
/// float b = 23;
/// std::string ccc;
/// \endcode
bool Enabled;
/// Whether to align across empty lines.
/// \code
/// true:
/// int a = 1;
/// int somelongname = 2;
/// double c = 3;
///
/// int d = 3;
///
/// false:
/// int a = 1;
/// int somelongname = 2;
/// double c = 3;
///
/// int d = 3;
/// \endcode
bool AcrossEmptyLines;
/// Whether to align across comments.
/// \code
/// true:
/// int d = 3;
/// /* A comment. */
/// double e = 4;
///
/// false:
/// int d = 3;
/// /* A comment. */
/// double e = 4;
/// \endcode
bool AcrossComments;
/// Only for ``AlignConsecutiveAssignments``. Whether compound assignments
/// like ``+=`` are aligned along with ``=``.
/// \code
/// true:
/// a &= 2;
/// bbb = 2;
///
/// false:
/// a &= 2;
/// bbb = 2;
/// \endcode
bool AlignCompound;
/// Only for ``AlignConsecutiveDeclarations``. Whether function pointers are
/// aligned.
/// \code
/// true:
/// unsigned i;
/// int &r;
/// int *p;
/// int (*f)();
///
/// false:
/// unsigned i;
/// int &r;
/// int *p;
/// int (*f)();
/// \endcode
bool AlignFunctionPointers;
/// Only for ``AlignConsecutiveAssignments``. Whether short assignment
/// operators are left-padded to the same length as long ones in order to
/// put all assignment operators to the right of the left hand side.
/// \code
/// true:
/// a >>= 2;
/// bbb = 2;
///
/// a = 2;
/// bbb >>= 2;
///
/// false:
/// a >>= 2;
/// bbb = 2;
///
/// a = 2;
/// bbb >>= 2;
/// \endcode
bool PadOperators;
bool operator==(const AlignConsecutiveStyle &R) const {
return Enabled == R.Enabled && AcrossEmptyLines == R.AcrossEmptyLines &&
AcrossComments == R.AcrossComments &&
AlignCompound == R.AlignCompound &&
AlignFunctionPointers == R.AlignFunctionPointers &&
PadOperators == R.PadOperators;
}
bool operator!=(const AlignConsecutiveStyle &R) const {
return !(*this == R);
}
};
/// Style of aligning consecutive macro definitions.
///
/// ``Consecutive`` will result in formattings like:
/// \code
/// #define SHORT_NAME 42
/// #define LONGER_NAME 0x007f
/// #define EVEN_LONGER_NAME (2)
/// #define foo(x) (x * x)
/// #define bar(y, z) (y + z)
/// \endcode
/// \version 9
AlignConsecutiveStyle AlignConsecutiveMacros;
/// Style of aligning consecutive assignments.
///
/// ``Consecutive`` will result in formattings like:
/// \code
/// int a = 1;
/// int somelongname = 2;
/// double c = 3;
/// \endcode
/// \version 3.8
AlignConsecutiveStyle AlignConsecutiveAssignments;
/// Style of aligning consecutive bit fields.
///
/// ``Consecutive`` will align the bitfield separators of consecutive lines.
/// This will result in formattings like:
/// \code
/// int aaaa : 1;
/// int b : 12;
/// int ccc : 8;
/// \endcode
/// \version 11
AlignConsecutiveStyle AlignConsecutiveBitFields;
/// Style of aligning consecutive declarations.
///
/// ``Consecutive`` will align the declaration names of consecutive lines.
/// This will result in formattings like:
/// \code
/// int aaaa = 12;
/// float b = 23;
/// std::string ccc;
/// \endcode
/// \version 3.8
AlignConsecutiveStyle AlignConsecutiveDeclarations;
/// Alignment options.
///
struct ShortCaseStatementsAlignmentStyle {
/// Whether aligning is enabled.
/// \code
/// true:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
/// default: return "";
/// }
///
/// false:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
/// default: return "";
/// }
/// \endcode
bool Enabled;
/// Whether to align across empty lines.
/// \code
/// true:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
///
/// default: return "";
/// }
///
/// false:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
///
/// default: return "";
/// }
/// \endcode
bool AcrossEmptyLines;
/// Whether to align across comments.
/// \code
/// true:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
/// /* A comment. */
/// default: return "";
/// }
///
/// false:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
/// /* A comment. */
/// default: return "";
/// }
/// \endcode
bool AcrossComments;
/// Whether aligned case labels are aligned on the colon, or on the
/// , or on the tokens after the colon.
/// \code
/// true:
/// switch (level) {
/// case log::info : return "info:";
/// case log::warning: return "warning:";
/// default : return "";
/// }
///
/// false:
/// switch (level) {
/// case log::info: return "info:";
/// case log::warning: return "warning:";
/// default: return "";
/// }
/// \endcode
bool AlignCaseColons;
bool operator==(const ShortCaseStatementsAlignmentStyle &R) const {
return Enabled == R.Enabled && AcrossEmptyLines == R.AcrossEmptyLines &&
AcrossComments == R.AcrossComments &&
AlignCaseColons == R.AlignCaseColons;
}
};
/// Style of aligning consecutive short case labels.
/// Only applies if ``AllowShortCaseLabelsOnASingleLine`` is ``true``.
///
/// \code{.yaml}
/// # Example of usage:
/// AlignConsecutiveShortCaseStatements:
/// Enabled: true
/// AcrossEmptyLines: true
/// AcrossComments: true
/// AlignCaseColons: false
/// \endcode
/// \version 17
ShortCaseStatementsAlignmentStyle AlignConsecutiveShortCaseStatements;
/// Style of aligning consecutive TableGen DAGArg operator colons.
/// If enabled, align the colon inside DAGArg which have line break inside.
/// This works only when TableGenBreakInsideDAGArg is BreakElements or
/// BreakAll and the DAGArg is not excepted by
/// TableGenBreakingDAGArgOperators's effect.
/// \code
/// let dagarg = (ins
/// a :$src1,
/// aa :$src2,
/// aaa:$src3
/// )
/// \endcode
/// \version 19
AlignConsecutiveStyle AlignConsecutiveTableGenBreakingDAGArgColons;
/// Style of aligning consecutive TableGen cond operator colons.
/// Align the colons of cases inside !cond operators.
/// \code
/// !cond(!eq(size, 1) : 1,
/// !eq(size, 16): 1,
/// true : 0)
/// \endcode
/// \version 19
AlignConsecutiveStyle AlignConsecutiveTableGenCondOperatorColons;
/// Style of aligning consecutive TableGen definition colons.
/// This aligns the inheritance colons of consecutive definitions.
/// \code
/// def Def : Parent {}
/// def DefDef : Parent {}
/// def DefDefDef : Parent {}
/// \endcode
/// \version 19
AlignConsecutiveStyle AlignConsecutiveTableGenDefinitionColons;
/// Different styles for aligning escaped newlines.
enum EscapedNewlineAlignmentStyle : int8_t {
/// Don't align escaped newlines.
/// \code
/// #define A \
/// int aaaa; \
/// int b; \
/// int dddddddddd;
/// \endcode
ENAS_DontAlign,
/// Align escaped newlines as far left as possible.
/// \code
/// true:
/// #define A \
/// int aaaa; \
/// int b; \
/// int dddddddddd;
///
/// false:
/// \endcode
ENAS_Left,
/// Align escaped newlines in the right-most column.
/// \code
/// #define A \
/// int aaaa; \
/// int b; \
/// int dddddddddd;
/// \endcode
ENAS_Right,
};
/// Options for aligning backslashes in escaped newlines.
/// \version 5
EscapedNewlineAlignmentStyle AlignEscapedNewlines;
/// Different styles for aligning operands.
enum OperandAlignmentStyle : int8_t {
/// Do not align operands of binary and ternary expressions.
/// The wrapped lines are indented ``ContinuationIndentWidth`` spaces from
/// the start of the line.
OAS_DontAlign,
/// Horizontally align operands of binary and ternary expressions.
///
/// Specifically, this aligns operands of a single expression that needs
/// to be split over multiple lines, e.g.:
/// \code
/// int aaa = bbbbbbbbbbbbbbb +
/// ccccccccccccccc;
/// \endcode
///
/// When ``BreakBeforeBinaryOperators`` is set, the wrapped operator is
/// aligned with the operand on the first line.
/// \code
/// int aaa = bbbbbbbbbbbbbbb
/// + ccccccccccccccc;
/// \endcode
OAS_Align,
/// Horizontally align operands of binary and ternary expressions.
///
/// This is similar to ``AO_Align``, except when
/// ``BreakBeforeBinaryOperators`` is set, the operator is un-indented so
/// that the wrapped operand is aligned with the operand on the first line.
/// \code
/// int aaa = bbbbbbbbbbbbbbb
/// + ccccccccccccccc;
/// \endcode
OAS_AlignAfterOperator,
};
/// If ``true``, horizontally align operands of binary and ternary
/// expressions.
/// \version 3.5
OperandAlignmentStyle AlignOperands;
/// Enums for AlignTrailingComments
enum TrailingCommentsAlignmentKinds : int8_t {
/// Leave trailing comments as they are.
/// \code
/// int a; // comment
/// int ab; // comment
///
/// int abc; // comment
/// int abcd; // comment
/// \endcode
TCAS_Leave,
/// Align trailing comments.
/// \code
/// int a; // comment
/// int ab; // comment
///
/// int abc; // comment
/// int abcd; // comment
/// \endcode
TCAS_Always,
/// Don't align trailing comments but other formatter applies.
/// \code
/// int a; // comment
/// int ab; // comment
///
/// int abc; // comment
/// int abcd; // comment
/// \endcode
TCAS_Never,
};
/// Alignment options
struct TrailingCommentsAlignmentStyle {
/// Specifies the way to align trailing comments.
TrailingCommentsAlignmentKinds Kind;
/// How many empty lines to apply alignment.
/// When both ``MaxEmptyLinesToKeep`` and ``OverEmptyLines`` are set to 2,
/// it formats like below.
/// \code
/// int a; // all these
///
/// int ab; // comments are
///
///
/// int abcdef; // aligned
/// \endcode
///
/// When ``MaxEmptyLinesToKeep`` is set to 2 and ``OverEmptyLines`` is set
/// to 1, it formats like below.
/// \code
/// int a; // these are
///
/// int ab; // aligned
///
///
/// int abcdef; // but this isn't
/// \endcode
unsigned OverEmptyLines;
bool operator==(const TrailingCommentsAlignmentStyle &R) const {
return Kind == R.Kind && OverEmptyLines == R.OverEmptyLines;
}
bool operator!=(const TrailingCommentsAlignmentStyle &R) const {
return !(*this == R);
}
};
/// Control of trailing comments.
///
/// The alignment stops at closing braces after a line break, and only
/// followed by other closing braces, a (``do-``) ``while``, a lambda call, or
/// a semicolon.
///
/// \note
/// As of clang-format 16 this option is not a bool but can be set
/// to the options. Conventional bool options still can be parsed as before.
/// \endnote
///
/// \code{.yaml}
/// # Example of usage:
/// AlignTrailingComments:
/// Kind: Always
/// OverEmptyLines: 2
/// \endcode
/// \version 3.7
TrailingCommentsAlignmentStyle AlignTrailingComments;
/// \brief If a function call or braced initializer list doesn't fit on a
/// line, allow putting all arguments onto the next line, even if
/// ``BinPackArguments`` is ``false``.
/// \code
/// true:
/// callFunction(
/// a, b, c, d);
///
/// false:
/// callFunction(a,
/// b,
/// c,
/// d);
/// \endcode
/// \version 9
bool AllowAllArgumentsOnNextLine;
/// This option is **deprecated**. See ``NextLine`` of
/// ``PackConstructorInitializers``.
/// \version 9
// bool AllowAllConstructorInitializersOnNextLine;
/// If the function declaration doesn't fit on a line,
/// allow putting all parameters of a function declaration onto
/// the next line even if ``BinPackParameters`` is ``false``.
/// \code
/// 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);
/// \endcode
/// \version 3.3
bool AllowAllParametersOfDeclarationOnNextLine;
/// Different ways to break before a noexcept specifier.
enum BreakBeforeNoexceptSpecifierStyle : int8_t {
/// No line break allowed.
/// \code
/// void foo(int arg1,
/// double arg2) noexcept;
///
/// void bar(int arg1, double arg2) noexcept(
/// noexcept(baz(arg1)) &&
/// noexcept(baz(arg2)));
/// \endcode
BBNSS_Never,
/// For a simple ``noexcept`` there is no line break allowed, but when we
/// have a condition it is.
/// \code
/// void foo(int arg1,
/// double arg2) noexcept;
///
/// void bar(int arg1, double arg2)
/// noexcept(noexcept(baz(arg1)) &&
/// noexcept(baz(arg2)));
/// \endcode
BBNSS_OnlyWithParen,
/// Line breaks are allowed. But note that because of the associated
/// penalties ``clang-format`` often prefers not to break before the
/// ``noexcept``.
/// \code
/// void foo(int arg1,
/// double arg2) noexcept;
///
/// void bar(int arg1, double arg2)
/// noexcept(noexcept(baz(arg1)) &&
/// noexcept(baz(arg2)));
/// \endcode
BBNSS_Always,
};
/// Controls if there could be a line break before a ``noexcept`` specifier.
/// \version 18
BreakBeforeNoexceptSpecifierStyle AllowBreakBeforeNoexceptSpecifier;
/// Different styles for merging short blocks containing at most one
/// statement.
enum ShortBlockStyle : int8_t {
/// Never merge blocks into a single line.
/// \code
/// while (true) {
/// }
/// while (true) {
/// continue;
/// }
/// \endcode
SBS_Never,
/// Only merge empty blocks.
/// \code
/// while (true) {}
/// while (true) {
/// continue;
/// }
/// \endcode
SBS_Empty,
/// Always merge short blocks into a single line.
/// \code
/// while (true) {}
/// while (true) { continue; }
/// \endcode
SBS_Always,
};
/// Dependent on the value, ``while (true) { continue; }`` can be put on a
/// single line.
/// \version 3.5
ShortBlockStyle AllowShortBlocksOnASingleLine;
/// If ``true``, short case labels will be contracted to a single line.
/// \code
/// true: false:
/// switch (a) { vs. switch (a) {
/// case 1: x = 1; break; case 1:
/// case 2: return; x = 1;
/// } break;
/// case 2:
/// return;
/// }
/// \endcode
/// \version 3.6
bool AllowShortCaseLabelsOnASingleLine;
/// Allow short compound requirement on a single line.
/// \code
/// true:
/// template <typename T>
/// concept c = requires(T x) {
/// { x + 1 } -> std::same_as<int>;
/// };
///
/// false:
/// template <typename T>
/// concept c = requires(T x) {
/// {
/// x + 1
/// } -> std::same_as<int>;
/// };
/// \endcode
/// \version 18
bool AllowShortCompoundRequirementOnASingleLine;
/// Allow short enums on a single line.
/// \code
/// true:
/// enum { A, B } myEnum;
///
/// false:
/// enum {
/// A,
/// B
/// } myEnum;
/// \endcode
/// \version 11
bool AllowShortEnumsOnASingleLine;
/// Different styles for merging short functions containing at most one
/// statement.
enum ShortFunctionStyle : int8_t {
/// Never merge functions into a single line.
SFS_None,
/// Only merge functions defined inside a class. Same as "inline",
/// except it does not implies "empty": i.e. top level empty functions
/// are not merged either.
/// \code
/// class Foo {
/// void f() { foo(); }
/// };
/// void f() {
/// foo();
/// }
/// void f() {
/// }
/// \endcode
SFS_InlineOnly,
/// Only merge empty functions.
/// \code
/// void f() {}
/// void f2() {
/// bar2();
/// }
/// \endcode
SFS_Empty,
/// Only merge functions defined inside a class. Implies "empty".
/// \code
/// class Foo {
/// void f() { foo(); }
/// };
/// void f() {
/// foo();
/// }
/// void f() {}
/// \endcode
SFS_Inline,
/// Merge all functions fitting on a single line.
/// \code
/// class Foo {
/// void f() { foo(); }
/// };
/// void f() { bar(); }
/// \endcode
SFS_All,
};
/// Dependent on the value, ``int f() { return 0; }`` can be put on a
/// single line.
/// \version 3.5
ShortFunctionStyle AllowShortFunctionsOnASingleLine;
/// Different styles for handling short if statements.
enum ShortIfStyle : int8_t {
/// Never put short ifs on the same line.
/// \code
/// if (a)
/// return;
///
/// if (b)
/// return;
/// else
/// return;
///
/// if (c)
/// return;
/// else {
/// return;
/// }
/// \endcode
SIS_Never,
/// Put short ifs on the same line only if there is no else statement.
/// \code
/// if (a) return;
///
/// if (b)
/// return;
/// else
/// return;
///
/// if (c)
/// return;
/// else {
/// return;
/// }
/// \endcode
SIS_WithoutElse,
/// Put short ifs, but not else ifs nor else statements, on the same line.
/// \code
/// if (a) return;
///
/// if (b) return;
/// else if (b)
/// return;
/// else
/// return;
///
/// if (c) return;
/// else {
/// return;
/// }
/// \endcode
SIS_OnlyFirstIf,
/// Always put short ifs, else ifs and else statements on the same
/// line.
/// \code
/// if (a) return;
///
/// if (b) return;
/// else return;
///
/// if (c) return;
/// else {
/// return;
/// }
/// \endcode
SIS_AllIfsAndElse,
};
/// Dependent on the value, ``if (a) return;`` can be put on a single line.
/// \version 3.3
ShortIfStyle AllowShortIfStatementsOnASingleLine;
/// Different styles for merging short lambdas containing at most one
/// statement.
enum ShortLambdaStyle : int8_t {
/// Never merge lambdas into a single line.
SLS_None,
/// Only merge empty lambdas.
/// \code
/// auto lambda = [](int a) {};
/// auto lambda2 = [](int a) {
/// return a;
/// };
/// \endcode
SLS_Empty,
/// Merge lambda into a single line if the lambda is argument of a function.
/// \code
/// auto lambda = [](int x, int y) {
/// return x < y;
/// };
/// sort(a.begin(), a.end(), [](int x, int y) { return x < y; });
/// \endcode
SLS_Inline,
/// Merge all lambdas fitting on a single line.
/// \code
/// auto lambda = [](int a) {};
/// auto lambda2 = [](int a) { return a; };
/// \endcode
SLS_All,
};
/// Dependent on the value, ``auto lambda []() { return 0; }`` can be put on a
/// single line.
/// \version 9
ShortLambdaStyle AllowShortLambdasOnASingleLine;
/// If ``true``, ``while (true) continue;`` can be put on a single
/// line.
/// \version 3.7
bool AllowShortLoopsOnASingleLine;
/// Different ways to break after the function definition return type.
/// This option is **deprecated** and is retained for backwards compatibility.
enum DefinitionReturnTypeBreakingStyle : int8_t {
/// Break after return type automatically.
/// ``PenaltyReturnTypeOnItsOwnLine`` is taken into account.
DRTBS_None,
/// Always break after the return type.
DRTBS_All,
/// Always break after the return types of top-level functions.
DRTBS_TopLevel,
};
/// Different ways to break after the function definition or
/// declaration return type.
enum ReturnTypeBreakingStyle : int8_t {
/// This is **deprecated**. See ``Automatic`` below.
RTBS_None,
/// Break after return type based on ``PenaltyReturnTypeOnItsOwnLine``.
/// \code
/// class A {
/// int f() { return 0; };
/// };
/// int f();
/// int f() { return 1; }
/// int
/// LongName::AnotherLongName();
/// \endcode
RTBS_Automatic,
/// Same as ``Automatic`` above, except that there is no break after short
/// return types.
/// \code
/// class A {
/// int f() { return 0; };
/// };
/// int f();
/// int f() { return 1; }
/// int LongName::
/// AnotherLongName();
/// \endcode
RTBS_ExceptShortType,
/// Always break after the return type.
/// \code
/// class A {
/// int
/// f() {
/// return 0;
/// };
/// };
/// int
/// f();
/// int
/// f() {
/// return 1;
/// }
/// int
/// LongName::AnotherLongName();
/// \endcode
RTBS_All,
/// Always break after the return types of top-level functions.
/// \code
/// class A {
/// int f() { return 0; };
/// };
/// int
/// f();
/// int
/// f() {
/// return 1;
/// }
/// int
/// LongName::AnotherLongName();
/// \endcode
RTBS_TopLevel,
/// Always break after the return type of function definitions.
/// \code
/// class A {
/// int
/// f() {
/// return 0;
/// };
/// };
/// int f();
/// int
/// f() {
/// return 1;
/// }
/// int
/// LongName::AnotherLongName();
/// \endcode
RTBS_AllDefinitions,
/// Always break after the return type of top-level definitions.
/// \code
/// class A {
/// int f() { return 0; };
/// };
/// int f();
/// int
/// f() {
/// return 1;
/// }
/// int
/// LongName::AnotherLongName();
/// \endcode
RTBS_TopLevelDefinitions,
};
/// The function definition return type breaking style to use. This
/// option is **deprecated** and is retained for backwards compatibility.
/// \version 3.7
DefinitionReturnTypeBreakingStyle AlwaysBreakAfterDefinitionReturnType;
/// This option is renamed to ``BreakAfterReturnType``.
/// \version 3.8
/// @deprecated
// ReturnTypeBreakingStyle AlwaysBreakAfterReturnType;
/// If ``true``, always break before multiline string literals.
///
/// This flag is mean to make cases where there are multiple multiline strings
/// in a file look more consistent. Thus, it will only take effect if wrapping
/// the string at that point leads to it being indented
/// ``ContinuationIndentWidth`` spaces from the start of the line.
/// \code
/// true: false:
/// aaaa = vs. aaaa = "bbbb"
/// "bbbb" "cccc";
/// "cccc";
/// \endcode
/// \version 3.4
bool AlwaysBreakBeforeMultilineStrings;
/// Different ways to break after the template declaration.
enum BreakTemplateDeclarationsStyle : int8_t {
/// Do not change the line breaking before the declaration.
/// \code
/// template <typename T>
/// T foo() {
/// }
/// template <typename T> T foo(int aaaaaaaaaaaaaaaaaaaaa,
/// int bbbbbbbbbbbbbbbbbbbbb) {
/// }
/// \endcode
BTDS_Leave,
/// Do not force break before declaration.
/// ``PenaltyBreakTemplateDeclaration`` is taken into account.
/// \code
/// template <typename T> T foo() {
/// }
/// template <typename T> T foo(int aaaaaaaaaaaaaaaaaaaaa,
/// int bbbbbbbbbbbbbbbbbbbbb) {
/// }
/// \endcode
BTDS_No,
/// Force break after template declaration only when the following
/// declaration spans multiple lines.
/// \code
/// template <typename T> T foo() {
/// }
/// template <typename T>
/// T foo(int aaaaaaaaaaaaaaaaaaaaa,
/// int bbbbbbbbbbbbbbbbbbbbb) {
/// }
/// \endcode
BTDS_MultiLine,
/// Always break after template declaration.
/// \code
/// template <typename T>
/// T foo() {
/// }
/// template <typename T>
/// T foo(int aaaaaaaaaaaaaaaaaaaaa,
/// int bbbbbbbbbbbbbbbbbbbbb) {
/// }
/// \endcode
BTDS_Yes
};
/// This option is renamed to ``BreakTemplateDeclarations``.
/// \version 3.4
/// @deprecated
// BreakTemplateDeclarationsStyle AlwaysBreakTemplateDeclarations;
/// A vector of strings that should be interpreted as attributes/qualifiers
/// instead of identifiers. This can be useful for language extensions or
/// static analyzer annotations.
///
/// For example:
/// \code
/// x = (char *__capability)&y;
/// int function(void) __unused;
/// void only_writes_to_buffer(char *__output buffer);
/// \endcode
///
/// In the .clang-format configuration file, this can be configured like:
/// \code{.yaml}
/// AttributeMacros: ['__capability', '__output', '__unused']
/// \endcode
///
/// \version 12
std::vector<std::string> AttributeMacros;
/// If ``false``, a function call's arguments will either be all on the
/// same line or will have one line each.
/// \code
/// true:
/// void f() {
/// f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,
/// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);
/// }
///
/// false:
/// void f() {
/// f(aaaaaaaaaaaaaaaaaaaa,
/// aaaaaaaaaaaaaaaaaaaa,
/// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);
/// }
/// \endcode
/// \version 3.7
bool BinPackArguments;
/// If ``false``, a function declaration's or function definition's
/// parameters will either all be on the same line or will have one line each.
/// \code
/// true:
/// void f(int aaaaaaaaaaaaaaaaaaaa, int aaaaaaaaaaaaaaaaaaaa,
/// int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}
///
/// false:
/// void f(int aaaaaaaaaaaaaaaaaaaa,
/// int aaaaaaaaaaaaaaaaaaaa,
/// int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}
/// \endcode
/// \version 3.7
bool BinPackParameters;
/// Styles for adding spacing around ``:`` in bitfield definitions.
enum BitFieldColonSpacingStyle : int8_t {
/// Add one space on each side of the ``:``
/// \code
/// unsigned bf : 2;
/// \endcode
BFCS_Both,
/// Add no space around the ``:`` (except when needed for
/// ``AlignConsecutiveBitFields``).
/// \code
/// unsigned bf:2;
/// \endcode
BFCS_None,
/// Add space before the ``:`` only
/// \code
/// unsigned bf :2;
/// \endcode
BFCS_Before,
/// Add space after the ``:`` only (space may be added before if
/// needed for ``AlignConsecutiveBitFields``).
/// \code
/// unsigned bf: 2;
/// \endcode
BFCS_After
};
/// The BitFieldColonSpacingStyle to use for bitfields.
/// \version 12
BitFieldColonSpacingStyle BitFieldColonSpacing;
/// The number of columns to use to indent the contents of braced init lists.
/// If unset, ``ContinuationIndentWidth`` is used.
/// \code
/// AlignAfterOpenBracket: AlwaysBreak
/// BracedInitializerIndentWidth: 2
///
/// void f() {
/// SomeClass c{
/// "foo",
/// "bar",
/// "baz",
/// };
/// auto s = SomeStruct{
/// .foo = "foo",
/// .bar = "bar",
/// .baz = "baz",
/// };
/// SomeArrayT a[3] = {
/// {
/// foo,
/// bar,
/// },
/// {
/// foo,
/// bar,
/// },
/// SomeArrayT{},
/// };
/// }
/// \endcode
/// \version 17
std::optional<unsigned> BracedInitializerIndentWidth;
/// Different ways to wrap braces after control statements.
enum BraceWrappingAfterControlStatementStyle : int8_t {
/// Never wrap braces after a control statement.
/// \code
/// if (foo()) {
/// } else {
/// }
/// for (int i = 0; i < 10; ++i) {
/// }
/// \endcode
BWACS_Never,
/// Only wrap braces after a multi-line control statement.
/// \code
/// if (foo && bar &&
/// baz)
/// {
/// quux();
/// }
/// while (foo || bar) {
/// }
/// \endcode
BWACS_MultiLine,
/// Always wrap braces after a control statement.
/// \code
/// if (foo())
/// {
/// } else
/// {}
/// for (int i = 0; i < 10; ++i)
/// {}
/// \endcode
BWACS_Always
};
/// Precise control over the wrapping of braces.
/// \code
/// # Should be declared this way:
/// BreakBeforeBraces: Custom
/// BraceWrapping:
/// AfterClass: true
/// \endcode
struct BraceWrappingFlags {
/// Wrap case labels.
/// \code
/// false: true:
/// switch (foo) { vs. switch (foo) {
/// case 1: { case 1:
/// bar(); {
/// break; bar();
/// } break;
/// default: { }
/// plop(); default:
/// } {
/// } plop();
/// }
/// }
/// \endcode
bool AfterCaseLabel;
/// Wrap class definitions.
/// \code
/// true:
/// class foo
/// {};
///
/// false:
/// class foo {};
/// \endcode
bool AfterClass;
/// Wrap control statements (``if``/``for``/``while``/``switch``/..).
BraceWrappingAfterControlStatementStyle AfterControlStatement;
/// Wrap enum definitions.
/// \code
/// true:
/// enum X : int
/// {
/// B
/// };
///
/// false:
/// enum X : int { B };
/// \endcode
bool AfterEnum;
/// Wrap function definitions.
/// \code
/// true:
/// void foo()
/// {
/// bar();
/// bar2();
/// }
///
/// false:
/// void foo() {
/// bar();
/// bar2();
/// }
/// \endcode
bool AfterFunction;
/// Wrap namespace definitions.
/// \code
/// true:
/// namespace
/// {
/// int foo();
/// int bar();
/// }
///
/// false:
/// namespace {
/// int foo();
/// int bar();
/// }
/// \endcode
bool AfterNamespace;
/// Wrap ObjC definitions (interfaces, implementations...).
/// \note
/// @autoreleasepool and @synchronized blocks are wrapped
/// according to ``AfterControlStatement`` flag.
/// \endnote
bool AfterObjCDeclaration;
/// Wrap struct definitions.
/// \code
/// true:
/// struct foo
/// {
/// int x;
/// };
///
/// false:
/// struct foo {
/// int x;
/// };
/// \endcode
bool AfterStruct;
/// Wrap union definitions.
/// \code
/// true:
/// union foo
/// {
/// int x;
/// }
///
/// false:
/// union foo {
/// int x;
/// }
/// \endcode
bool AfterUnion;
/// Wrap extern blocks.
/// \code
/// true:
/// extern "C"
/// {
/// int foo();
/// }
///
/// false:
/// extern "C" {
/// int foo();
/// }
/// \endcode
bool AfterExternBlock; // Partially superseded by IndentExternBlock
/// Wrap before ``catch``.
/// \code
/// true:
/// try {
/// foo();
/// }
/// catch () {
/// }
///
/// false:
/// try {
/// foo();
/// } catch () {
/// }
/// \endcode
bool BeforeCatch;
/// Wrap before ``else``.
/// \code
/// true:
/// if (foo()) {
/// }
/// else {
/// }
///
/// false:
/// if (foo()) {
/// } else {
/// }
/// \endcode
bool BeforeElse;
/// Wrap lambda block.
/// \code
/// true:
/// connect(
/// []()
/// {
/// foo();
/// bar();
/// });
///
/// false:
/// connect([]() {
/// foo();
/// bar();
/// });
/// \endcode
bool BeforeLambdaBody;
/// Wrap before ``while``.
/// \code
/// true:
/// do {
/// foo();
/// }
/// while (1);
///
/// false:
/// do {
/// foo();
/// } while (1);
/// \endcode
bool BeforeWhile;
/// Indent the wrapped braces themselves.
bool IndentBraces;
/// If ``false``, empty function body can be put on a single line.
/// This option is used only if the opening brace of the function has
/// already been wrapped, i.e. the ``AfterFunction`` brace wrapping mode is
/// set, and the function could/should not be put on a single line (as per
/// ``AllowShortFunctionsOnASingleLine`` and constructor formatting
/// options).
/// \code
/// false: true:
/// int f() vs. int f()
/// {} {
/// }
/// \endcode
///
bool SplitEmptyFunction;
/// If ``false``, empty record (e.g. class, struct or union) body
/// can be put on a single line. This option is used only if the opening
/// brace of the record has already been wrapped, i.e. the ``AfterClass``
/// (for classes) brace wrapping mode is set.
/// \code
/// false: true:
/// class Foo vs. class Foo
/// {} {
/// }
/// \endcode
///
bool SplitEmptyRecord;
/// If ``false``, empty namespace body can be put on a single line.
/// This option is used only if the opening brace of the namespace has
/// already been wrapped, i.e. the ``AfterNamespace`` brace wrapping mode is
/// set.
/// \code
/// false: true:
/// namespace Foo vs. namespace Foo
/// {} {
/// }
/// \endcode
///
bool SplitEmptyNamespace;
};
/// Control of individual brace wrapping cases.
///
/// If ``BreakBeforeBraces`` is set to ``BS_Custom``, use this to specify how
/// each individual brace case should be handled. Otherwise, this is ignored.
/// \code{.yaml}
/// # Example of usage:
/// BreakBeforeBraces: Custom
/// BraceWrapping:
/// AfterEnum: true
/// AfterStruct: false
/// SplitEmptyFunction: false
/// \endcode
/// \version 3.8
BraceWrappingFlags BraceWrapping;
/// Break between adjacent string literals.
/// \code
/// true:
/// return "Code"
/// "\0\52\26\55\55\0"
/// "x013"
/// "\02\xBA";
/// false:
/// return "Code" "\0\52\26\55\55\0" "x013" "\02\xBA";
/// \endcode
/// \version 18
bool BreakAdjacentStringLiterals;
/// Different ways to break after attributes.
enum AttributeBreakingStyle : int8_t {
/// Always break after attributes.
/// \code
/// [[maybe_unused]]
/// const int i;
/// [[gnu::const]] [[maybe_unused]]
/// int j;
///
/// [[nodiscard]]
/// inline int f();
/// [[gnu::const]] [[nodiscard]]
/// int g();
///
/// [[likely]]
/// if (a)
/// f();
/// else
/// g();
///
/// switch (b) {
/// [[unlikely]]
/// case 1:
/// ++b;
/// break;
/// [[likely]]
/// default:
/// return;
/// }
/// \endcode
ABS_Always,
/// Leave the line breaking after attributes as is.
/// \code
/// [[maybe_unused]] const int i;
/// [[gnu::const]] [[maybe_unused]]
/// int j;
///
/// [[nodiscard]] inline int f();
/// [[gnu::const]] [[nodiscard]]
/// int g();
///
/// [[likely]] if (a)
/// f();
/// else
/// g();
///
/// switch (b) {
/// [[unlikely]] case 1:
/// ++b;
/// break;
/// [[likely]]
/// default:
/// return;
/// }
/// \endcode
ABS_Leave,
/// Never break after attributes.
/// \code
/// [[maybe_unused]] const int i;
/// [[gnu::const]] [[maybe_unused]] int j;
///
/// [[nodiscard]] inline int f();
/// [[gnu::const]] [[nodiscard]] int g();
///
/// [[likely]] if (a)
/// f();
/// else
/// g();
///
/// switch (b) {
/// [[unlikely]] case 1:
/// ++b;
/// break;
/// [[likely]] default:
/// return;
/// }
/// \endcode
ABS_Never,
};
/// Break after a group of C++11 attributes before variable or function
/// (including constructor/destructor) declaration/definition names or before
/// control statements, i.e. ``if``, ``switch`` (including ``case`` and
/// ``default`` labels), ``for``, and ``while`` statements.
/// \version 16
AttributeBreakingStyle BreakAfterAttributes;
/// The function declaration return type breaking style to use.
/// \version 19
ReturnTypeBreakingStyle BreakAfterReturnType;
/// If ``true``, clang-format will always break after a Json array ``[``
/// otherwise it will scan until the closing ``]`` to determine if it should
/// add newlines between elements (prettier compatible).
///
/// \note
/// This is currently only for formatting JSON.
/// \endnote
/// \code
/// true: false:
/// [ vs. [1, 2, 3, 4]
/// 1,
/// 2,
/// 3,
/// 4
/// ]
/// \endcode
/// \version 16
bool BreakArrays;
/// The style of wrapping parameters on the same line (bin-packed) or
/// on one line each.
enum BinPackStyle : int8_t {
/// Automatically determine parameter bin-packing behavior.
BPS_Auto,
/// Always bin-pack parameters.
BPS_Always,
/// Never bin-pack parameters.
BPS_Never,
};
/// The style of breaking before or after binary operators.
enum BinaryOperatorStyle : int8_t {
/// Break after operators.
/// \code
/// LooooooooooongType loooooooooooooooooooooongVariable =
/// someLooooooooooooooooongFunction();
///
/// bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +
/// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==
/// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
/// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >
/// ccccccccccccccccccccccccccccccccccccccccc;
/// \endcode
BOS_None,
/// Break before operators that aren't assignments.
/// \code
/// LooooooooooongType loooooooooooooooooooooongVariable =
/// someLooooooooooooooooongFunction();
///
/// bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// > ccccccccccccccccccccccccccccccccccccccccc;
/// \endcode
BOS_NonAssignment,
/// Break before operators.
/// \code
/// LooooooooooongType loooooooooooooooooooooongVariable
/// = someLooooooooooooooooongFunction();
///
/// bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/// > ccccccccccccccccccccccccccccccccccccccccc;
/// \endcode
BOS_All,
};
/// The way to wrap binary operators.
/// \version 3.6
BinaryOperatorStyle BreakBeforeBinaryOperators;
/// Different ways to attach braces to their surrounding context.
enum BraceBreakingStyle : int8_t {
/// Always attach braces to surrounding context.
/// \code
/// namespace N {
/// enum E {
/// E1,
/// E2,
/// };
///
/// class C {
/// public:
/// C();
/// };
///
/// bool baz(int i) {
/// try {
/// do {
/// switch (i) {
/// case 1: {
/// foobar();
/// break;
/// }
/// default: {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// } catch (...) {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b) {
/// if (b) {
/// baz(2);
/// } else {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Attach,
/// Like ``Attach``, but break before braces on function, namespace and
/// class definitions.
/// \code
/// namespace N
/// {
/// enum E {
/// E1,
/// E2,
/// };
///
/// class C
/// {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try {
/// do {
/// switch (i) {
/// case 1: {
/// foobar();
/// break;
/// }
/// default: {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// } catch (...) {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b) {
/// baz(2);
/// } else {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Linux,
/// Like ``Attach``, but break before braces on enum, function, and record
/// definitions.
/// \code
/// namespace N {
/// enum E
/// {
/// E1,
/// E2,
/// };
///
/// class C
/// {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try {
/// do {
/// switch (i) {
/// case 1: {
/// foobar();
/// break;
/// }
/// default: {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// } catch (...) {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b) {
/// baz(2);
/// } else {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Mozilla,
/// Like ``Attach``, but break before function definitions, ``catch``, and
/// ``else``.
/// \code
/// namespace N {
/// enum E {
/// E1,
/// E2,
/// };
///
/// class C {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try {
/// do {
/// switch (i) {
/// case 1: {
/// foobar();
/// break;
/// }
/// default: {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// }
/// catch (...) {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b) {
/// baz(2);
/// }
/// else {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Stroustrup,
/// Always break before braces.
/// \code
/// namespace N
/// {
/// enum E
/// {
/// E1,
/// E2,
/// };
///
/// class C
/// {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try
/// {
/// do
/// {
/// switch (i)
/// {
/// case 1:
/// {
/// foobar();
/// break;
/// }
/// default:
/// {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// }
/// catch (...)
/// {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b)
/// {
/// baz(2);
/// }
/// else
/// {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Allman,
/// Like ``Allman`` but always indent braces and line up code with braces.
/// \code
/// namespace N
/// {
/// enum E
/// {
/// E1,
/// E2,
/// };
///
/// class C
/// {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try
/// {
/// do
/// {
/// switch (i)
/// {
/// case 1:
/// {
/// foobar();
/// break;
/// }
/// default:
/// {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// }
/// catch (...)
/// {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b)
/// {
/// baz(2);
/// }
/// else
/// {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_Whitesmiths,
/// Always break before braces and add an extra level of indentation to
/// braces of control statements, not to those of class, function
/// or other definitions.
/// \code
/// namespace N
/// {
/// enum E
/// {
/// E1,
/// E2,
/// };
///
/// class C
/// {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try
/// {
/// do
/// {
/// switch (i)
/// {
/// case 1:
/// {
/// foobar();
/// break;
/// }
/// default:
/// {
/// break;
/// }
/// }
/// }
/// while (--i);
/// return true;
/// }
/// catch (...)
/// {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b)
/// {
/// baz(2);
/// }
/// else
/// {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_GNU,
/// Like ``Attach``, but break before functions.
/// \code
/// namespace N {
/// enum E {
/// E1,
/// E2,
/// };
///
/// class C {
/// public:
/// C();
/// };
///
/// bool baz(int i)
/// {
/// try {
/// do {
/// switch (i) {
/// case 1: {
/// foobar();
/// break;
/// }
/// default: {
/// break;
/// }
/// }
/// } while (--i);
/// return true;
/// } catch (...) {
/// handleError();
/// return false;
/// }
/// }
///
/// void foo(bool b)
/// {
/// if (b) {
/// baz(2);
/// } else {
/// baz(5);
/// }
/// }
///
/// void bar() { foo(true); }
/// } // namespace N
/// \endcode
BS_WebKit,
/// Configure each individual brace in ``BraceWrapping``.
BS_Custom
};
/// The brace breaking style to use.
/// \version 3.7
BraceBreakingStyle BreakBeforeBraces;
/// Different ways to break before concept declarations.
enum BreakBeforeConceptDeclarationsStyle : int8_t {
/// Keep the template declaration line together with ``concept``.
/// \code
/// template <typename T> concept C = ...;
/// \endcode
BBCDS_Never,
/// Breaking between template declaration and ``concept`` is allowed. The
/// actual behavior depends on the content and line breaking rules and
/// penalties.
BBCDS_Allowed,
/// Always break before ``concept``, putting it in the line after the
/// template declaration.
/// \code
/// template <typename T>
/// concept C = ...;
/// \endcode
BBCDS_Always,
};
/// The concept declaration style to use.
/// \version 12
BreakBeforeConceptDeclarationsStyle BreakBeforeConceptDeclarations;
/// Different ways to break ASM parameters.
enum BreakBeforeInlineASMColonStyle : int8_t {
/// No break before inline ASM colon.
/// \code
/// asm volatile("string", : : val);
/// \endcode
BBIAS_Never,
/// Break before inline ASM colon if the line length is longer than column
/// limit.
/// \code
/// asm volatile("string", : : val);
/// asm("cmoveq %1, %2, %[result]"
/// : [result] "=r"(result)
/// : "r"(test), "r"(new), "[result]"(old));
/// \endcode
BBIAS_OnlyMultiline,
/// Always break before inline ASM colon.
/// \code
/// asm volatile("string",
/// :
/// : val);
/// \endcode
BBIAS_Always,
};
/// The inline ASM colon style to use.
/// \version 16
BreakBeforeInlineASMColonStyle BreakBeforeInlineASMColon;
/// If ``true``, ternary operators will be placed after line breaks.
/// \code
/// true:
/// veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongDescription
/// ? firstValue
/// : SecondValueVeryVeryVeryVeryLong;
///
/// false:
/// veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongDescription ?
/// firstValue :
/// SecondValueVeryVeryVeryVeryLong;
/// \endcode
/// \version 3.7
bool BreakBeforeTernaryOperators;
/// Different ways to break initializers.
enum BreakConstructorInitializersStyle : int8_t {
/// Break constructor initializers before the colon and after the commas.
/// \code
/// Constructor()
/// : initializer1(),
/// initializer2()
/// \endcode
BCIS_BeforeColon,
/// Break constructor initializers before the colon and commas, and align
/// the commas with the colon.
/// \code
/// Constructor()
/// : initializer1()
/// , initializer2()
/// \endcode
BCIS_BeforeComma,
/// Break constructor initializers after the colon and commas.
/// \code
/// Constructor() :
/// initializer1(),
/// initializer2()
/// \endcode
BCIS_AfterColon
};
/// The break constructor initializers style to use.
/// \version 5
BreakConstructorInitializersStyle BreakConstructorInitializers;
/// If ``true``, clang-format will always break before function definition
/// parameters.
/// \code
/// true:
/// void functionDefinition(
/// int A, int B) {}
///
/// false:
/// void functionDefinition(int A, int B) {}
///
/// \endcode
/// \version 19
bool BreakFunctionDefinitionParameters;
/// Break after each annotation on a field in Java files.
/// \code{.java}
/// true: false:
/// @Partial vs. @Partial @Mock DataLoad loader;
/// @Mock
/// DataLoad loader;
/// \endcode
/// \version 3.8
bool BreakAfterJavaFieldAnnotations;
/// Allow breaking string literals when formatting.
///
/// In C, C++, and Objective-C:
/// \code
/// true:
/// const char* x = "veryVeryVeryVeryVeryVe"
/// "ryVeryVeryVeryVeryVery"
/// "VeryLongString";
///
/// false:
/// const char* x =
/// "veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
/// \endcode
///
/// In C# and Java:
/// \code
/// true:
/// string x = "veryVeryVeryVeryVeryVe" +
/// "ryVeryVeryVeryVeryVery" +
/// "VeryLongString";
///
/// false:
/// string x =
/// "veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
/// \endcode
///
/// C# interpolated strings are not broken.
///
/// In Verilog:
/// \code
/// true:
/// string x = {"veryVeryVeryVeryVeryVe",
/// "ryVeryVeryVeryVeryVery",
/// "VeryLongString"};
///
/// false:
/// string x =
/// "veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
/// \endcode
///
/// \version 3.9
bool BreakStringLiterals;
/// The column limit.
///
/// A column limit of ``0`` means that there is no column limit. In this case,
/// clang-format will respect the input's line breaking decisions within
/// statements unless they contradict other rules.
/// \version 3.7
unsigned ColumnLimit;
/// A regular expression that describes comments with special meaning,
/// which should not be split into lines or otherwise changed.
/// \code
/// // CommentPragmas: '^ FOOBAR pragma:'
/// // Will leave the following line unaffected
/// #include <vector> // FOOBAR pragma: keep
/// \endcode
/// \version 3.7
std::string CommentPragmas;
/// Different ways to break inheritance list.
enum BreakInheritanceListStyle : int8_t {
/// Break inheritance list before the colon and after the commas.
/// \code
/// class Foo
/// : Base1,
/// Base2
/// {};
/// \endcode
BILS_BeforeColon,
/// Break inheritance list before the colon and commas, and align
/// the commas with the colon.
/// \code
/// class Foo
/// : Base1
/// , Base2
/// {};
/// \endcode
BILS_BeforeComma,
/// Break inheritance list after the colon and commas.
/// \code
/// class Foo :
/// Base1,
/// Base2
/// {};
/// \endcode
BILS_AfterColon,
/// Break inheritance list only after the commas.
/// \code
/// class Foo : Base1,
/// Base2
/// {};
/// \endcode
BILS_AfterComma,
};
/// The inheritance list style to use.
/// \version 7
BreakInheritanceListStyle BreakInheritanceList;
/// The template declaration breaking style to use.
/// \version 19
BreakTemplateDeclarationsStyle BreakTemplateDeclarations;
/// If ``true``, consecutive namespace declarations will be on the same
/// line. If ``false``, each namespace is declared on a new line.
/// \code
/// true:
/// namespace Foo { namespace Bar {
/// }}
///
/// false:
/// namespace Foo {
/// namespace Bar {
/// }
/// }
/// \endcode
///
/// If it does not fit on a single line, the overflowing namespaces get
/// wrapped:
/// \code
/// namespace Foo { namespace Bar {
/// namespace Extra {
/// }}}
/// \endcode
/// \version 5
bool CompactNamespaces;
/// This option is **deprecated**. See ``CurrentLine`` of
/// ``PackConstructorInitializers``.
/// \version 3.7
// bool ConstructorInitializerAllOnOneLineOrOnePerLine;
/// The number of characters to use for indentation of constructor
/// initializer lists as well as inheritance lists.
/// \version 3.7
unsigned ConstructorInitializerIndentWidth;
/// Indent width for line continuations.
/// \code
/// ContinuationIndentWidth: 2
///
/// int i = // VeryVeryVeryVeryVeryLongComment
/// longFunction( // Again a long comment
/// arg);
/// \endcode
/// \version 3.7
unsigned ContinuationIndentWidth;
/// If ``true``, format braced lists as best suited for C++11 braced
/// lists.
///
/// Important differences:
/// - No spaces inside the braced list.
/// - No line break before the closing brace.
/// - Indentation with the continuation indent, not with the block indent.
///
/// Fundamentally, C++11 braced lists are formatted exactly like function
/// calls would be formatted in their place. If the braced list follows a name
/// (e.g. a type or variable name), clang-format formats as if the ``{}`` were
/// the parentheses of a function call with that name. If there is no name,
/// a zero-length name is assumed.
/// \code
/// true: false:
/// vector<int> x{1, 2, 3, 4}; vs. vector<int> x{ 1, 2, 3, 4 };
/// vector<T> x{{}, {}, {}, {}}; vector<T> x{ {}, {}, {}, {} };
/// f(MyMap[{composite, key}]); f(MyMap[{ composite, key }]);
/// new int[3]{1, 2, 3}; new int[3]{ 1, 2, 3 };
/// \endcode
/// \version 3.4
bool Cpp11BracedListStyle;
/// This option is **deprecated**. See ``DeriveLF`` and ``DeriveCRLF`` of
/// ``LineEnding``.
/// \version 10
// bool DeriveLineEnding;
/// If ``true``, analyze the formatted file for the most common
/// alignment of ``&`` and ``*``.
/// Pointer and reference alignment styles are going to be updated according
/// to the preferences found in the file.
/// ``PointerAlignment`` is then used only as fallback.
/// \version 3.7
bool DerivePointerAlignment;
/// Disables formatting completely.
/// \version 3.7
bool DisableFormat;
/// Different styles for empty line after access modifiers.
/// ``EmptyLineBeforeAccessModifier`` configuration handles the number of
/// empty lines between two access modifiers.
enum EmptyLineAfterAccessModifierStyle : int8_t {
/// Remove all empty lines after access modifiers.
/// \code
/// struct foo {
/// private:
/// int i;
/// protected:
/// int j;
/// /* comment */
/// public:
/// foo() {}
/// private:
/// protected:
/// };
/// \endcode
ELAAMS_Never,
/// Keep existing empty lines after access modifiers.
/// MaxEmptyLinesToKeep is applied instead.
ELAAMS_Leave,
/// Always add empty line after access modifiers if there are none.
/// MaxEmptyLinesToKeep is applied also.
/// \code
/// struct foo {
/// private:
///
/// int i;
/// protected:
///
/// int j;
/// /* comment */
/// public:
///
/// foo() {}
/// private:
///
/// protected:
///
/// };
/// \endcode
ELAAMS_Always,
};
/// Defines when to put an empty line after access modifiers.
/// ``EmptyLineBeforeAccessModifier`` configuration handles the number of
/// empty lines between two access modifiers.
/// \version 13
EmptyLineAfterAccessModifierStyle EmptyLineAfterAccessModifier;
/// Different styles for empty line before access modifiers.
enum EmptyLineBeforeAccessModifierStyle : int8_t {
/// Remove all empty lines before access modifiers.
/// \code
/// struct foo {
/// private:
/// int i;
/// protected:
/// int j;
/// /* comment */
/// public:
/// foo() {}
/// private:
/// protected:
/// };
/// \endcode
ELBAMS_Never,
/// Keep existing empty lines before access modifiers.
ELBAMS_Leave,
/// Add empty line only when access modifier starts a new logical block.
/// Logical block is a group of one or more member fields or functions.
/// \code
/// struct foo {
/// private:
/// int i;
///
/// protected:
/// int j;
/// /* comment */
/// public:
/// foo() {}
///
/// private:
/// protected:
/// };
/// \endcode
ELBAMS_LogicalBlock,
/// Always add empty line before access modifiers unless access modifier
/// is at the start of struct or class definition.
/// \code
/// struct foo {
/// private:
/// int i;
///
/// protected:
/// int j;
/// /* comment */
///
/// public:
/// foo() {}
///
/// private:
///
/// protected:
/// };
/// \endcode
ELBAMS_Always,
};
/// Defines in which cases to put empty line before access modifiers.
/// \version 12
EmptyLineBeforeAccessModifierStyle EmptyLineBeforeAccessModifier;
/// If ``true``, clang-format detects whether function calls and
/// definitions are formatted with one parameter per line.
///
/// Each call can be bin-packed, one-per-line or inconclusive. If it is
/// inconclusive, e.g. completely on one line, but a decision needs to be
/// made, clang-format analyzes whether there are other bin-packed cases in
/// the input file and act accordingly.
///
/// \note
/// This is an experimental flag, that might go away or be renamed. Do
/// not use this in config files, etc. Use at your own risk.
/// \endnote
/// \version 3.7
bool ExperimentalAutoDetectBinPacking;
/// If ``true``, clang-format adds missing namespace end comments for
/// namespaces and fixes invalid existing ones. This doesn't affect short
/// namespaces, which are controlled by ``ShortNamespaceLines``.
/// \code
/// true: false:
/// namespace longNamespace { vs. namespace longNamespace {
/// void foo(); void foo();
/// void bar(); void bar();
/// } // namespace a }
/// namespace shortNamespace { namespace shortNamespace {
/// void baz(); void baz();
/// } }
/// \endcode
/// \version 5
bool FixNamespaceComments;
/// A vector of macros that should be interpreted as foreach loops
/// instead of as function calls.
///
/// These are expected to be macros of the form:
/// \code
/// FOREACH(<variable-declaration>, ...)
/// <loop-body>
/// \endcode
///
/// In the .clang-format configuration file, this can be configured like:
/// \code{.yaml}
/// ForEachMacros: ['RANGES_FOR', 'FOREACH']
/// \endcode
///
/// For example: BOOST_FOREACH.
/// \version 3.7
std::vector<std::string> ForEachMacros;
tooling::IncludeStyle IncludeStyle;
/// A vector of macros that should be interpreted as conditionals
/// instead of as function calls.
///
/// These are expected to be macros of the form:
/// \code
/// IF(...)
/// <conditional-body>
/// else IF(...)
/// <conditional-body>
/// \endcode
///
/// In the .clang-format configuration file, this can be configured like:
/// \code{.yaml}
/// IfMacros: ['IF']
/// \endcode
///
/// For example: `KJ_IF_MAYBE
/// <https://github.com/capnproto/capnproto/blob/master/kjdoc/tour.md#maybes>`_
/// \version 13
std::vector<std::string> IfMacros;
/// Specify whether access modifiers should have their own indentation level.
///
/// When ``false``, access modifiers are indented (or outdented) relative to
/// the record members, respecting the ``AccessModifierOffset``. Record
/// members are indented one level below the record.
/// When ``true``, access modifiers get their own indentation level. As a
/// consequence, record members are always indented 2 levels below the record,
/// regardless of the access modifier presence. Value of the
/// ``AccessModifierOffset`` is ignored.
/// \code
/// false: true:
/// class C { vs. class C {
/// class D { class D {
/// void bar(); void bar();
/// protected: protected:
/// D(); D();
/// }; };
/// public: public:
/// C(); C();
/// }; };
/// void foo() { void foo() {
/// return 1; return 1;
/// } }
/// \endcode
/// \version 13
bool IndentAccessModifiers;
/// Indent case label blocks one level from the case label.
///
/// When ``false``, the block following the case label uses the same
/// indentation level as for the case label, treating the case label the same
/// as an if-statement.
/// When ``true``, the block gets indented as a scope block.
/// \code
/// false: true:
/// switch (fool) { vs. switch (fool) {
/// case 1: { case 1:
/// bar(); {
/// } break; bar();
/// default: { }
/// plop(); break;
/// } default:
/// } {
/// plop();
/// }
/// }
/// \endcode
/// \version 11
bool IndentCaseBlocks;
/// Indent case labels one level from the switch statement.
///
/// When ``false``, use the same indentation level as for the switch
/// statement. Switch statement body is always indented one level more than
/// case labels (except the first block following the case label, which
/// itself indents the code - unless IndentCaseBlocks is enabled).
/// \code
/// false: true:
/// switch (fool) { vs. switch (fool) {
/// case 1: case 1:
/// bar(); bar();
/// break; break;
/// default: default:
/// plop(); plop();
/// } }
/// \endcode
/// \version 3.3
bool IndentCaseLabels;
/// Indent goto labels.
///
/// When ``false``, goto labels are flushed left.
/// \code
/// true: false:
/// int f() { vs. int f() {
/// if (foo()) { if (foo()) {
/// label1: label1:
/// bar(); bar();
/// } }
/// label2: label2:
/// return 1; return 1;
/// } }
/// \endcode
/// \version 10
bool IndentGotoLabels;
/// Indents extern blocks
enum IndentExternBlockStyle : int8_t {
/// Backwards compatible with AfterExternBlock's indenting.
/// \code
/// IndentExternBlock: AfterExternBlock
/// BraceWrapping.AfterExternBlock: true
/// extern "C"
/// {
/// void foo();
/// }
/// \endcode
///
/// \code
/// IndentExternBlock: AfterExternBlock
/// BraceWrapping.AfterExternBlock: false
/// extern "C" {
/// void foo();
/// }
/// \endcode
IEBS_AfterExternBlock,
/// Does not indent extern blocks.
/// \code
/// extern "C" {
/// void foo();
/// }
/// \endcode
IEBS_NoIndent,
/// Indents extern blocks.
/// \code
/// extern "C" {
/// void foo();
/// }
/// \endcode
IEBS_Indent,
};
/// IndentExternBlockStyle is the type of indenting of extern blocks.
/// \version 11
IndentExternBlockStyle IndentExternBlock;
/// Options for indenting preprocessor directives.
enum PPDirectiveIndentStyle : int8_t {
/// Does not indent any directives.
/// \code
/// #if FOO
/// #if BAR
/// #include <foo>
/// #endif
/// #endif
/// \endcode
PPDIS_None,
/// Indents directives after the hash.
/// \code
/// #if FOO
/// # if BAR
/// # include <foo>
/// # endif
/// #endif
/// \endcode
PPDIS_AfterHash,
/// Indents directives before the hash.
/// \code
/// #if FOO
/// #if BAR
/// #include <foo>
/// #endif
/// #endif
/// \endcode
PPDIS_BeforeHash
};
/// The preprocessor directive indenting style to use.
/// \version 6
PPDirectiveIndentStyle IndentPPDirectives;
/// Indent the requires clause in a template. This only applies when
/// ``RequiresClausePosition`` is ``OwnLine``, or ``WithFollowing``.
///
/// In clang-format 12, 13 and 14 it was named ``IndentRequires``.
/// \code
/// true:
/// template <typename It>
/// requires Iterator<It>
/// void sort(It begin, It end) {
/// //....
/// }
///
/// false:
/// template <typename It>
/// requires Iterator<It>
/// void sort(It begin, It end) {
/// //....
/// }
/// \endcode
/// \version 15
bool IndentRequiresClause;
/// The number of columns to use for indentation.
/// \code
/// IndentWidth: 3
///
/// void f() {
/// someFunction();
/// if (true, false) {
/// f();
/// }
/// }
/// \endcode
/// \version 3.7
unsigned IndentWidth;
/// Indent if a function definition or declaration is wrapped after the
/// type.
/// \code
/// true:
/// LoooooooooooooooooooooooooooooooooooooooongReturnType
/// LoooooooooooooooooooooooooooooooongFunctionDeclaration();
///
/// false:
/// LoooooooooooooooooooooooooooooooooooooooongReturnType
/// LoooooooooooooooooooooooooooooooongFunctionDeclaration();
/// \endcode
/// \version 3.7
bool IndentWrappedFunctionNames;
/// Insert braces after control statements (``if``, ``else``, ``for``, ``do``,
/// and ``while``) in C++ unless the control statements are inside macro
/// definitions or the braces would enclose preprocessor directives.
/// \warning
/// Setting this option to ``true`` could lead to incorrect code formatting
/// due to clang-format's lack of complete semantic information. As such,
/// extra care should be taken to review code changes made by this option.
/// \endwarning
/// \code
/// false: true:
///
/// if (isa<FunctionDecl>(D)) vs. if (isa<FunctionDecl>(D)) {
/// handleFunctionDecl(D); handleFunctionDecl(D);
/// else if (isa<VarDecl>(D)) } else if (isa<VarDecl>(D)) {
/// handleVarDecl(D); handleVarDecl(D);
/// else } else {
/// return; return;
/// }
///
/// while (i--) vs. while (i--) {
/// for (auto *A : D.attrs()) for (auto *A : D.attrs()) {
/// handleAttr(A); handleAttr(A);
/// }
/// }
///
/// do vs. do {
/// --i; --i;
/// while (i); } while (i);
/// \endcode
/// \version 15
bool InsertBraces;
/// Insert a newline at end of file if missing.
/// \version 16
bool InsertNewlineAtEOF;
/// The style of inserting trailing commas into container literals.
enum TrailingCommaStyle : int8_t {
/// Do not insert trailing commas.
TCS_None,
/// Insert trailing commas in container literals that were wrapped over
/// multiple lines. Note that this is conceptually incompatible with
/// bin-packing, because the trailing comma is used as an indicator
/// that a container should be formatted one-per-line (i.e. not bin-packed).
/// So inserting a trailing comma counteracts bin-packing.
TCS_Wrapped,
};
/// If set to ``TCS_Wrapped`` will insert trailing commas in container
/// literals (arrays and objects) that wrap across multiple lines.
/// It is currently only available for JavaScript
/// and disabled by default ``TCS_None``.
/// ``InsertTrailingCommas`` cannot be used together with ``BinPackArguments``
/// as inserting the comma disables bin-packing.
/// \code
/// TSC_Wrapped:
/// const someArray = [
/// aaaaaaaaaaaaaaaaaaaaaaaaaa,
/// aaaaaaaaaaaaaaaaaaaaaaaaaa,
/// aaaaaaaaaaaaaaaaaaaaaaaaaa,
/// // ^ inserted
/// ]
/// \endcode
/// \version 11
TrailingCommaStyle InsertTrailingCommas;
/// Separator format of integer literals of different bases.
///
/// If negative, remove separators. If ``0``, leave the literal as is. If
/// positive, insert separators between digits starting from the rightmost
/// digit.
///
/// For example, the config below will leave separators in binary literals
/// alone, insert separators in decimal literals to separate the digits into
/// groups of 3, and remove separators in hexadecimal literals.
/// \code
/// IntegerLiteralSeparator:
/// Binary: 0
/// Decimal: 3
/// Hex: -1
/// \endcode
///
/// You can also specify a minimum number of digits (``BinaryMinDigits``,
/// ``DecimalMinDigits``, and ``HexMinDigits``) the integer literal must
/// have in order for the separators to be inserted.
struct IntegerLiteralSeparatorStyle {
/// Format separators in binary literals.
/// \code{.text}
/// /* -1: */ b = 0b100111101101;
/// /* 0: */ b = 0b10011'11'0110'1;
/// /* 3: */ b = 0b100'111'101'101;
/// /* 4: */ b = 0b1001'1110'1101;
/// \endcode
int8_t Binary;
/// Format separators in binary literals with a minimum number of digits.
/// \code{.text}
/// // Binary: 3
/// // BinaryMinDigits: 7
/// b1 = 0b101101;
/// b2 = 0b1'101'101;
/// \endcode
int8_t BinaryMinDigits;
/// Format separators in decimal literals.
/// \code{.text}
/// /* -1: */ d = 18446744073709550592ull;
/// /* 0: */ d = 184467'440737'0'95505'92ull;
/// /* 3: */ d = 18'446'744'073'709'550'592ull;
/// \endcode
int8_t Decimal;
/// Format separators in decimal literals with a minimum number of digits.
/// \code{.text}
/// // Decimal: 3
/// // DecimalMinDigits: 5
/// d1 = 2023;
/// d2 = 10'000;
/// \endcode
int8_t DecimalMinDigits;
/// Format separators in hexadecimal literals.
/// \code{.text}
/// /* -1: */ h = 0xDEADBEEFDEADBEEFuz;
/// /* 0: */ h = 0xDEAD'BEEF'DE'AD'BEE'Fuz;
/// /* 2: */ h = 0xDE'AD'BE'EF'DE'AD'BE'EFuz;
/// \endcode
int8_t Hex;
/// Format separators in hexadecimal literals with a minimum number of
/// digits.
/// \code{.text}
/// // Hex: 2
/// // HexMinDigits: 6
/// h1 = 0xABCDE;
/// h2 = 0xAB'CD'EF;
/// \endcode
int8_t HexMinDigits;
bool operator==(const IntegerLiteralSeparatorStyle &R) const {
return Binary == R.Binary && BinaryMinDigits == R.BinaryMinDigits &&
Decimal == R.Decimal && DecimalMinDigits == R.DecimalMinDigits &&
Hex == R.Hex && HexMinDigits == R.HexMinDigits;
}
};
/// Format integer literal separators (``'`` for C++ and ``_`` for C#, Java,
/// and JavaScript).
/// \version 16
IntegerLiteralSeparatorStyle IntegerLiteralSeparator;
/// A vector of prefixes ordered by the desired groups for Java imports.
///
/// One group's prefix can be a subset of another - the longest prefix is
/// always matched. Within a group, the imports are ordered lexicographically.
/// Static imports are grouped separately and follow the same group rules.
/// By default, static imports are placed before non-static imports,
/// but this behavior is changed by another option,
/// ``SortJavaStaticImport``.
///
/// In the .clang-format configuration file, this can be configured like
/// in the following yaml example. This will result in imports being
/// formatted as in the Java example below.
/// \code{.yaml}
/// JavaImportGroups: ['com.example', 'com', 'org']
/// \endcode
///
/// \code{.java}
/// import static com.example.function1;
///
/// import static com.test.function2;
///
/// import static org.example.function3;
///
/// import com.example.ClassA;
/// import com.example.Test;
/// import com.example.a.ClassB;
///
/// import com.test.ClassC;
///
/// import org.example.ClassD;
/// \endcode
/// \version 8
std::vector<std::string> JavaImportGroups;
/// Quotation styles for JavaScript strings. Does not affect template
/// strings.
enum JavaScriptQuoteStyle : int8_t {
/// Leave string quotes as they are.
/// \code{.js}
/// string1 = "foo";
/// string2 = 'bar';
/// \endcode
JSQS_Leave,
/// Always use single quotes.
/// \code{.js}
/// string1 = 'foo';
/// string2 = 'bar';
/// \endcode
JSQS_Single,
/// Always use double quotes.
/// \code{.js}
/// string1 = "foo";
/// string2 = "bar";
/// \endcode
JSQS_Double
};
/// The JavaScriptQuoteStyle to use for JavaScript strings.
/// \version 3.9
JavaScriptQuoteStyle JavaScriptQuotes;
// clang-format off
/// Whether to wrap JavaScript import/export statements.
/// \code{.js}
/// true:
/// import {
/// VeryLongImportsAreAnnoying,
/// VeryLongImportsAreAnnoying,
/// VeryLongImportsAreAnnoying,
/// } from 'some/module.js'
///
/// false:
/// import {VeryLongImportsAreAnnoying, VeryLongImportsAreAnnoying, VeryLongImportsAreAnnoying,} from "some/module.js"
/// \endcode
/// \version 3.9
bool JavaScriptWrapImports;
// clang-format on
/// Keep empty lines (up to ``MaxEmptyLinesToKeep``) at end of file.
/// \version 17
bool KeepEmptyLinesAtEOF;
/// If true, the empty line at the start of blocks is kept.
/// \code
/// true: false:
/// if (foo) { vs. if (foo) {
/// bar();
/// bar(); }
/// }
/// \endcode
/// \version 3.7
bool KeepEmptyLinesAtTheStartOfBlocks;
/// Indentation logic for lambda bodies.
enum LambdaBodyIndentationKind : int8_t {
/// Align lambda body relative to the lambda signature. This is the default.
/// \code
/// someMethod(
/// [](SomeReallyLongLambdaSignatureArgument foo) {
/// return;
/// });
/// \endcode
LBI_Signature,
/// For statements within block scope, align lambda body relative to the
/// indentation level of the outer scope the lambda signature resides in.
/// \code
/// someMethod(
/// [](SomeReallyLongLambdaSignatureArgument foo) {
/// return;
/// });
///
/// someMethod(someOtherMethod(
/// [](SomeReallyLongLambdaSignatureArgument foo) {
/// return;
/// }));
/// \endcode
LBI_OuterScope,
};
/// The indentation style of lambda bodies. ``Signature`` (the default)
/// causes the lambda body to be indented one additional level relative to
/// the indentation level of the signature. ``OuterScope`` forces the lambda
/// body to be indented one additional level relative to the parent scope
/// containing the lambda signature.
/// \version 13
LambdaBodyIndentationKind LambdaBodyIndentation;
/// Supported languages.
///
/// When stored in a configuration file, specifies the language, that the
/// configuration targets. When passed to the ``reformat()`` function, enables
/// syntax features specific to the language.
enum LanguageKind : int8_t {
/// Do not use.
LK_None,
/// Should be used for C, C++.
LK_Cpp,
/// Should be used for C#.
LK_CSharp,
/// Should be used for Java.
LK_Java,
/// Should be used for JavaScript.
LK_JavaScript,
/// Should be used for JSON.
LK_Json,
/// Should be used for Objective-C, Objective-C++.
LK_ObjC,
/// Should be used for Protocol Buffers
/// (https://developers.google.com/protocol-buffers/).
LK_Proto,
/// Should be used for TableGen code.
LK_TableGen,
/// Should be used for Protocol Buffer messages in text format
/// (https://developers.google.com/protocol-buffers/).
LK_TextProto,
/// Should be used for Verilog and SystemVerilog.
/// https://standards.ieee.org/ieee/1800/6700/
/// https://sci-hub.st/10.1109/IEEESTD.2018.8299595
LK_Verilog
};
bool isCpp() const { return Language == LK_Cpp || Language == LK_ObjC; }
bool isCSharp() const { return Language == LK_CSharp; }
bool isJson() const { return Language == LK_Json; }
bool isJavaScript() const { return Language == LK_JavaScript; }
bool isVerilog() const { return Language == LK_Verilog; }
bool isProto() const {
return Language == LK_Proto || Language == LK_TextProto;
}
bool isTableGen() const { return Language == LK_TableGen; }
/// Language, this format style is targeted at.
/// \version 3.5
LanguageKind Language;
/// Line ending style.
enum LineEndingStyle : int8_t {
/// Use ``\n``.
LE_LF,
/// Use ``\r\n``.
LE_CRLF,
/// Use ``\n`` unless the input has more lines ending in ``\r\n``.
LE_DeriveLF,
/// Use ``\r\n`` unless the input has more lines ending in ``\n``.
LE_DeriveCRLF,
};
/// Line ending style (``\n`` or ``\r\n``) to use.
/// \version 16
LineEndingStyle LineEnding;
/// A regular expression matching macros that start a block.
/// \code
/// # With:
/// MacroBlockBegin: "^NS_MAP_BEGIN|\
/// NS_TABLE_HEAD$"
/// MacroBlockEnd: "^\
/// NS_MAP_END|\
/// NS_TABLE_.*_END$"
///
/// NS_MAP_BEGIN
/// foo();
/// NS_MAP_END
///
/// NS_TABLE_HEAD
/// bar();
/// NS_TABLE_FOO_END
///
/// # Without:
/// NS_MAP_BEGIN
/// foo();
/// NS_MAP_END
///
/// NS_TABLE_HEAD
/// bar();
/// NS_TABLE_FOO_END
/// \endcode
/// \version 3.7
std::string MacroBlockBegin;
/// A regular expression matching macros that end a block.
/// \version 3.7
std::string MacroBlockEnd;
/// A list of macros of the form \c <definition>=<expansion> .
///
/// Code will be parsed with macros expanded, in order to determine how to
/// interpret and format the macro arguments.
///
/// For example, the code:
/// \code
/// A(a*b);
/// \endcode
///
/// will usually be interpreted as a call to a function A, and the
/// multiplication expression will be formatted as ``a * b``.
///
/// If we specify the macro definition:
/// \code{.yaml}
/// Macros:
/// - A(x)=x
/// \endcode
///
/// the code will now be parsed as a declaration of the variable b of type a*,
/// and formatted as ``a* b`` (depending on pointer-binding rules).
///
/// Features and restrictions:
/// * Both function-like macros and object-like macros are supported.
/// * Macro arguments must be used exactly once in the expansion.
/// * No recursive expansion; macros referencing other macros will be
/// ignored.
/// * Overloading by arity is supported: for example, given the macro
/// definitions A=x, A()=y, A(a)=a
///
/// \code
/// A; -> x;
/// A(); -> y;
/// A(z); -> z;
/// A(a, b); // will not be expanded.
/// \endcode
///
/// \version 17
std::vector<std::string> Macros;
/// The maximum number of consecutive empty lines to keep.
/// \code
/// MaxEmptyLinesToKeep: 1 vs. MaxEmptyLinesToKeep: 0
/// int f() { int f() {
/// int = 1; int i = 1;
/// i = foo();
/// i = foo(); return i;
/// }
/// return i;
/// }
/// \endcode
/// \version 3.7
unsigned MaxEmptyLinesToKeep;
/// Different ways to indent namespace contents.
enum NamespaceIndentationKind : int8_t {
/// Don't indent in namespaces.
/// \code
/// namespace out {
/// int i;
/// namespace in {
/// int i;
/// }
/// }
/// \endcode
NI_None,
/// Indent only in inner namespaces (nested in other namespaces).
/// \code
/// namespace out {
/// int i;
/// namespace in {
/// int i;
/// }
/// }
/// \endcode
NI_Inner,
/// Indent in all namespaces.
/// \code
/// namespace out {
/// int i;
/// namespace in {
/// int i;
/// }
/// }
/// \endcode
NI_All
};
/// The indentation used for namespaces.
/// \version 3.7
NamespaceIndentationKind NamespaceIndentation;
/// A vector of macros which are used to open namespace blocks.
///
/// These are expected to be macros of the form:
/// \code
/// NAMESPACE(<namespace-name>, ...) {
/// <namespace-content>
/// }
/// \endcode
///
/// For example: TESTSUITE
/// \version 9
std::vector<std::string> NamespaceMacros;
/// Controls bin-packing Objective-C protocol conformance list
/// items into as few lines as possible when they go over ``ColumnLimit``.
///
/// If ``Auto`` (the default), delegates to the value in
/// ``BinPackParameters``. If that is ``true``, bin-packs Objective-C
/// protocol conformance list items into as few lines as possible
/// whenever they go over ``ColumnLimit``.
///
/// If ``Always``, always bin-packs Objective-C protocol conformance
/// list items into as few lines as possible whenever they go over
/// ``ColumnLimit``.
///
/// If ``Never``, lays out Objective-C protocol conformance list items
/// onto individual lines whenever they go over ``ColumnLimit``.
///
/// \code{.objc}
/// Always (or Auto, if BinPackParameters=true):
/// @interface ccccccccccccc () <
/// ccccccccccccc, ccccccccccccc,
/// ccccccccccccc, ccccccccccccc> {
/// }
///
/// Never (or Auto, if BinPackParameters=false):
/// @interface ddddddddddddd () <
/// ddddddddddddd,
/// ddddddddddddd,
/// ddddddddddddd,
/// ddddddddddddd> {
/// }
/// \endcode
/// \version 7
BinPackStyle ObjCBinPackProtocolList;
/// The number of characters to use for indentation of ObjC blocks.
/// \code{.objc}
/// ObjCBlockIndentWidth: 4
///
/// [operation setCompletionBlock:^{
/// [self onOperationDone];
/// }];
/// \endcode
/// \version 3.7
unsigned ObjCBlockIndentWidth;
/// Break parameters list into lines when there is nested block
/// parameters in a function call.
/// \code
/// false:
/// - (void)_aMethod
/// {
/// [self.test1 t:self w:self callback:^(typeof(self) self, NSNumber
/// *u, NSNumber *v) {
/// u = c;
/// }]
/// }
/// true:
/// - (void)_aMethod
/// {
/// [self.test1 t:self
/// w:self
/// callback:^(typeof(self) self, NSNumber *u, NSNumber *v) {
/// u = c;
/// }]
/// }
/// \endcode
/// \version 11
bool ObjCBreakBeforeNestedBlockParam;
/// The order in which ObjC property attributes should appear.
///
/// Attributes in code will be sorted in the order specified. Any attributes
/// encountered that are not mentioned in this array will be sorted last, in
/// stable order. Comments between attributes will leave the attributes
/// untouched.
/// \warning
/// Using this option could lead to incorrect code formatting due to
/// clang-format's lack of complete semantic information. As such, extra
/// care should be taken to review code changes made by this option.
/// \endwarning
/// \code{.yaml}
/// ObjCPropertyAttributeOrder: [
/// class, direct,
/// atomic, nonatomic,
/// assign, retain, strong, copy, weak, unsafe_unretained,
/// readonly, readwrite, getter, setter,
/// nullable, nonnull, null_resettable, null_unspecified
/// ]
/// \endcode
/// \version 18
std::vector<std::string> ObjCPropertyAttributeOrder;
/// Add a space after ``@property`` in Objective-C, i.e. use
/// ``@property (readonly)`` instead of ``@property(readonly)``.
/// \version 3.7
bool ObjCSpaceAfterProperty;
/// Add a space in front of an Objective-C protocol list, i.e. use
/// ``Foo <Protocol>`` instead of ``Foo<Protocol>``.
/// \version 3.7
bool ObjCSpaceBeforeProtocolList;
/// Different ways to try to fit all constructor initializers on a line.
enum PackConstructorInitializersStyle : int8_t {
/// Always put each constructor initializer on its own line.
/// \code
/// Constructor()
/// : a(),
/// b()
/// \endcode
PCIS_Never,
/// Bin-pack constructor initializers.
/// \code
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(), bbbbbbbbbbbbbbbbbbbb(),
/// cccccccccccccccccccc()
/// \endcode
PCIS_BinPack,
/// Put all constructor initializers on the current line if they fit.
/// Otherwise, put each one on its own line.
/// \code
/// Constructor() : a(), b()
///
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(),
/// bbbbbbbbbbbbbbbbbbbb(),
/// ddddddddddddd()
/// \endcode
PCIS_CurrentLine,
/// Same as ``PCIS_CurrentLine`` except that if all constructor initializers
/// do not fit on the current line, try to fit them on the next line.
/// \code
/// Constructor() : a(), b()
///
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(), bbbbbbbbbbbbbbbbbbbb(), ddddddddddddd()
///
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(),
/// bbbbbbbbbbbbbbbbbbbb(),
/// cccccccccccccccccccc()
/// \endcode
PCIS_NextLine,
/// Put all constructor initializers on the next line if they fit.
/// Otherwise, put each one on its own line.
/// \code
/// Constructor()
/// : a(), b()
///
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(), bbbbbbbbbbbbbbbbbbbb(), ddddddddddddd()
///
/// Constructor()
/// : aaaaaaaaaaaaaaaaaaaa(),
/// bbbbbbbbbbbbbbbbbbbb(),
/// cccccccccccccccccccc()
/// \endcode
PCIS_NextLineOnly,
};
/// The pack constructor initializers style to use.
/// \version 14
PackConstructorInitializersStyle PackConstructorInitializers;
/// The penalty for breaking around an assignment operator.
/// \version 5
unsigned PenaltyBreakAssignment;
/// The penalty for breaking a function call after ``call(``.
/// \version 3.7
unsigned PenaltyBreakBeforeFirstCallParameter;
/// The penalty for each line break introduced inside a comment.
/// \version 3.7
unsigned PenaltyBreakComment;
/// The penalty for breaking before the first ``<<``.
/// \version 3.7
unsigned PenaltyBreakFirstLessLess;
/// The penalty for breaking after ``(``.
/// \version 14
unsigned PenaltyBreakOpenParenthesis;
/// The penalty for breaking after ``::``.
/// \version 18
unsigned PenaltyBreakScopeResolution;
/// The penalty for each line break introduced inside a string literal.
/// \version 3.7
unsigned PenaltyBreakString;
/// The penalty for breaking after template declaration.
/// \version 7
unsigned PenaltyBreakTemplateDeclaration;
/// The penalty for each character outside of the column limit.
/// \version 3.7
unsigned PenaltyExcessCharacter;
/// Penalty for each character of whitespace indentation
/// (counted relative to leading non-whitespace column).
/// \version 12
unsigned PenaltyIndentedWhitespace;
/// Penalty for putting the return type of a function onto its own line.
/// \version 3.7
unsigned PenaltyReturnTypeOnItsOwnLine;
/// The ``&``, ``&&`` and ``*`` alignment style.
enum PointerAlignmentStyle : int8_t {
/// Align pointer to the left.
/// \code
/// int* a;
/// \endcode
PAS_Left,
/// Align pointer to the right.
/// \code
/// int *a;
/// \endcode
PAS_Right,
/// Align pointer in the middle.
/// \code
/// int * a;
/// \endcode
PAS_Middle
};
/// Pointer and reference alignment style.
/// \version 3.7
PointerAlignmentStyle PointerAlignment;
/// The number of columns to use for indentation of preprocessor statements.
/// When set to -1 (default) ``IndentWidth`` is used also for preprocessor
/// statements.
/// \code
/// PPIndentWidth: 1
///
/// #ifdef __linux__
/// # define FOO
/// #else
/// # define BAR
/// #endif
/// \endcode
/// \version 13
int PPIndentWidth;
/// Different specifiers and qualifiers alignment styles.
enum QualifierAlignmentStyle : int8_t {
/// Don't change specifiers/qualifiers to either Left or Right alignment
/// (default).
/// \code
/// int const a;
/// const int *a;
/// \endcode
QAS_Leave,
/// Change specifiers/qualifiers to be left-aligned.
/// \code
/// const int a;
/// const int *a;
/// \endcode
QAS_Left,
/// Change specifiers/qualifiers to be right-aligned.
/// \code
/// int const a;
/// int const *a;
/// \endcode
QAS_Right,
/// Change specifiers/qualifiers to be aligned based on ``QualifierOrder``.
/// With:
/// \code{.yaml}
/// QualifierOrder: ['inline', 'static', 'type', 'const']
/// \endcode
///
/// \code
///
/// int const a;
/// int const *a;
/// \endcode
QAS_Custom
};
/// Different ways to arrange specifiers and qualifiers (e.g. const/volatile).
/// \warning
/// Setting ``QualifierAlignment`` to something other than ``Leave``, COULD
/// lead to incorrect code formatting due to incorrect decisions made due to
/// clang-formats lack of complete semantic information.
/// As such extra care should be taken to review code changes made by the use
/// of this option.
/// \endwarning
/// \version 14
QualifierAlignmentStyle QualifierAlignment;
/// The order in which the qualifiers appear.
/// Order is an array that can contain any of the following:
///
/// * const
/// * inline
/// * static
/// * friend
/// * constexpr
/// * volatile
/// * restrict
/// * type
///
/// \note
/// it MUST contain 'type'.
/// \endnote
///
/// Items to the left of 'type' will be placed to the left of the type and
/// aligned in the order supplied. Items to the right of 'type' will be
/// placed to the right of the type and aligned in the order supplied.
///
/// \code{.yaml}
/// QualifierOrder: ['inline', 'static', 'type', 'const', 'volatile' ]
/// \endcode
/// \version 14
std::vector<std::string> QualifierOrder;
/// See documentation of ``RawStringFormats``.
struct RawStringFormat {
/// The language of this raw string.
LanguageKind Language;
/// A list of raw string delimiters that match this language.
std::vector<std::string> Delimiters;
/// A list of enclosing function names that match this language.
std::vector<std::string> EnclosingFunctions;
/// The canonical delimiter for this language.
std::string CanonicalDelimiter;
/// The style name on which this raw string format is based on.
/// If not specified, the raw string format is based on the style that this
/// format is based on.
std::string BasedOnStyle;
bool operator==(const RawStringFormat &Other) const {
return Language == Other.Language && Delimiters == Other.Delimiters &&
EnclosingFunctions == Other.EnclosingFunctions &&
CanonicalDelimiter == Other.CanonicalDelimiter &&
BasedOnStyle == Other.BasedOnStyle;
}
};
/// Defines hints for detecting supported languages code blocks in raw
/// strings.
///
/// A raw string with a matching delimiter or a matching enclosing function
/// name will be reformatted assuming the specified language based on the
/// style for that language defined in the .clang-format file. If no style has
/// been defined in the .clang-format file for the specific language, a
/// predefined style given by 'BasedOnStyle' is used. If 'BasedOnStyle' is not
/// found, the formatting is based on llvm style. A matching delimiter takes
/// precedence over a matching enclosing function name for determining the
/// language of the raw string contents.
///
/// If a canonical delimiter is specified, occurrences of other delimiters for
/// the same language will be updated to the canonical if possible.
///
/// There should be at most one specification per language and each delimiter
/// and enclosing function should not occur in multiple specifications.
///
/// To configure this in the .clang-format file, use:
/// \code{.yaml}
/// RawStringFormats:
/// - Language: TextProto
/// Delimiters:
/// - 'pb'
/// - 'proto'
/// EnclosingFunctions:
/// - 'PARSE_TEXT_PROTO'
/// BasedOnStyle: google
/// - Language: Cpp
/// Delimiters:
/// - 'cc'
/// - 'cpp'
/// BasedOnStyle: llvm
/// CanonicalDelimiter: 'cc'
/// \endcode
/// \version 6
std::vector<RawStringFormat> RawStringFormats;
/// \brief The ``&`` and ``&&`` alignment style.
enum ReferenceAlignmentStyle : int8_t {
/// Align reference like ``PointerAlignment``.
RAS_Pointer,
/// Align reference to the left.
/// \code
/// int& a;
/// \endcode
RAS_Left,
/// Align reference to the right.
/// \code
/// int &a;
/// \endcode
RAS_Right,
/// Align reference in the middle.
/// \code
/// int & a;
/// \endcode
RAS_Middle
};
/// \brief Reference alignment style (overrides ``PointerAlignment`` for
/// references).
/// \version 13
ReferenceAlignmentStyle ReferenceAlignment;
// clang-format off
/// If ``true``, clang-format will attempt to re-flow comments. That is it
/// will touch a comment and *reflow* long comments into new lines, trying to
/// obey the ``ColumnLimit``.
/// \code
/// false:
/// // veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongComment with plenty of information
/// /* second veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongComment with plenty of information */
///
/// true:
/// // veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongComment with plenty of
/// // information
/// /* second veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongComment with plenty of
/// * information */
/// \endcode
/// \version 3.8
bool ReflowComments;
// clang-format on
/// Remove optional braces of control statements (``if``, ``else``, ``for``,
/// and ``while``) in C++ according to the LLVM coding style.
/// \warning
/// This option will be renamed and expanded to support other styles.
/// \endwarning
/// \warning
/// Setting this option to ``true`` could lead to incorrect code formatting
/// due to clang-format's lack of complete semantic information. As such,
/// extra care should be taken to review code changes made by this option.
/// \endwarning
/// \code
/// false: true:
///
/// if (isa<FunctionDecl>(D)) { vs. if (isa<FunctionDecl>(D))
/// handleFunctionDecl(D); handleFunctionDecl(D);
/// } else if (isa<VarDecl>(D)) { else if (isa<VarDecl>(D))
/// handleVarDecl(D); handleVarDecl(D);
/// }
///
/// if (isa<VarDecl>(D)) { vs. if (isa<VarDecl>(D)) {
/// for (auto *A : D.attrs()) { for (auto *A : D.attrs())
/// if (shouldProcessAttr(A)) { if (shouldProcessAttr(A))
/// handleAttr(A); handleAttr(A);
/// } }
/// }
/// }
///
/// if (isa<FunctionDecl>(D)) { vs. if (isa<FunctionDecl>(D))
/// for (auto *A : D.attrs()) { for (auto *A : D.attrs())
/// handleAttr(A); handleAttr(A);
/// }
/// }
///
/// if (auto *D = (T)(D)) { vs. if (auto *D = (T)(D)) {
/// if (shouldProcess(D)) { if (shouldProcess(D))
/// handleVarDecl(D); handleVarDecl(D);
/// } else { else
/// markAsIgnored(D); markAsIgnored(D);
/// } }
/// }
///
/// if (a) { vs. if (a)
/// b(); b();
/// } else { else if (c)
/// if (c) { d();
/// d(); else
/// } else { e();
/// e();
/// }
/// }
/// \endcode
/// \version 14
bool RemoveBracesLLVM;
/// Types of redundant parentheses to remove.
enum RemoveParenthesesStyle : int8_t {
/// Do not remove parentheses.
/// \code
/// class __declspec((dllimport)) X {};
/// co_return (((0)));
/// return ((a + b) - ((c + d)));
/// \endcode
RPS_Leave,
/// Replace multiple parentheses with single parentheses.
/// \code
/// class __declspec(dllimport) X {};
/// co_return (0);
/// return ((a + b) - (c + d));
/// \endcode
RPS_MultipleParentheses,
/// Also remove parentheses enclosing the expression in a
/// ``return``/``co_return`` statement.
/// \code
/// class __declspec(dllimport) X {};
/// co_return 0;
/// return (a + b) - (c + d);
/// \endcode
RPS_ReturnStatement,
};
/// Remove redundant parentheses.
/// \warning
/// Setting this option to any value other than ``Leave`` could lead to
/// incorrect code formatting due to clang-format's lack of complete semantic
/// information. As such, extra care should be taken to review code changes
/// made by this option.
/// \endwarning
/// \version 17
RemoveParenthesesStyle RemoveParentheses;
/// Remove semicolons after the closing braces of functions and
/// constructors/destructors.
/// \warning
/// Setting this option to ``true`` could lead to incorrect code formatting
/// due to clang-format's lack of complete semantic information. As such,
/// extra care should be taken to review code changes made by this option.
/// \endwarning
/// \code
/// false: true:
///
/// int max(int a, int b) { int max(int a, int b) {
/// return a > b ? a : b; return a > b ? a : b;
/// }; }
///
/// \endcode
/// \version 16
bool RemoveSemicolon;
/// \brief The possible positions for the requires clause. The
/// ``IndentRequires`` option is only used if the ``requires`` is put on the
/// start of a line.
enum RequiresClausePositionStyle : int8_t {
/// Always put the ``requires`` clause on its own line.
/// \code
/// template <typename T>
/// requires C<T>
/// struct Foo {...
///
/// template <typename T>
/// requires C<T>
/// void bar(T t) {...
///
/// template <typename T>
/// void baz(T t)
/// requires C<T>
/// {...
/// \endcode
RCPS_OwnLine,
/// Try to put the clause together with the preceding part of a declaration.
/// For class templates: stick to the template declaration.
/// For function templates: stick to the template declaration.
/// For function declaration followed by a requires clause: stick to the
/// parameter list.
/// \code
/// template <typename T> requires C<T>
/// struct Foo {...
///
/// template <typename T> requires C<T>
/// void bar(T t) {...
///
/// template <typename T>
/// void baz(T t) requires C<T>
/// {...
/// \endcode
RCPS_WithPreceding,
/// Try to put the ``requires`` clause together with the class or function
/// declaration.
/// \code
/// template <typename T>
/// requires C<T> struct Foo {...
///
/// template <typename T>
/// requires C<T> void bar(T t) {...
///
/// template <typename T>
/// void baz(T t)
/// requires C<T> {...
/// \endcode
RCPS_WithFollowing,
/// Try to put everything in the same line if possible. Otherwise normal
/// line breaking rules take over.
/// \code
/// // Fitting:
/// template <typename T> requires C<T> struct Foo {...
///
/// template <typename T> requires C<T> void bar(T t) {...
///
/// template <typename T> void bar(T t) requires C<T> {...
///
/// // Not fitting, one possible example:
/// template <typename LongName>
/// requires C<LongName>
/// struct Foo {...
///
/// template <typename LongName>
/// requires C<LongName>
/// void bar(LongName ln) {
///
/// template <typename LongName>
/// void bar(LongName ln)
/// requires C<LongName> {
/// \endcode
RCPS_SingleLine,
};
/// \brief The position of the ``requires`` clause.
/// \version 15
RequiresClausePositionStyle RequiresClausePosition;
/// Indentation logic for requires expression bodies.
enum RequiresExpressionIndentationKind : int8_t {
/// Align requires expression body relative to the indentation level of the
/// outer scope the requires expression resides in.
/// This is the default.
/// \code
/// template <typename T>
/// concept C = requires(T t) {
/// ...
/// }
/// \endcode
REI_OuterScope,
/// Align requires expression body relative to the ``requires`` keyword.
/// \code
/// template <typename T>
/// concept C = requires(T t) {
/// ...
/// }
/// \endcode
REI_Keyword,
};
/// The indentation used for requires expression bodies.
/// \version 16
RequiresExpressionIndentationKind RequiresExpressionIndentation;
/// \brief The style if definition blocks should be separated.
enum SeparateDefinitionStyle : int8_t {
/// Leave definition blocks as they are.
SDS_Leave,
/// Insert an empty line between definition blocks.
SDS_Always,
/// Remove any empty line between definition blocks.
SDS_Never
};
/// Specifies the use of empty lines to separate definition blocks, including
/// classes, structs, enums, and functions.
/// \code
/// Never v.s. Always
/// #include <cstring> #include <cstring>
/// struct Foo {
/// int a, b, c; struct Foo {
/// }; int a, b, c;
/// namespace Ns { };
/// class Bar {
/// public: namespace Ns {
/// struct Foobar { class Bar {
/// int a; public:
/// int b; struct Foobar {
/// }; int a;
/// private: int b;
/// int t; };
/// int method1() {
/// // ... private:
/// } int t;
/// enum List {
/// ITEM1, int method1() {
/// ITEM2 // ...
/// }; }
/// template<typename T>
/// int method2(T x) { enum List {
/// // ... ITEM1,
/// } ITEM2
/// int i, j, k; };
/// int method3(int par) {
/// // ... template<typename T>
/// } int method2(T x) {
/// }; // ...
/// class C {}; }
/// }
/// int i, j, k;
///
/// int method3(int par) {
/// // ...
/// }
/// };
///
/// class C {};
/// }
/// \endcode
/// \version 14
SeparateDefinitionStyle SeparateDefinitionBlocks;
/// The maximal number of unwrapped lines that a short namespace spans.
/// Defaults to 1.
///
/// This determines the maximum length of short namespaces by counting
/// unwrapped lines (i.e. containing neither opening nor closing
/// namespace brace) and makes "FixNamespaceComments" omit adding
/// end comments for those.
/// \code
/// ShortNamespaceLines: 1 vs. ShortNamespaceLines: 0
/// namespace a { namespace a {
/// int foo; int foo;
/// } } // namespace a
///
/// ShortNamespaceLines: 1 vs. ShortNamespaceLines: 0
/// namespace b { namespace b {
/// int foo; int foo;
/// int bar; int bar;
/// } // namespace b } // namespace b
/// \endcode
/// \version 13
unsigned ShortNamespaceLines;
/// Do not format macro definition body.
/// \version 18
bool SkipMacroDefinitionBody;
/// Include sorting options.
enum SortIncludesOptions : int8_t {
/// Includes are never sorted.
/// \code
/// #include "B/A.h"
/// #include "A/B.h"
/// #include "a/b.h"
/// #include "A/b.h"
/// #include "B/a.h"
/// \endcode
SI_Never,
/// Includes are sorted in an ASCIIbetical or case sensitive fashion.
/// \code
/// #include "A/B.h"
/// #include "A/b.h"
/// #include "B/A.h"
/// #include "B/a.h"
/// #include "a/b.h"
/// \endcode
SI_CaseSensitive,
/// Includes are sorted in an alphabetical or case insensitive fashion.
/// \code
/// #include "A/B.h"
/// #include "A/b.h"
/// #include "a/b.h"
/// #include "B/A.h"
/// #include "B/a.h"
/// \endcode
SI_CaseInsensitive,
};
/// Controls if and how clang-format will sort ``#includes``.
/// \version 3.8
SortIncludesOptions SortIncludes;
/// Position for Java Static imports.
enum SortJavaStaticImportOptions : int8_t {
/// Static imports are placed before non-static imports.
/// \code{.java}
/// import static org.example.function1;
///
/// import org.example.ClassA;
/// \endcode
SJSIO_Before,
/// Static imports are placed after non-static imports.
/// \code{.java}
/// import org.example.ClassA;
///
/// import static org.example.function1;
/// \endcode
SJSIO_After,
};
/// When sorting Java imports, by default static imports are placed before
/// non-static imports. If ``JavaStaticImportAfterImport`` is ``After``,
/// static imports are placed after non-static imports.
/// \version 12
SortJavaStaticImportOptions SortJavaStaticImport;
/// Using declaration sorting options.
enum SortUsingDeclarationsOptions : int8_t {
/// Using declarations are never sorted.
/// \code
/// using std::chrono::duration_cast;
/// using std::move;
/// using boost::regex;
/// using boost::regex_constants::icase;
/// using std::string;
/// \endcode
SUD_Never,
/// Using declarations are sorted in the order defined as follows:
/// Split the strings by "::" and discard any initial empty strings. Sort
/// the lists of names lexicographically, and within those groups, names are
/// in case-insensitive lexicographic order.
/// \code
/// using boost::regex;
/// using boost::regex_constants::icase;
/// using std::chrono::duration_cast;
/// using std::move;
/// using std::string;
/// \endcode
SUD_Lexicographic,
/// Using declarations are sorted in the order defined as follows:
/// Split the strings by "::" and discard any initial empty strings. The
/// last element of each list is a non-namespace name; all others are
/// namespace names. Sort the lists of names lexicographically, where the
/// sort order of individual names is that all non-namespace names come
/// before all namespace names, and within those groups, names are in
/// case-insensitive lexicographic order.
/// \code
/// using boost::regex;
/// using boost::regex_constants::icase;
/// using std::move;
/// using std::string;
/// using std::chrono::duration_cast;
/// \endcode
SUD_LexicographicNumeric,
};
/// Controls if and how clang-format will sort using declarations.
/// \version 5
SortUsingDeclarationsOptions SortUsingDeclarations;
/// If ``true``, a space is inserted after C style casts.
/// \code
/// true: false:
/// (int) i; vs. (int)i;
/// \endcode
/// \version 3.5
bool SpaceAfterCStyleCast;
/// If ``true``, a space is inserted after the logical not operator (``!``).
/// \code
/// true: false:
/// ! someExpression(); vs. !someExpression();
/// \endcode
/// \version 9
bool SpaceAfterLogicalNot;
/// If \c true, a space will be inserted after the 'template' keyword.
/// \code
/// true: false:
/// template <int> void foo(); vs. template<int> void foo();
/// \endcode
/// \version 4
bool SpaceAfterTemplateKeyword;
/// Different ways to put a space before opening parentheses.
enum SpaceAroundPointerQualifiersStyle : int8_t {
/// Don't ensure spaces around pointer qualifiers and use PointerAlignment
/// instead.
/// \code
/// PointerAlignment: Left PointerAlignment: Right
/// void* const* x = NULL; vs. void *const *x = NULL;
/// \endcode
SAPQ_Default,
/// Ensure that there is a space before pointer qualifiers.
/// \code
/// PointerAlignment: Left PointerAlignment: Right
/// void* const* x = NULL; vs. void * const *x = NULL;
/// \endcode
SAPQ_Before,
/// Ensure that there is a space after pointer qualifiers.
/// \code
/// PointerAlignment: Left PointerAlignment: Right
/// void* const * x = NULL; vs. void *const *x = NULL;
/// \endcode
SAPQ_After,
/// Ensure that there is a space both before and after pointer qualifiers.
/// \code
/// PointerAlignment: Left PointerAlignment: Right
/// void* const * x = NULL; vs. void * const *x = NULL;
/// \endcode
SAPQ_Both,
};
/// Defines in which cases to put a space before or after pointer qualifiers
/// \version 12
SpaceAroundPointerQualifiersStyle SpaceAroundPointerQualifiers;
/// If ``false``, spaces will be removed before assignment operators.
/// \code
/// true: false:
/// int a = 5; vs. int a= 5;
/// a += 42; a+= 42;
/// \endcode
/// \version 3.7
bool SpaceBeforeAssignmentOperators;
/// If ``false``, spaces will be removed before case colon.
/// \code
/// true: false
/// switch (x) { vs. switch (x) {
/// case 1 : break; case 1: break;
/// } }
/// \endcode
/// \version 12
bool SpaceBeforeCaseColon;
/// If ``true``, a space will be inserted before a C++11 braced list
/// used to initialize an object (after the preceding identifier or type).
/// \code
/// true: false:
/// Foo foo { bar }; vs. Foo foo{ bar };
/// Foo {}; Foo{};
/// vector<int> { 1, 2, 3 }; vector<int>{ 1, 2, 3 };
/// new int[3] { 1, 2, 3 }; new int[3]{ 1, 2, 3 };
/// \endcode
/// \version 7
bool SpaceBeforeCpp11BracedList;
/// If ``false``, spaces will be removed before constructor initializer
/// colon.
/// \code
/// true: false:
/// Foo::Foo() : a(a) {} Foo::Foo(): a(a) {}
/// \endcode
/// \version 7
bool SpaceBeforeCtorInitializerColon;
/// If ``false``, spaces will be removed before inheritance colon.
/// \code
/// true: false:
/// class Foo : Bar {} vs. class Foo: Bar {}
/// \endcode
/// \version 7
bool SpaceBeforeInheritanceColon;
/// If ``true``, a space will be added before a JSON colon. For other
/// languages, e.g. JavaScript, use ``SpacesInContainerLiterals`` instead.
/// \code
/// true: false:
/// { {
/// "key" : "value" vs. "key": "value"
/// } }
/// \endcode
/// \version 17
bool SpaceBeforeJsonColon;
/// Different ways to put a space before opening parentheses.
enum SpaceBeforeParensStyle : int8_t {
/// This is **deprecated** and replaced by ``Custom`` below, with all
/// ``SpaceBeforeParensOptions`` but ``AfterPlacementOperator`` set to
/// ``false``.
SBPO_Never,
/// Put a space before opening parentheses only after control statement
/// keywords (``for/if/while...``).
/// \code
/// void f() {
/// if (true) {
/// f();
/// }
/// }
/// \endcode
SBPO_ControlStatements,
/// Same as ``SBPO_ControlStatements`` except this option doesn't apply to
/// ForEach and If macros. This is useful in projects where ForEach/If
/// macros are treated as function calls instead of control statements.
/// ``SBPO_ControlStatementsExceptForEachMacros`` remains an alias for
/// backward compatibility.
/// \code
/// void f() {
/// Q_FOREACH(...) {
/// f();
/// }
/// }
/// \endcode
SBPO_ControlStatementsExceptControlMacros,
/// Put a space before opening parentheses only if the parentheses are not
/// empty i.e. '()'
/// \code
/// void() {
/// if (true) {
/// f();
/// g (x, y, z);
/// }
/// }
/// \endcode
SBPO_NonEmptyParentheses,
/// Always put a space before opening parentheses, except when it's
/// prohibited by the syntax rules (in function-like macro definitions) or
/// when determined by other style rules (after unary operators, opening
/// parentheses, etc.)
/// \code
/// void f () {
/// if (true) {
/// f ();
/// }
/// }
/// \endcode
SBPO_Always,
/// Configure each individual space before parentheses in
/// ``SpaceBeforeParensOptions``.
SBPO_Custom,
};
/// Defines in which cases to put a space before opening parentheses.
/// \version 3.5
SpaceBeforeParensStyle SpaceBeforeParens;
/// Precise control over the spacing before parentheses.
/// \code
/// # Should be declared this way:
/// SpaceBeforeParens: Custom
/// SpaceBeforeParensOptions:
/// AfterControlStatements: true
/// AfterFunctionDefinitionName: true
/// \endcode
struct SpaceBeforeParensCustom {
/// If ``true``, put space between control statement keywords
/// (for/if/while...) and opening parentheses.
/// \code
/// true: false:
/// if (...) {} vs. if(...) {}
/// \endcode
bool AfterControlStatements;
/// If ``true``, put space between foreach macros and opening parentheses.
/// \code
/// true: false:
/// FOREACH (...) vs. FOREACH(...)
/// <loop-body> <loop-body>
/// \endcode
bool AfterForeachMacros;
/// If ``true``, put a space between function declaration name and opening
/// parentheses.
/// \code
/// true: false:
/// void f (); vs. void f();
/// \endcode
bool AfterFunctionDeclarationName;
/// If ``true``, put a space between function definition name and opening
/// parentheses.
/// \code
/// true: false:
/// void f () {} vs. void f() {}
/// \endcode
bool AfterFunctionDefinitionName;
/// If ``true``, put space between if macros and opening parentheses.
/// \code
/// true: false:
/// IF (...) vs. IF(...)
/// <conditional-body> <conditional-body>
/// \endcode
bool AfterIfMacros;
/// If ``true``, put a space between operator overloading and opening
/// parentheses.
/// \code
/// true: false:
/// void operator++ (int a); vs. void operator++(int a);
/// object.operator++ (10); object.operator++(10);
/// \endcode
bool AfterOverloadedOperator;
/// If ``true``, put a space between operator ``new``/``delete`` and opening
/// parenthesis.
/// \code
/// true: false:
/// new (buf) T; vs. new(buf) T;
/// delete (buf) T; delete(buf) T;
/// \endcode
bool AfterPlacementOperator;
/// If ``true``, put space between requires keyword in a requires clause and
/// opening parentheses, if there is one.
/// \code
/// true: false:
/// template<typename T> vs. template<typename T>
/// requires (A<T> && B<T>) requires(A<T> && B<T>)
/// ... ...
/// \endcode
bool AfterRequiresInClause;
/// If ``true``, put space between requires keyword in a requires expression
/// and opening parentheses.
/// \code
/// true: false:
/// template<typename T> vs. template<typename T>
/// concept C = requires (T t) { concept C = requires(T t) {
/// ... ...
/// } }
/// \endcode
bool AfterRequiresInExpression;
/// If ``true``, put a space before opening parentheses only if the
/// parentheses are not empty.
/// \code
/// true: false:
/// void f (int a); vs. void f();
/// f (a); f();
/// \endcode
bool BeforeNonEmptyParentheses;
SpaceBeforeParensCustom()
: AfterControlStatements(false), AfterForeachMacros(false),
AfterFunctionDeclarationName(false),
AfterFunctionDefinitionName(false), AfterIfMacros(false),
AfterOverloadedOperator(false), AfterPlacementOperator(true),
AfterRequiresInClause(false), AfterRequiresInExpression(false),
BeforeNonEmptyParentheses(false) {}
bool operator==(const SpaceBeforeParensCustom &Other) const {
return AfterControlStatements == Other.AfterControlStatements &&
AfterForeachMacros == Other.AfterForeachMacros &&
AfterFunctionDeclarationName ==
Other.AfterFunctionDeclarationName &&
AfterFunctionDefinitionName == Other.AfterFunctionDefinitionName &&
AfterIfMacros == Other.AfterIfMacros &&
AfterOverloadedOperator == Other.AfterOverloadedOperator &&
AfterPlacementOperator == Other.AfterPlacementOperator &&
AfterRequiresInClause == Other.AfterRequiresInClause &&
AfterRequiresInExpression == Other.AfterRequiresInExpression &&
BeforeNonEmptyParentheses == Other.BeforeNonEmptyParentheses;
}
};
/// Control of individual space before parentheses.
///
/// If ``SpaceBeforeParens`` is set to ``Custom``, use this to specify
/// how each individual space before parentheses case should be handled.
/// Otherwise, this is ignored.
/// \code{.yaml}
/// # Example of usage:
/// SpaceBeforeParens: Custom
/// SpaceBeforeParensOptions:
/// AfterControlStatements: true
/// AfterFunctionDefinitionName: true
/// \endcode
/// \version 14
SpaceBeforeParensCustom SpaceBeforeParensOptions;
/// If ``true``, spaces will be before ``[``.
/// Lambdas will not be affected. Only the first ``[`` will get a space added.
/// \code
/// true: false:
/// int a [5]; vs. int a[5];
/// int a [5][5]; vs. int a[5][5];
/// \endcode
/// \version 10
bool SpaceBeforeSquareBrackets;
/// If ``false``, spaces will be removed before range-based for loop
/// colon.
/// \code
/// true: false:
/// for (auto v : values) {} vs. for(auto v: values) {}
/// \endcode
/// \version 7
bool SpaceBeforeRangeBasedForLoopColon;
/// If ``true``, spaces will be inserted into ``{}``.
/// \code
/// true: false:
/// void f() { } vs. void f() {}
/// while (true) { } while (true) {}
/// \endcode
/// \version 10
bool SpaceInEmptyBlock;
/// If ``true``, spaces may be inserted into ``()``.
/// This option is **deprecated**. See ``InEmptyParentheses`` of
/// ``SpacesInParensOptions``.
/// \version 3.7
// bool SpaceInEmptyParentheses;
/// The number of spaces before trailing line comments
/// (``//`` - comments).
///
/// This does not affect trailing block comments (``/*`` - comments) as those
/// commonly have different usage patterns and a number of special cases. In
/// the case of Verilog, it doesn't affect a comment right after the opening
/// parenthesis in the port or parameter list in a module header, because it
/// is probably for the port on the following line instead of the parenthesis
/// it follows.
/// \code
/// SpacesBeforeTrailingComments: 3
/// void f() {
/// if (true) { // foo1
/// f(); // bar
/// } // foo
/// }
/// \endcode
/// \version 3.7
unsigned SpacesBeforeTrailingComments;
/// Styles for adding spacing after ``<`` and before ``>``
/// in template argument lists.
enum SpacesInAnglesStyle : int8_t {
/// Remove spaces after ``<`` and before ``>``.
/// \code
/// static_cast<int>(arg);
/// std::function<void(int)> fct;
/// \endcode
SIAS_Never,
/// Add spaces after ``<`` and before ``>``.
/// \code
/// static_cast< int >(arg);
/// std::function< void(int) > fct;
/// \endcode
SIAS_Always,
/// Keep a single space after ``<`` and before ``>`` if any spaces were
/// present. Option ``Standard: Cpp03`` takes precedence.
SIAS_Leave
};
/// The SpacesInAnglesStyle to use for template argument lists.
/// \version 3.4
SpacesInAnglesStyle SpacesInAngles;
/// If ``true``, spaces will be inserted around if/for/switch/while
/// conditions.
/// This option is **deprecated**. See ``InConditionalStatements`` of
/// ``SpacesInParensOptions``.
/// \version 10
// bool SpacesInConditionalStatement;
/// If ``true``, spaces are inserted inside container literals (e.g. ObjC and
/// Javascript array and dict literals). For JSON, use
/// ``SpaceBeforeJsonColon`` instead.
/// \code{.js}
/// true: false:
/// var arr = [ 1, 2, 3 ]; vs. var arr = [1, 2, 3];
/// f({a : 1, b : 2, c : 3}); f({a: 1, b: 2, c: 3});
/// \endcode
/// \version 3.7
bool SpacesInContainerLiterals;
/// If ``true``, spaces may be inserted into C style casts.
/// This option is **deprecated**. See ``InCStyleCasts`` of
/// ``SpacesInParensOptions``.
/// \version 3.7
// bool SpacesInCStyleCastParentheses;
/// Control of spaces within a single line comment.
struct SpacesInLineComment {
/// The minimum number of spaces at the start of the comment.
unsigned Minimum;
/// The maximum number of spaces at the start of the comment.
unsigned Maximum;
};
/// How many spaces are allowed at the start of a line comment. To disable the
/// maximum set it to ``-1``, apart from that the maximum takes precedence
/// over the minimum.
/// \code
/// Minimum = 1
/// Maximum = -1
/// // One space is forced
///
/// // but more spaces are possible
///
/// Minimum = 0
/// Maximum = 0
/// //Forces to start every comment directly after the slashes
/// \endcode
///
/// Note that in line comment sections the relative indent of the subsequent
/// lines is kept, that means the following:
/// \code
/// before: after:
/// Minimum: 1
/// //if (b) { // if (b) {
/// // return true; // return true;
/// //} // }
///
/// Maximum: 0
/// /// List: ///List:
/// /// - Foo /// - Foo
/// /// - Bar /// - Bar
/// \endcode
///
/// This option has only effect if ``ReflowComments`` is set to ``true``.
/// \version 13
SpacesInLineComment SpacesInLineCommentPrefix;
/// Different ways to put a space before opening and closing parentheses.
enum SpacesInParensStyle : int8_t {
/// Never put a space in parentheses.
/// \code
/// void f() {
/// if(true) {
/// f();
/// }
/// }
/// \endcode
SIPO_Never,
/// Configure each individual space in parentheses in
/// `SpacesInParensOptions`.
SIPO_Custom,
};
/// If ``true``, spaces will be inserted after ``(`` and before ``)``.
/// This option is **deprecated**. The previous behavior is preserved by using
/// ``SpacesInParens`` with ``Custom`` and by setting all
/// ``SpacesInParensOptions`` to ``true`` except for ``InCStyleCasts`` and
/// ``InEmptyParentheses``.
/// \version 3.7
// bool SpacesInParentheses;
/// Defines in which cases spaces will be inserted after ``(`` and before
/// ``)``.
/// \version 17
SpacesInParensStyle SpacesInParens;
/// Precise control over the spacing in parentheses.
/// \code
/// # Should be declared this way:
/// SpacesInParens: Custom
/// SpacesInParensOptions:
/// InConditionalStatements: true
/// Other: true
/// \endcode
struct SpacesInParensCustom {
/// Put a space in parentheses only inside conditional statements
/// (``for/if/while/switch...``).
/// \code
/// true: false:
/// if ( a ) { ... } vs. if (a) { ... }
/// while ( i < 5 ) { ... } while (i < 5) { ... }
/// \endcode
bool InConditionalStatements;
/// Put a space in C style casts.
/// \code
/// true: false:
/// x = ( int32 )y vs. x = (int32)y
/// \endcode
bool InCStyleCasts;
/// Put a space in parentheses only if the parentheses are empty i.e. '()'
/// \code
/// true: false:
/// void f( ) { vs. void f() {
/// int x[] = {foo( ), bar( )}; int x[] = {foo(), bar()};
/// if (true) { if (true) {
/// f( ); f();
/// } }
/// } }
/// \endcode
bool InEmptyParentheses;
/// Put a space in parentheses not covered by preceding options.
/// \code
/// true: false:
/// t f( Deleted & ) & = delete; vs. t f(Deleted &) & = delete;
/// \endcode
bool Other;
SpacesInParensCustom()
: InConditionalStatements(false), InCStyleCasts(false),
InEmptyParentheses(false), Other(false) {}
SpacesInParensCustom(bool InConditionalStatements, bool InCStyleCasts,
bool InEmptyParentheses, bool Other)
: InConditionalStatements(InConditionalStatements),
InCStyleCasts(InCStyleCasts), InEmptyParentheses(InEmptyParentheses),
Other(Other) {}
bool operator==(const SpacesInParensCustom &R) const {
return InConditionalStatements == R.InConditionalStatements &&
InCStyleCasts == R.InCStyleCasts &&
InEmptyParentheses == R.InEmptyParentheses && Other == R.Other;
}
bool operator!=(const SpacesInParensCustom &R) const {
return !(*this == R);
}
};
/// Control of individual spaces in parentheses.
///
/// If ``SpacesInParens`` is set to ``Custom``, use this to specify
/// how each individual space in parentheses case should be handled.
/// Otherwise, this is ignored.
/// \code{.yaml}
/// # Example of usage:
/// SpacesInParens: Custom
/// SpacesInParensOptions:
/// InConditionalStatements: true
/// InEmptyParentheses: true
/// \endcode
/// \version 17
SpacesInParensCustom SpacesInParensOptions;
/// If ``true``, spaces will be inserted after ``[`` and before ``]``.
/// Lambdas without arguments or unspecified size array declarations will not
/// be affected.
/// \code
/// true: false:
/// int a[ 5 ]; vs. int a[5];
/// std::unique_ptr<int[]> foo() {} // Won't be affected
/// \endcode
/// \version 3.7
bool SpacesInSquareBrackets;
/// Supported language standards for parsing and formatting C++ constructs.
/// \code
/// Latest: vector<set<int>>
/// c++03 vs. vector<set<int> >
/// \endcode
///
/// The correct way to spell a specific language version is e.g. ``c++11``.
/// The historical aliases ``Cpp03`` and ``Cpp11`` are deprecated.
enum LanguageStandard : int8_t {
/// Parse and format as C++03.
/// ``Cpp03`` is a deprecated alias for ``c++03``
LS_Cpp03, // c++03
/// Parse and format as C++11.
LS_Cpp11, // c++11
/// Parse and format as C++14.
LS_Cpp14, // c++14
/// Parse and format as C++17.
LS_Cpp17, // c++17
/// Parse and format as C++20.
LS_Cpp20, // c++20
/// Parse and format using the latest supported language version.
/// ``Cpp11`` is a deprecated alias for ``Latest``
LS_Latest,
/// Automatic detection based on the input.
LS_Auto,
};
/// Parse and format C++ constructs compatible with this standard.
/// \code
/// c++03: latest:
/// vector<set<int> > x; vs. vector<set<int>> x;
/// \endcode
/// \version 3.7
LanguageStandard Standard;
/// Macros which are ignored in front of a statement, as if they were an
/// attribute. So that they are not parsed as identifier, for example for Qts
/// emit.
/// \code
/// AlignConsecutiveDeclarations: true
/// StatementAttributeLikeMacros: []
/// unsigned char data = 'x';
/// emit signal(data); // This is parsed as variable declaration.
///
/// AlignConsecutiveDeclarations: true
/// StatementAttributeLikeMacros: [emit]
/// unsigned char data = 'x';
/// emit signal(data); // Now it's fine again.
/// \endcode
/// \version 12
std::vector<std::string> StatementAttributeLikeMacros;
/// A vector of macros that should be interpreted as complete
/// statements.
///
/// Typical macros are expressions, and require a semi-colon to be
/// added; sometimes this is not the case, and this allows to make
/// clang-format aware of such cases.
///
/// For example: Q_UNUSED
/// \version 8
std::vector<std::string> StatementMacros;
/// Works only when TableGenBreakInsideDAGArg is not DontBreak.
/// The string list needs to consist of identifiers in TableGen.
/// If any identifier is specified, this limits the line breaks by
/// TableGenBreakInsideDAGArg option only on DAGArg values beginning with
/// the specified identifiers.
///
/// For example the configuration,
/// \code{.yaml}
/// TableGenBreakInsideDAGArg: BreakAll
/// TableGenBreakingDAGArgOperators: ['ins', 'outs']
/// \endcode
///
/// makes the line break only occurs inside DAGArgs beginning with the
/// specified identifiers 'ins' and 'outs'.
///
/// \code
/// let DAGArgIns = (ins
/// i32:$src1,
/// i32:$src2
/// );
/// let DAGArgOtherID = (other i32:$other1, i32:$other2);
/// let DAGArgBang = (!cast<SomeType>("Some") i32:$src1, i32:$src2)
/// \endcode
/// \version 19
std::vector<std::string> TableGenBreakingDAGArgOperators;
/// Different ways to control the format inside TableGen DAGArg.
enum DAGArgStyle : int8_t {
/// Never break inside DAGArg.
/// \code
/// let DAGArgIns = (ins i32:$src1, i32:$src2);
/// \endcode
DAS_DontBreak,
/// Break inside DAGArg after each list element but for the last.
/// This aligns to the first element.
/// \code
/// let DAGArgIns = (ins i32:$src1,
/// i32:$src2);
/// \endcode
DAS_BreakElements,
/// Break inside DAGArg after the operator and the all elements.
/// \code
/// let DAGArgIns = (ins
/// i32:$src1,
/// i32:$src2
/// );
/// \endcode
DAS_BreakAll,
};
/// The styles of the line break inside the DAGArg in TableGen.
/// \version 19
DAGArgStyle TableGenBreakInsideDAGArg;
/// The number of columns used for tab stops.
/// \version 3.7
unsigned TabWidth;
/// A vector of non-keyword identifiers that should be interpreted as type
/// names.
///
/// A ``*``, ``&``, or ``&&`` between a type name and another non-keyword
/// identifier is annotated as a pointer or reference token instead of a
/// binary operator.
///
/// \version 17
std::vector<std::string> TypeNames;
/// \brief A vector of macros that should be interpreted as type declarations
/// instead of as function calls.
///
/// These are expected to be macros of the form:
/// \code
/// STACK_OF(...)
/// \endcode
///
/// In the .clang-format configuration file, this can be configured like:
/// \code{.yaml}
/// TypenameMacros: ['STACK_OF', 'LIST']
/// \endcode
///
/// For example: OpenSSL STACK_OF, BSD LIST_ENTRY.
/// \version 9
std::vector<std::string> TypenameMacros;
/// This option is **deprecated**. See ``LF`` and ``CRLF`` of ``LineEnding``.
/// \version 10
// bool UseCRLF;
/// Different ways to use tab in formatting.
enum UseTabStyle : int8_t {
/// Never use tab.
UT_Never,
/// Use tabs only for indentation.
UT_ForIndentation,
/// Fill all leading whitespace with tabs, and use spaces for alignment that
/// appears within a line (e.g. consecutive assignments and declarations).
UT_ForContinuationAndIndentation,
/// Use tabs for line continuation and indentation, and spaces for
/// alignment.
UT_AlignWithSpaces,
/// Use tabs whenever we need to fill whitespace that spans at least from
/// one tab stop to the next one.
UT_Always
};
/// The way to use tab characters in the resulting file.
/// \version 3.7
UseTabStyle UseTab;
/// For Verilog, put each port on its own line in module instantiations.
/// \code
/// true:
/// ffnand ff1(.q(),
/// .qbar(out1),
/// .clear(in1),
/// .preset(in2));
///
/// false:
/// ffnand ff1(.q(), .qbar(out1), .clear(in1), .preset(in2));
/// \endcode
/// \version 17
bool VerilogBreakBetweenInstancePorts;
/// A vector of macros which are whitespace-sensitive and should not
/// be touched.
///
/// These are expected to be macros of the form:
/// \code
/// STRINGIZE(...)
/// \endcode
///
/// In the .clang-format configuration file, this can be configured like:
/// \code{.yaml}
/// WhitespaceSensitiveMacros: ['STRINGIZE', 'PP_STRINGIZE']
/// \endcode
///
/// For example: BOOST_PP_STRINGIZE
/// \version 11
std::vector<std::string> WhitespaceSensitiveMacros;
bool operator==(const FormatStyle &R) const {
return AccessModifierOffset == R.AccessModifierOffset &&
AlignAfterOpenBracket == R.AlignAfterOpenBracket &&
AlignArrayOfStructures == R.AlignArrayOfStructures &&
AlignConsecutiveAssignments == R.AlignConsecutiveAssignments &&
AlignConsecutiveBitFields == R.AlignConsecutiveBitFields &&
AlignConsecutiveDeclarations == R.AlignConsecutiveDeclarations &&
AlignConsecutiveMacros == R.AlignConsecutiveMacros &&
AlignConsecutiveShortCaseStatements ==
R.AlignConsecutiveShortCaseStatements &&
AlignConsecutiveTableGenBreakingDAGArgColons ==
R.AlignConsecutiveTableGenBreakingDAGArgColons &&
AlignConsecutiveTableGenCondOperatorColons ==
R.AlignConsecutiveTableGenCondOperatorColons &&
AlignConsecutiveTableGenDefinitionColons ==
R.AlignConsecutiveTableGenDefinitionColons &&
AlignEscapedNewlines == R.AlignEscapedNewlines &&
AlignOperands == R.AlignOperands &&
AlignTrailingComments == R.AlignTrailingComments &&
AllowAllArgumentsOnNextLine == R.AllowAllArgumentsOnNextLine &&
AllowAllParametersOfDeclarationOnNextLine ==
R.AllowAllParametersOfDeclarationOnNextLine &&
AllowBreakBeforeNoexceptSpecifier ==
R.AllowBreakBeforeNoexceptSpecifier &&
AllowShortBlocksOnASingleLine == R.AllowShortBlocksOnASingleLine &&
AllowShortCaseLabelsOnASingleLine ==
R.AllowShortCaseLabelsOnASingleLine &&
AllowShortCompoundRequirementOnASingleLine ==
R.AllowShortCompoundRequirementOnASingleLine &&
AllowShortEnumsOnASingleLine == R.AllowShortEnumsOnASingleLine &&
AllowShortFunctionsOnASingleLine ==
R.AllowShortFunctionsOnASingleLine &&
AllowShortIfStatementsOnASingleLine ==
R.AllowShortIfStatementsOnASingleLine &&
AllowShortLambdasOnASingleLine == R.AllowShortLambdasOnASingleLine &&
AllowShortLoopsOnASingleLine == R.AllowShortLoopsOnASingleLine &&
AlwaysBreakBeforeMultilineStrings ==
R.AlwaysBreakBeforeMultilineStrings &&
AttributeMacros == R.AttributeMacros &&
BinPackArguments == R.BinPackArguments &&
BinPackParameters == R.BinPackParameters &&
BitFieldColonSpacing == R.BitFieldColonSpacing &&
BracedInitializerIndentWidth == R.BracedInitializerIndentWidth &&
BreakAdjacentStringLiterals == R.BreakAdjacentStringLiterals &&
BreakAfterAttributes == R.BreakAfterAttributes &&
BreakAfterJavaFieldAnnotations == R.BreakAfterJavaFieldAnnotations &&
BreakAfterReturnType == R.BreakAfterReturnType &&
BreakArrays == R.BreakArrays &&
BreakBeforeBinaryOperators == R.BreakBeforeBinaryOperators &&
BreakBeforeBraces == R.BreakBeforeBraces &&
BreakBeforeConceptDeclarations == R.BreakBeforeConceptDeclarations &&
BreakBeforeInlineASMColon == R.BreakBeforeInlineASMColon &&
BreakBeforeTernaryOperators == R.BreakBeforeTernaryOperators &&
BreakConstructorInitializers == R.BreakConstructorInitializers &&
BreakFunctionDefinitionParameters ==
R.BreakFunctionDefinitionParameters &&
BreakInheritanceList == R.BreakInheritanceList &&
BreakStringLiterals == R.BreakStringLiterals &&
BreakTemplateDeclarations == R.BreakTemplateDeclarations &&
ColumnLimit == R.ColumnLimit && CommentPragmas == R.CommentPragmas &&
CompactNamespaces == R.CompactNamespaces &&
ConstructorInitializerIndentWidth ==
R.ConstructorInitializerIndentWidth &&
ContinuationIndentWidth == R.ContinuationIndentWidth &&
Cpp11BracedListStyle == R.Cpp11BracedListStyle &&
DerivePointerAlignment == R.DerivePointerAlignment &&
DisableFormat == R.DisableFormat &&
EmptyLineAfterAccessModifier == R.EmptyLineAfterAccessModifier &&
EmptyLineBeforeAccessModifier == R.EmptyLineBeforeAccessModifier &&
ExperimentalAutoDetectBinPacking ==
R.ExperimentalAutoDetectBinPacking &&
FixNamespaceComments == R.FixNamespaceComments &&
ForEachMacros == R.ForEachMacros &&
IncludeStyle.IncludeBlocks == R.IncludeStyle.IncludeBlocks &&
IncludeStyle.IncludeCategories == R.IncludeStyle.IncludeCategories &&
IncludeStyle.IncludeIsMainRegex ==
R.IncludeStyle.IncludeIsMainRegex &&
IncludeStyle.IncludeIsMainSourceRegex ==
R.IncludeStyle.IncludeIsMainSourceRegex &&
IncludeStyle.MainIncludeChar == R.IncludeStyle.MainIncludeChar &&
IndentAccessModifiers == R.IndentAccessModifiers &&
IndentCaseBlocks == R.IndentCaseBlocks &&
IndentCaseLabels == R.IndentCaseLabels &&
IndentExternBlock == R.IndentExternBlock &&
IndentGotoLabels == R.IndentGotoLabels &&
IndentPPDirectives == R.IndentPPDirectives &&
IndentRequiresClause == R.IndentRequiresClause &&
IndentWidth == R.IndentWidth &&
IndentWrappedFunctionNames == R.IndentWrappedFunctionNames &&
InsertBraces == R.InsertBraces &&
InsertNewlineAtEOF == R.InsertNewlineAtEOF &&
IntegerLiteralSeparator == R.IntegerLiteralSeparator &&
JavaImportGroups == R.JavaImportGroups &&
JavaScriptQuotes == R.JavaScriptQuotes &&
JavaScriptWrapImports == R.JavaScriptWrapImports &&
KeepEmptyLinesAtEOF == R.KeepEmptyLinesAtEOF &&
KeepEmptyLinesAtTheStartOfBlocks ==
R.KeepEmptyLinesAtTheStartOfBlocks &&
Language == R.Language &&
LambdaBodyIndentation == R.LambdaBodyIndentation &&
LineEnding == R.LineEnding && MacroBlockBegin == R.MacroBlockBegin &&
MacroBlockEnd == R.MacroBlockEnd && Macros == R.Macros &&
MaxEmptyLinesToKeep == R.MaxEmptyLinesToKeep &&
NamespaceIndentation == R.NamespaceIndentation &&
NamespaceMacros == R.NamespaceMacros &&
ObjCBinPackProtocolList == R.ObjCBinPackProtocolList &&
ObjCBlockIndentWidth == R.ObjCBlockIndentWidth &&
ObjCBreakBeforeNestedBlockParam ==
R.ObjCBreakBeforeNestedBlockParam &&
ObjCPropertyAttributeOrder == R.ObjCPropertyAttributeOrder &&
ObjCSpaceAfterProperty == R.ObjCSpaceAfterProperty &&
ObjCSpaceBeforeProtocolList == R.ObjCSpaceBeforeProtocolList &&
PackConstructorInitializers == R.PackConstructorInitializers &&
PenaltyBreakAssignment == R.PenaltyBreakAssignment &&
PenaltyBreakBeforeFirstCallParameter ==
R.PenaltyBreakBeforeFirstCallParameter &&
PenaltyBreakComment == R.PenaltyBreakComment &&
PenaltyBreakFirstLessLess == R.PenaltyBreakFirstLessLess &&
PenaltyBreakOpenParenthesis == R.PenaltyBreakOpenParenthesis &&
PenaltyBreakScopeResolution == R.PenaltyBreakScopeResolution &&
PenaltyBreakString == R.PenaltyBreakString &&
PenaltyBreakTemplateDeclaration ==
R.PenaltyBreakTemplateDeclaration &&
PenaltyExcessCharacter == R.PenaltyExcessCharacter &&
PenaltyReturnTypeOnItsOwnLine == R.PenaltyReturnTypeOnItsOwnLine &&
PointerAlignment == R.PointerAlignment &&
QualifierAlignment == R.QualifierAlignment &&
QualifierOrder == R.QualifierOrder &&
RawStringFormats == R.RawStringFormats &&
ReferenceAlignment == R.ReferenceAlignment &&
RemoveBracesLLVM == R.RemoveBracesLLVM &&
RemoveParentheses == R.RemoveParentheses &&
RemoveSemicolon == R.RemoveSemicolon &&
RequiresClausePosition == R.RequiresClausePosition &&
RequiresExpressionIndentation == R.RequiresExpressionIndentation &&
SeparateDefinitionBlocks == R.SeparateDefinitionBlocks &&
ShortNamespaceLines == R.ShortNamespaceLines &&
SkipMacroDefinitionBody == R.SkipMacroDefinitionBody &&
SortIncludes == R.SortIncludes &&
SortJavaStaticImport == R.SortJavaStaticImport &&
SpaceAfterCStyleCast == R.SpaceAfterCStyleCast &&
SpaceAfterLogicalNot == R.SpaceAfterLogicalNot &&
SpaceAfterTemplateKeyword == R.SpaceAfterTemplateKeyword &&
SpaceBeforeAssignmentOperators == R.SpaceBeforeAssignmentOperators &&
SpaceBeforeCaseColon == R.SpaceBeforeCaseColon &&
SpaceBeforeCpp11BracedList == R.SpaceBeforeCpp11BracedList &&
SpaceBeforeCtorInitializerColon ==
R.SpaceBeforeCtorInitializerColon &&
SpaceBeforeInheritanceColon == R.SpaceBeforeInheritanceColon &&
SpaceBeforeJsonColon == R.SpaceBeforeJsonColon &&
SpaceBeforeParens == R.SpaceBeforeParens &&
SpaceBeforeParensOptions == R.SpaceBeforeParensOptions &&
SpaceAroundPointerQualifiers == R.SpaceAroundPointerQualifiers &&
SpaceBeforeRangeBasedForLoopColon ==
R.SpaceBeforeRangeBasedForLoopColon &&
SpaceBeforeSquareBrackets == R.SpaceBeforeSquareBrackets &&
SpaceInEmptyBlock == R.SpaceInEmptyBlock &&
SpacesBeforeTrailingComments == R.SpacesBeforeTrailingComments &&
SpacesInAngles == R.SpacesInAngles &&
SpacesInContainerLiterals == R.SpacesInContainerLiterals &&
SpacesInLineCommentPrefix.Minimum ==
R.SpacesInLineCommentPrefix.Minimum &&
SpacesInLineCommentPrefix.Maximum ==
R.SpacesInLineCommentPrefix.Maximum &&
SpacesInParens == R.SpacesInParens &&
SpacesInParensOptions == R.SpacesInParensOptions &&
SpacesInSquareBrackets == R.SpacesInSquareBrackets &&
Standard == R.Standard &&
StatementAttributeLikeMacros == R.StatementAttributeLikeMacros &&
StatementMacros == R.StatementMacros &&
TableGenBreakingDAGArgOperators ==
R.TableGenBreakingDAGArgOperators &&
TableGenBreakInsideDAGArg == R.TableGenBreakInsideDAGArg &&
TabWidth == R.TabWidth && TypeNames == R.TypeNames &&
TypenameMacros == R.TypenameMacros && UseTab == R.UseTab &&
VerilogBreakBetweenInstancePorts ==
R.VerilogBreakBetweenInstancePorts &&
WhitespaceSensitiveMacros == R.WhitespaceSensitiveMacros;
}
std::optional<FormatStyle> GetLanguageStyle(LanguageKind Language) const;
// Stores per-language styles. A FormatStyle instance inside has an empty
// StyleSet. A FormatStyle instance returned by the Get method has its
// StyleSet set to a copy of the originating StyleSet, effectively keeping the
// internal representation of that StyleSet alive.
//
// The memory management and ownership reminds of a birds nest: chicks
// leaving the nest take photos of the nest with them.
struct FormatStyleSet {
typedef std::map<FormatStyle::LanguageKind, FormatStyle> MapType;
std::optional<FormatStyle> Get(FormatStyle::LanguageKind Language) const;
// Adds \p Style to this FormatStyleSet. Style must not have an associated
// FormatStyleSet.
// Style.Language should be different than LK_None. If this FormatStyleSet
// already contains an entry for Style.Language, that gets replaced with the
// passed Style.
void Add(FormatStyle Style);
// Clears this FormatStyleSet.
void Clear();
private:
std::shared_ptr<MapType> Styles;
};
static FormatStyleSet BuildStyleSetFromConfiguration(
const FormatStyle &MainStyle,
const std::vector<FormatStyle> &ConfigurationStyles);
private:
FormatStyleSet StyleSet;
friend std::error_code
parseConfiguration(llvm::MemoryBufferRef Config, FormatStyle *Style,
bool AllowUnknownOptions,
llvm::SourceMgr::DiagHandlerTy DiagHandler,
void *DiagHandlerCtxt);
};
/// Returns a format style complying with the LLVM coding standards:
/// http://llvm.org/docs/CodingStandards.html.
FormatStyle getLLVMStyle(
FormatStyle::LanguageKind Language = FormatStyle::LanguageKind::LK_Cpp);
/// Returns a format style complying with one of Google's style guides:
/// http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml.
/// http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml.
/// https://developers.google.com/protocol-buffers/docs/style.
FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language);
/// Returns a format style complying with Chromium's style guide:
/// http://www.chromium.org/developers/coding-style.
FormatStyle getChromiumStyle(FormatStyle::LanguageKind Language);
/// Returns a format style complying with Mozilla's style guide:
/// https://firefox-source-docs.mozilla.org/code-quality/coding-style/index.html.
FormatStyle getMozillaStyle();
/// Returns a format style complying with Webkit's style guide:
/// http://www.webkit.org/coding/coding-style.html
FormatStyle getWebKitStyle();
/// Returns a format style complying with GNU Coding Standards:
/// http://www.gnu.org/prep/standards/standards.html
FormatStyle getGNUStyle();
/// Returns a format style complying with Microsoft style guide:
/// https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
FormatStyle getMicrosoftStyle(FormatStyle::LanguageKind Language);
FormatStyle getClangFormatStyle();
/// Returns style indicating formatting should be not applied at all.
FormatStyle getNoStyle();
/// Gets a predefined style for the specified language by name.
///
/// Currently supported names: LLVM, Google, Chromium, Mozilla. Names are
/// compared case-insensitively.
///
/// Returns ``true`` if the Style has been set.
bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language,
FormatStyle *Style);
/// Parse configuration from YAML-formatted text.
///
/// Style->Language is used to get the base style, if the ``BasedOnStyle``
/// option is present.
///
/// The FormatStyleSet of Style is reset.
///
/// When ``BasedOnStyle`` is not present, options not present in the YAML
/// document, are retained in \p Style.
///
/// If AllowUnknownOptions is true, no errors are emitted if unknown
/// format options are occurred.
///
/// If set all diagnostics are emitted through the DiagHandler.
std::error_code
parseConfiguration(llvm::MemoryBufferRef Config, FormatStyle *Style,
bool AllowUnknownOptions = false,
llvm::SourceMgr::DiagHandlerTy DiagHandler = nullptr,
void *DiagHandlerCtx = nullptr);
/// Like above but accepts an unnamed buffer.
inline std::error_code parseConfiguration(StringRef Config, FormatStyle *Style,
bool AllowUnknownOptions = false) {
return parseConfiguration(llvm::MemoryBufferRef(Config, "YAML"), Style,
AllowUnknownOptions);
}
/// Gets configuration in a YAML string.
std::string configurationAsText(const FormatStyle &Style);
/// Returns the replacements necessary to sort all ``#include`` blocks
/// that are affected by ``Ranges``.
tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName,
unsigned *Cursor = nullptr);
/// Returns the replacements corresponding to applying and formatting
/// \p Replaces on success; otheriwse, return an llvm::Error carrying
/// llvm::StringError.
llvm::Expected<tooling::Replacements>
formatReplacements(StringRef Code, const tooling::Replacements &Replaces,
const FormatStyle &Style);
/// Returns the replacements corresponding to applying \p Replaces and
/// cleaning up the code after that on success; otherwise, return an llvm::Error
/// carrying llvm::StringError.
/// This also supports inserting/deleting C++ #include directives:
/// - If a replacement has offset UINT_MAX, length 0, and a replacement text
/// that is an #include directive, this will insert the #include into the
/// correct block in the \p Code.
/// - If a replacement has offset UINT_MAX, length 1, and a replacement text
/// that is the name of the header to be removed, the header will be removed
/// from \p Code if it exists.
/// The include manipulation is done via ``tooling::HeaderInclude``, see its
/// documentation for more details on how include insertion points are found and
/// what edits are produced.
llvm::Expected<tooling::Replacements>
cleanupAroundReplacements(StringRef Code, const tooling::Replacements &Replaces,
const FormatStyle &Style);
/// Represents the status of a formatting attempt.
struct FormattingAttemptStatus {
/// A value of ``false`` means that any of the affected ranges were not
/// formatted due to a non-recoverable syntax error.
bool FormatComplete = true;
/// If ``FormatComplete`` is false, ``Line`` records a one-based
/// original line number at which a syntax error might have occurred. This is
/// based on a best-effort analysis and could be imprecise.
unsigned Line = 0;
};
/// Reformats the given \p Ranges in \p Code.
///
/// Each range is extended on either end to its next bigger logic unit, i.e.
/// everything that might influence its formatting or might be influenced by its
/// formatting.
///
/// Returns the ``Replacements`` necessary to make all \p Ranges comply with
/// \p Style.
///
/// If ``Status`` is non-null, its value will be populated with the status of
/// this formatting attempt. See \c FormattingAttemptStatus.
tooling::Replacements reformat(const FormatStyle &Style, StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName = "<stdin>",
FormattingAttemptStatus *Status = nullptr);
/// Same as above, except if ``IncompleteFormat`` is non-null, its value
/// will be set to true if any of the affected ranges were not formatted due to
/// a non-recoverable syntax error.
tooling::Replacements reformat(const FormatStyle &Style, StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName, bool *IncompleteFormat);
/// Clean up any erroneous/redundant code in the given \p Ranges in \p
/// Code.
///
/// Returns the ``Replacements`` that clean up all \p Ranges in \p Code.
tooling::Replacements cleanup(const FormatStyle &Style, StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName = "<stdin>");
/// Fix namespace end comments in the given \p Ranges in \p Code.
///
/// Returns the ``Replacements`` that fix the namespace comments in all
/// \p Ranges in \p Code.
tooling::Replacements fixNamespaceEndComments(const FormatStyle &Style,
StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName = "<stdin>");
/// Inserts or removes empty lines separating definition blocks including
/// classes, structs, functions, namespaces, and enums in the given \p Ranges in
/// \p Code.
///
/// Returns the ``Replacements`` that inserts or removes empty lines separating
/// definition blocks in all \p Ranges in \p Code.
tooling::Replacements separateDefinitionBlocks(const FormatStyle &Style,
StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName = "<stdin>");
/// Sort consecutive using declarations in the given \p Ranges in
/// \p Code.
///
/// Returns the ``Replacements`` that sort the using declarations in all
/// \p Ranges in \p Code.
tooling::Replacements sortUsingDeclarations(const FormatStyle &Style,
StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName = "<stdin>");
/// Returns the ``LangOpts`` that the formatter expects you to set.
///
/// \param Style determines specific settings for lexing mode.
LangOptions getFormattingLangOpts(const FormatStyle &Style = getLLVMStyle());
/// Description to be used for help text for a ``llvm::cl`` option for
/// specifying format style. The description is closely related to the operation
/// of ``getStyle()``.
extern const char *StyleOptionHelpDescription;
/// The suggested format style to use by default. This allows tools using
/// ``getStyle`` to have a consistent default style.
/// Different builds can modify the value to the preferred styles.
extern const char *DefaultFormatStyle;
/// The suggested predefined style to use as the fallback style in ``getStyle``.
/// Different builds can modify the value to the preferred styles.
extern const char *DefaultFallbackStyle;
/// Construct a FormatStyle based on ``StyleName``.
///
/// ``StyleName`` can take several forms:
/// * "{<key>: <value>, ...}" - Set specic style parameters.
/// * "<style name>" - One of the style names supported by
/// getPredefinedStyle().
/// * "file" - Load style configuration from a file called ``.clang-format``
/// located in one of the parent directories of ``FileName`` or the current
/// directory if ``FileName`` is empty.
/// * "file:<format_file_path>" to explicitly specify the configuration file to
/// use.
///
/// \param[in] StyleName Style name to interpret according to the description
/// above.
/// \param[in] FileName Path to start search for .clang-format if ``StyleName``
/// == "file".
/// \param[in] FallbackStyle The name of a predefined style used to fallback to
/// in case \p StyleName is "file" and no file can be found.
/// \param[in] Code The actual code to be formatted. Used to determine the
/// language if the filename isn't sufficient.
/// \param[in] FS The underlying file system, in which the file resides. By
/// default, the file system is the real file system.
/// \param[in] AllowUnknownOptions If true, unknown format options only
/// emit a warning. If false, errors are emitted on unknown format
/// options.
///
/// \returns FormatStyle as specified by ``StyleName``. If ``StyleName`` is
/// "file" and no file is found, returns ``FallbackStyle``. If no style could be
/// determined, returns an Error.
llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
StringRef FallbackStyle,
StringRef Code = "",
llvm::vfs::FileSystem *FS = nullptr,
bool AllowUnknownOptions = false);
// Guesses the language from the ``FileName`` and ``Code`` to be formatted.
// Defaults to FormatStyle::LK_Cpp.
FormatStyle::LanguageKind guessLanguage(StringRef FileName, StringRef Code);
// Returns a string representation of ``Language``.
inline StringRef getLanguageName(FormatStyle::LanguageKind Language) {
switch (Language) {
case FormatStyle::LK_Cpp:
return "C++";
case FormatStyle::LK_CSharp:
return "CSharp";
case FormatStyle::LK_ObjC:
return "Objective-C";
case FormatStyle::LK_Java:
return "Java";
case FormatStyle::LK_JavaScript:
return "JavaScript";
case FormatStyle::LK_Json:
return "Json";
case FormatStyle::LK_Proto:
return "Proto";
case FormatStyle::LK_TableGen:
return "TableGen";
case FormatStyle::LK_TextProto:
return "TextProto";
case FormatStyle::LK_Verilog:
return "Verilog";
default:
return "Unknown";
}
}
bool isClangFormatOn(StringRef Comment);
bool isClangFormatOff(StringRef Comment);
} // end namespace format
} // end namespace clang
namespace std {
template <>
struct is_error_code_enum<clang::format::ParseError> : std::true_type {};
} // namespace std
#endif // LLVM_CLANG_FORMAT_FORMAT_H