//===------------ IncludeSorter.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_INCLUDESORTER_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H #include "../ClangTidy.h" #include namespace clang { namespace tidy { // Class used by IncludeSorterCallback and IncludeInserterCallback to record the // names of the inclusions in a given source file being processed and generate // the necessary commands to sort the inclusions according to the precedence // enocded in IncludeKinds. class IncludeSorter { public: // Supported include styles. enum IncludeStyle { IS_LLVM = 0, IS_Google = 1 }; // Converts "llvm" to IS_LLVM, otherwise returns IS_Google. static IncludeStyle parseIncludeStyle(const std::string &Value); // Converts IncludeStyle to string representation. static StringRef toString(IncludeStyle Style); // The classifications of inclusions, in the order they should be sorted. enum IncludeKinds { IK_MainTUInclude = 0, // e.g. #include "foo.h" when editing foo.cc IK_CSystemInclude = 1, // e.g. #include IK_CXXSystemInclude = 2, // e.g. #include IK_NonSystemInclude = 3, // e.g. #include "bar.h" IK_InvalidInclude = 4 // total number of valid IncludeKinds }; // IncludeSorter constructor; takes the FileID and name of the file to be // processed by the sorter. IncludeSorter(const SourceManager *SourceMgr, const LangOptions *LangOpts, const FileID FileID, StringRef FileName, IncludeStyle Style); // Returns the SourceManager-specific file ID for the file being handled by // the sorter. const FileID current_FileID() const { return CurrentFileID; } // Adds the given #include to the sorter. void AddInclude(StringRef FileName, bool IsAngled, SourceLocation HashLocation, SourceLocation EndLocation); // Returns the edits needed to sort the current set of includes and reset the // internal state (so that different blocks of includes are sorted separately // within the same file). std::vector GetEdits(); // Creates a quoted inclusion directive in the right sort order. Returns None // on error or if header inclusion directive for header already exists. Optional CreateIncludeInsertion(StringRef FileName, bool IsAngled); private: typedef SmallVector SourceRangeVector; // Creates a fix-it for the given replacements. // Takes the the source location that will be replaced, and the new text. FixItHint CreateFixIt(SourceRange EditRange, const std::string &NewText); const SourceManager *SourceMgr; const LangOptions *LangOpts; const IncludeStyle Style; FileID CurrentFileID; // The file name stripped of common suffixes. StringRef CanonicalFile; // Locations of visited include directives. SourceRangeVector SourceLocations; // Mapping from file name to #include locations. llvm::StringMap IncludeLocations; // Includes sorted into buckets. SmallVector IncludeBucket[IK_InvalidInclude]; }; } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H