1 //===--- ClangTidy.h - clang-tidy -------------------------------*- 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_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDY_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDY_H
11 
12 #include "ClangTidyDiagnosticConsumer.h"
13 #include "ClangTidyOptions.h"
14 #include "llvm/ADT/StringSet.h"
15 #include <memory>
16 #include <vector>
17 
18 namespace llvm {
19 class raw_ostream;
20 } // namespace llvm
21 
22 namespace clang {
23 
24 class ASTConsumer;
25 class CompilerInstance;
26 namespace tooling {
27 class CompilationDatabase;
28 } // namespace tooling
29 
30 namespace tidy {
31 
32 class ClangTidyCheckFactories;
33 
34 class ClangTidyASTConsumerFactory {
35 public:
36   ClangTidyASTConsumerFactory(
37       ClangTidyContext &Context,
38       IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> OverlayFS = nullptr);
39 
40   /// Returns an ASTConsumer that runs the specified clang-tidy checks.
41   std::unique_ptr<clang::ASTConsumer>
42   createASTConsumer(clang::CompilerInstance &Compiler, StringRef File);
43 
44   /// Get the list of enabled checks.
45   std::vector<std::string> getCheckNames();
46 
47   /// Get the union of options from all checks.
48   ClangTidyOptions::OptionMap getCheckOptions();
49 
50 private:
51   ClangTidyContext &Context;
52   IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> OverlayFS;
53   std::unique_ptr<ClangTidyCheckFactories> CheckFactories;
54 };
55 
56 /// Fills the list of check names that are enabled when the provided
57 /// filters are applied.
58 std::vector<std::string> getCheckNames(const ClangTidyOptions &Options,
59                                        bool AllowEnablingAnalyzerAlphaCheckers);
60 
61 struct NamesAndOptions {
62   llvm::StringSet<> Names;
63   llvm::StringSet<> Options;
64 };
65 
66 NamesAndOptions
67 getAllChecksAndOptions(bool AllowEnablingAnalyzerAlphaCheckers = true);
68 
69 /// Returns the effective check-specific options.
70 ///
71 /// The method configures ClangTidy with the specified \p Options and collects
72 /// effective options from all created checks. The returned set of options
73 /// includes default check-specific options for all keys not overridden by \p
74 /// Options.
75 ClangTidyOptions::OptionMap
76 getCheckOptions(const ClangTidyOptions &Options,
77                 bool AllowEnablingAnalyzerAlphaCheckers);
78 
79 /// Run a set of clang-tidy checks on a set of files.
80 ///
81 /// \param EnableCheckProfile If provided, it enables check profile collection
82 /// in MatchFinder, and will contain the result of the profile.
83 /// \param StoreCheckProfile If provided, and EnableCheckProfile is true,
84 /// the profile will not be output to stderr, but will instead be stored
85 /// as a JSON file in the specified directory.
86 std::vector<ClangTidyError>
87 runClangTidy(clang::tidy::ClangTidyContext &Context,
88              const tooling::CompilationDatabase &Compilations,
89              ArrayRef<std::string> InputFiles,
90              llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> BaseFS,
91              bool ApplyAnyFix, bool EnableCheckProfile = false,
92              llvm::StringRef StoreCheckProfile = StringRef());
93 
94 /// Controls what kind of fixes clang-tidy is allowed to apply.
95 enum FixBehaviour {
96   /// Don't try to apply any fix.
97   FB_NoFix,
98   /// Only apply fixes added to warnings.
99   FB_Fix,
100   /// Apply fixes found in notes.
101   FB_FixNotes
102 };
103 
104 // FIXME: This interface will need to be significantly extended to be useful.
105 // FIXME: Implement confidence levels for displaying/fixing errors.
106 //
107 /// Displays the found \p Errors to the users. If \p Fix is \ref FB_Fix or \ref
108 /// FB_FixNotes, \p Errors containing fixes are automatically applied and
109 /// reformatted. If no clang-format configuration file is found, the given \P
110 /// FormatStyle is used.
111 void handleErrors(llvm::ArrayRef<ClangTidyError> Errors,
112                   ClangTidyContext &Context, FixBehaviour Fix,
113                   unsigned &WarningsAsErrorsCount,
114                   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS);
115 
116 /// Serializes replacements into YAML and writes them to the specified
117 /// output stream.
118 void exportReplacements(StringRef MainFilePath,
119                         const std::vector<ClangTidyError> &Errors,
120                         raw_ostream &OS);
121 
122 } // end namespace tidy
123 } // end namespace clang
124 
125 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDY_H
126