1 //===------------ IncludeSorter.h - clang-tidy ----------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H
12 #include "../ClangTidyCheck.h"
16 namespace clang::tidy
{
19 /// Class used by ``IncludeInserterCallback`` to record the names of the
20 /// inclusions in a given source file being processed and generate the necessary
21 /// commands to sort the inclusions according to the precedence encoded in
25 /// Supported include styles.
26 enum IncludeStyle
{ IS_LLVM
= 0, IS_Google
= 1, IS_Google_ObjC
};
28 /// The classifications of inclusions, in the order they should be sorted.
30 IK_MainTUInclude
= 0, ///< e.g. ``#include "foo.h"`` when editing foo.cc
31 IK_CSystemInclude
= 1, ///< e.g. ``#include <stdio.h>``
32 IK_CXXSystemInclude
= 2, ///< e.g. ``#include <vector>``
33 IK_NonSystemInclude
= 3, ///< e.g. ``#include "bar.h"``
34 IK_GeneratedInclude
= 4, ///< e.g. ``#include "bar.proto.h"``
35 IK_InvalidInclude
= 5 ///< total number of valid ``IncludeKind``s
38 /// ``IncludeSorter`` constructor; takes the FileID and name of the file to be
39 /// processed by the sorter.
40 IncludeSorter(const SourceManager
*SourceMgr
, const FileID FileID
,
41 StringRef FileName
, IncludeStyle Style
);
43 /// Adds the given include directive to the sorter.
44 void addInclude(StringRef FileName
, bool IsAngled
,
45 SourceLocation HashLocation
, SourceLocation EndLocation
);
47 /// Creates a quoted inclusion directive in the right sort order. Returns
48 /// std::nullopt on error or if header inclusion directive for header already
50 std::optional
<FixItHint
> createIncludeInsertion(StringRef FileName
,
54 typedef SmallVector
<SourceRange
, 1> SourceRangeVector
;
56 const SourceManager
*SourceMgr
;
57 const IncludeStyle Style
;
59 /// The file name stripped of common suffixes.
60 StringRef CanonicalFile
;
61 /// Locations of visited include directives.
62 SourceRangeVector SourceLocations
;
63 /// Mapping from file name to #include locations.
64 llvm::StringMap
<SourceRangeVector
> IncludeLocations
;
65 /// Includes sorted into buckets.
66 SmallVector
<std::string
, 1> IncludeBucket
[IK_InvalidInclude
];
71 template <> struct OptionEnumMapping
<utils::IncludeSorter::IncludeStyle
> {
72 static ArrayRef
<std::pair
<utils::IncludeSorter::IncludeStyle
, StringRef
>>
75 } // namespace clang::tidy
76 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H