//===------------ 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
