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