blob: a5f71db38925c9de138517ade3431db7f7631d51 [file] [log] [blame]
//===------------ 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