brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 6efec97 Raw
77 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_INCLUDESORTER_H10#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_INCLUDESORTER_H11 12#include "../ClangTidyCheck.h"13#include <optional>14#include <string>15 16namespace clang::tidy {17namespace utils {18 19/// Class used by ``IncludeInserterCallback`` to record the names of the20/// inclusions in a given source file being processed and generate the necessary21/// commands to sort the inclusions according to the precedence encoded in22/// ``IncludeKinds``.23class IncludeSorter {24public:25  /// Supported include styles.26  enum IncludeStyle { IS_LLVM = 0, IS_Google = 1, IS_Google_ObjC = 2 };27 28  /// The classifications of inclusions, in the order they should be sorted.29  enum IncludeKinds {30    IK_MainTUInclude = 0,    ///< e.g. ``#include "foo.h"`` when editing foo.cc31    IK_CSystemInclude = 1,   ///< e.g. ``#include <stdio.h>``32    IK_CXXSystemInclude = 2, ///< e.g. ``#include <vector>``33    IK_NonSystemInclude = 3, ///< e.g. ``#include "bar.h"``34    IK_GeneratedInclude = 4, ///< e.g. ``#include "bar.proto.h"``35    IK_InvalidInclude = 5    ///< total number of valid ``IncludeKind``s36  };37 38  /// ``IncludeSorter`` constructor; takes the FileID and name of the file to be39  /// processed by the sorter.40  IncludeSorter(const SourceManager *SourceMgr, FileID FileID,41                StringRef FileName, IncludeStyle Style);42 43  /// Adds the given include directive to the sorter.44  void addInclude(StringRef FileName, bool IsAngled,45                  SourceLocation HashLocation, SourceLocation EndLocation);46 47  /// Creates a quoted inclusion directive in the right sort order. Returns48  /// std::nullopt on error or if header inclusion directive for header already49  /// exists.50  std::optional<FixItHint> createIncludeInsertion(StringRef FileName,51                                                  bool IsAngled);52 53private:54  using SourceRangeVector = SmallVector<SourceRange, 1>;55 56  const SourceManager *SourceMgr;57  const IncludeStyle Style;58  FileID CurrentFileID;59  /// The file name stripped of common suffixes.60  StringRef CanonicalFile;61  /// Locations of visited include directives.62  SourceRangeVector SourceLocations;63  /// Mapping from file name to #include locations.64  llvm::StringMap<SourceRangeVector> IncludeLocations;65  /// Includes sorted into buckets.66  SmallVector<std::string, 1> IncludeBucket[IK_InvalidInclude];67};68 69} // namespace utils70 71template <> struct OptionEnumMapping<utils::IncludeSorter::IncludeStyle> {72  static ArrayRef<std::pair<utils::IncludeSorter::IncludeStyle, StringRef>>73  getEnumMapping();74};75} // namespace clang::tidy76#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_INCLUDESORTER_H77