brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 2c7a644 Raw
100 lines · cpp
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#include "UseRangesCheck.h"10 11// FixItHint - Let the docs script know that this class does provide fixits12 13namespace clang::tidy::llvm_check {14 15namespace {16 17class StdToLLVMReplacer : public utils::UseRangesCheck::Replacer {18public:19  explicit StdToLLVMReplacer(20      ArrayRef<utils::UseRangesCheck::Signature> Signatures)21      : Signatures(Signatures) {}22 23  ArrayRef<utils::UseRangesCheck::Signature>24  getReplacementSignatures() const override {25    return Signatures;26  }27 28  std::optional<std::string>29  getReplaceName(const NamedDecl &OriginalName) const override {30    return ("llvm::" + OriginalName.getName()).str();31  }32 33  std::optional<std::string>34  getHeaderInclusion(const NamedDecl &) const override {35    return "llvm/ADT/STLExtras.h";36  }37 38private:39  ArrayRef<utils::UseRangesCheck::Signature> Signatures;40};41 42} // namespace43 44utils::UseRangesCheck::ReplacerMap UseRangesCheck::getReplacerMap() const {45  ReplacerMap Results;46 47  static const Signature SingleSig = {{0}};48  static const Signature TwoSig = {{0}, {2}};49 50  const auto AddStdToLLVM =51      [&Results](llvm::IntrusiveRefCntPtr<Replacer> Replacer,52                 std::initializer_list<StringRef> Names) {53        for (const auto &Name : Names) {54          Results.try_emplace(("::std::" + Name).str(), Replacer);55        }56      };57 58  // Single range algorithms59  AddStdToLLVM(llvm::makeIntrusiveRefCnt<StdToLLVMReplacer>(SingleSig),60               {"all_of",      "any_of",61                "none_of",     "for_each",62                "find",        "find_if",63                "find_if_not", "fill",64                "count",       "count_if",65                "copy",        "copy_if",66                "transform",   "replace",67                "remove_if",   "stable_sort",68                "partition",   "partition_point",69                "is_sorted",   "min_element",70                "max_element", "binary_search",71                "lower_bound", "upper_bound",72                "unique",      "uninitialized_copy"});73 74  // Two range algorithms75  AddStdToLLVM(llvm::makeIntrusiveRefCnt<StdToLLVMReplacer>(TwoSig),76               {"equal", "mismatch", "includes"});77 78  return Results;79}80 81UseRangesCheck::UseRangesCheck(StringRef Name, ClangTidyContext *Context)82    : utils::UseRangesCheck(Name, Context) {}83 84DiagnosticBuilder UseRangesCheck::createDiag(const CallExpr &Call) {85  return diag(Call.getBeginLoc(), "use an LLVM range-based algorithm");86}87 88ArrayRef<std::pair<StringRef, StringRef>>89UseRangesCheck::getFreeBeginEndMethods() const {90  static constexpr std::pair<StringRef, StringRef> Refs[] = {91      {"::std::begin", "::std::end"},92      {"::std::cbegin", "::std::cend"},93      {"::std::rbegin", "::std::rend"},94      {"::std::crbegin", "::std::crend"},95  };96  return Refs;97}98 99} // namespace clang::tidy::llvm_check100