//===---------- IncludeInserter.h - clang-tidy ----------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDEINSERTER_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDEINSERTER_H #include "IncludeSorter.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/PPCallbacks.h" #include #include namespace clang { namespace tidy { // IncludeInserter can be used by ClangTidyChecks in the following fashion: // class MyCheck : public ClangTidyCheck { // public: // void registerPPCallbacks(CompilerInstance& Compiler) override { // Inserter.reset(new IncludeInserter(&Compiler.getSourceManager(), // &Compiler.getLangOpts())); // Compiler.getPreprocessor().addPPCallbacks( // Inserter->CreatePPCallback()); // } // // void registerMatchers(ast_matchers::MatchFinder* Finder) override { ... } // // void check(const ast_matchers::MatchFinder::MatchResult& Result) override { // ... // Inserter->CreateIncludeInsertion( // Result.SourceManager->getMainFileID(), "path/to/Header.h", // /*IsAngled=*/false); // ... // } // // private: // std::unique_ptr Inserter; // }; class IncludeInserter { public: IncludeInserter(const SourceManager &SourceMgr, const LangOptions &LangOpts, IncludeSorter::IncludeStyle Style); ~IncludeInserter(); // Create PPCallbacks for registration with the compiler's preprocessor. std::unique_ptr CreatePPCallbacks(); // Creates a Header inclusion directive fixit. Returns None on error or // if inclusion directive already exists. llvm::Optional CreateIncludeInsertion(FileID FileID, llvm::StringRef Header, bool IsAngled); private: void AddInclude(StringRef file_name, bool IsAngled, SourceLocation hash_location, SourceLocation end_location); llvm::DenseMap> IncludeSorterByFile; llvm::DenseMap> InsertedHeaders; const SourceManager &SourceMgr; const LangOptions &LangOpts; const IncludeSorter::IncludeStyle Style; friend class IncludeInserterCallback; }; } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDEINSERTER_H