clang 24.0.0git
IncludeStyle.h
Go to the documentation of this file.
1//===--- IncludeStyle.h - Style of C++ #include directives -------*- C++-*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_TOOLING_INCLUSIONS_INCLUDESTYLE_H
10#define LLVM_CLANG_TOOLING_INCLUSIONS_INCLUDESTYLE_H
11
12#include "llvm/Support/YAMLTraits.h"
13#include <string>
14#include <vector>
15
16namespace clang {
17namespace tooling {
18
19/// Style for sorting and grouping C++ #include directives.
21 /// Styles for sorting multiple `#include` blocks.
23 /// Sort each `#include` block separately.
24 /// \code
25 /// #include "b.h" into #include "b.h"
26 ///
27 /// #include <lib/main.h> #include "a.h"
28 /// #include "a.h" #include <lib/main.h>
29 /// \endcode
31 /// Merge multiple `#include` blocks together and sort as one.
32 /// \code
33 /// #include "b.h" into #include "a.h"
34 /// #include "b.h"
35 /// #include <lib/main.h> #include <lib/main.h>
36 /// #include "a.h"
37 /// \endcode
39 /// Merge multiple `#include` blocks together and sort as one.
40 /// Then split into groups based on category priority. See
41 /// `IncludeCategories`.
42 /// \code
43 /// #include "b.h" into #include "a.h"
44 /// #include "b.h"
45 /// #include <lib/main.h>
46 /// #include "a.h" #include <lib/main.h>
47 /// \endcode
49 };
50
51 /// Dependent on the value, multiple `#include` blocks can be sorted
52 /// as one and divided based on category.
53 /// \version 6
55
56 /// See documentation of `IncludeCategories`.
58 /// The regular expression that this category matches.
59 std::string Regex;
60 /// The priority to assign to this category.
62 /// The custom priority to sort before grouping.
64 /// If the regular expression is case sensitive.
66 bool operator==(const IncludeCategory &Other) const {
67 return Regex == Other.Regex && Priority == Other.Priority &&
68 RegexIsCaseSensitive == Other.RegexIsCaseSensitive;
69 }
70 };
71
72 /// Regular expressions denoting the different `#include` categories
73 /// used for ordering `#includes`.
74 ///
75 /// [POSIX
76 /// extended](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html)
77 /// regular expressions are supported.
78 ///
79 /// These regular expressions are matched against the filename of an include
80 /// (including the <> or "") in order. The value belonging to the first
81 /// matching regular expression is assigned and `#includes` are sorted first
82 /// according to increasing category number and then alphabetically within
83 /// each category.
84 ///
85 /// If none of the regular expressions match, INT_MAX is assigned as
86 /// category. The main header for a source file automatically gets category 0.
87 /// so that it is generally kept at the beginning of the `#includes`
88 /// (see [LLVM
89 /// style](https://llvm.org/docs/CodingStandards.html#include-style)).
90 /// However, you can also assign negative priorities if you have certain
91 /// headers that always need to be first.
92 ///
93 /// There is a third and optional field `SortPriority` which can used while
94 /// `IncludeBlocks = IBS_Regroup` to define the priority in which
95 /// `#includes` should be ordered. The value of `Priority` defines the
96 /// order of `#include blocks` and also allows the grouping of `#includes`
97 /// of different priority. `SortPriority` is set to the value of
98 /// `Priority` as default if it is not assigned.
99 ///
100 /// Each regular expression can be marked as case sensitive with the field
101 /// `CaseSensitive`, per default it is not.
102 ///
103 /// To configure this in the .clang-format file, use:
104 /// \code{.yaml}
105 /// IncludeCategories:
106 /// - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
107 /// Priority: 2
108 /// SortPriority: 2
109 /// CaseSensitive: true
110 /// - Regex: '^((<|")(gtest|gmock|isl|json)/)'
111 /// Priority: 3
112 /// - Regex: '<[[:alnum:].]+>'
113 /// Priority: 4
114 /// - Regex: '.*'
115 /// Priority: 1
116 /// SortPriority: 0
117 /// \endcode
118 /// \version 3.8
119 std::vector<IncludeCategory> IncludeCategories;
120
121 /// Specify a regular expression of suffixes that are allowed in the
122 /// file-to-main-include mapping.
123 ///
124 /// When guessing whether a #include is the "main" include (to assign
125 /// category 0, see above), use this regex of allowed suffixes to the header
126 /// stem. A partial match is done, so that:
127 /// * `""` means "arbitrary suffix"
128 /// * `"$"` means "no suffix"
129 ///
130 /// For example, if configured to `"(_test)?$"`, then a header a.h would be
131 /// seen as the "main" include in both a.cc and a_test.cc.
132 /// \version 3.9
133 std::string IncludeIsMainRegex;
134
135 /// Specify a regular expression for files being formatted
136 /// that are allowed to be considered "main" in the
137 /// file-to-main-include mapping.
138 ///
139 /// By default, clang-format considers files as "main" only when they end
140 /// with: `.c`, `.cc`, `.cpp`, `.c++`, `.cxx`, `.m` or `.mm`
141 /// extensions.
142 /// For these files a guessing of "main" include takes place
143 /// (to assign category 0, see above). This config option allows for
144 /// additional suffixes and extensions for files to be considered as "main".
145 ///
146 /// For example, if this option is configured to `(Impl\.hpp)$`,
147 /// then a file `ClassImpl.hpp` is considered "main" (in addition to
148 /// `Class.c`, `Class.cc`, `Class.cpp` and so on) and "main
149 /// include file" logic will be executed (with *IncludeIsMainRegex* setting
150 /// also being respected in later phase). Without this option set,
151 /// `ClassImpl.hpp` would not have the main include file put on top
152 /// before any other include.
153 /// \version 10
154 std::string IncludeIsMainSourceRegex;
156 /// Character to consider in the include directives for the main header.
158 /// Main include uses quotes: `#include "foo.hpp"` (the default).
160 /// Main include uses angle brackets: `#include <foo.hpp>`.
162 /// Main include uses either quotes or angle brackets.
164 };
165
166 /// When guessing whether a #include is the "main" include, only the include
167 /// directives that use the specified character are considered.
168 /// \version 19
170};
171
172} // namespace tooling
173} // namespace clang
174
175LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::IncludeStyle::IncludeCategory)
176
177namespace llvm {
178namespace yaml {
179
180template <>
181struct MappingTraits<clang::tooling::IncludeStyle::IncludeCategory> {
182 static void mapping(IO &IO,
184};
185
186template <>
187struct ScalarEnumerationTraits<
188 clang::tooling::IncludeStyle::IncludeBlocksStyle> {
189 static void
191};
192
193template <>
194struct ScalarEnumerationTraits<
195 clang::tooling::IncludeStyle::MainIncludeCharDiscriminator> {
196 static void enumeration(
197 IO &IO,
199};
200
201} // namespace yaml
202} // namespace llvm
203
204#endif // LLVM_CLANG_TOOLING_INCLUSIONS_INCLUDESTYLE_H
Top level wrappers for InstallAPI frontend operations.
@ Other
Other implicit parameter.
Definition Decl.h:1774
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
See documentation of IncludeCategories.
int Priority
The priority to assign to this category.
bool RegexIsCaseSensitive
If the regular expression is case sensitive.
int SortPriority
The custom priority to sort before grouping.
bool operator==(const IncludeCategory &Other) const
std::string Regex
The regular expression that this category matches.
Style for sorting and grouping C++ include directives.
MainIncludeCharDiscriminator MainIncludeChar
When guessing whether a include is the "main" include, only the include directives that use the speci...
IncludeBlocksStyle
Styles for sorting multiple #include blocks.
@ IBS_Preserve
Sort each #include block separately.
@ IBS_Regroup
Merge multiple #include blocks together and sort as one.
@ IBS_Merge
Merge multiple #include blocks together and sort as one.
std::string IncludeIsMainRegex
Specify a regular expression of suffixes that are allowed in the file-to-main-include mapping.
std::string IncludeIsMainSourceRegex
Specify a regular expression for files being formatted that are allowed to be considered "main" in th...
MainIncludeCharDiscriminator
Character to consider in the include directives for the main header.
@ MICD_Quote
Main include uses quotes: #include "foo.hpp" (the default).
@ MICD_AngleBracket
Main include uses angle brackets: #include <foo.hpp>.
@ MICD_Any
Main include uses either quotes or angle brackets.
IncludeBlocksStyle IncludeBlocks
Dependent on the value, multiple #include blocks can be sorted as one and divided based on category.
std::vector< IncludeCategory > IncludeCategories
Regular expressions denoting the different #include categories used for ordering #includes.
static void mapping(IO &IO, clang::tooling::IncludeStyle::IncludeCategory &Category)
static void enumeration(IO &IO, clang::tooling::IncludeStyle::IncludeBlocksStyle &Value)
static void enumeration(IO &IO, clang::tooling::IncludeStyle::MainIncludeCharDiscriminator &Value)