| //===------------ 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 <string> |
| |
| 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 <stdio.h> |
| IK_CXXSystemInclude = 2, // e.g. #include <vector> |
| 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<FixItHint> 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<FixItHint> CreateIncludeInsertion(StringRef FileName, bool IsAngled); |
| |
| private: |
| typedef SmallVector<SourceRange, 1> 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<SourceRangeVector> IncludeLocations; |
| // Includes sorted into buckets. |
| SmallVector<std::string, 1> IncludeBucket[IK_InvalidInclude]; |
| }; |
| |
| } // namespace tidy |
| } // namespace clang |
| #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H |