10#include "clang/AST/Decl.h"
11#include "llvm/ADT/ArrayRef.h"
12#include "llvm/ADT/IntrusiveRefCntPtr.h"
13#include "llvm/ADT/SmallVector.h"
14#include "llvm/ADT/StringRef.h"
15#include <initializer_list>
61 "uninitialized_default_construct",
62 "uninitialized_value_construct",
67 "remove",
"remove_if",
"stable_partition",
"partition",
"unique"};
70 "copy",
"copy_if",
"copy_backward",
"move",
71 "move_backward",
"remove_copy",
"remove_copy_if",
"reverse_copy",
72 "transform",
"unique_copy",
"uninitialized_copy",
"uninitialized_move",
76 "equal",
"mismatch",
"includes",
"lexicographical_compare",
77 "find_end",
"search",
"is_permutation",
85 "set_symmetric_difference",
101 ResultUsePolicy ResultPolicy = {})
102 : Signatures(std::
move(Signatures)), ResultPolicy(ResultPolicy) {}
103 std::optional<std::string>
104 getReplaceName(
const NamedDecl &OriginalName)
const override {
105 return (
"std::ranges::" + OriginalName.getName()).str();
107 ArrayRef<UseRangesCheck::Signature>
108 getReplacementSignatures()
const override {
111 ResultUsePolicy getResultUsePolicy(
const NamedDecl &,
bool)
const override {
116 SmallVector<UseRangesCheck::Signature> Signatures;
117 ResultUsePolicy ResultPolicy;
120class StdAlgorithmReplacer :
public StdReplacer {
121 using StdReplacer::StdReplacer;
122 std::optional<std::string>
123 getHeaderInclusion(
const NamedDecl & )
const override {
124 return "<algorithm>";
128class StdNumericReplacer :
public StdReplacer {
129 using StdReplacer::StdReplacer;
130 std::optional<std::string>
131 getHeaderInclusion(
const NamedDecl & )
const override {
141 static const Signature SingleRangeArgs = {{0}};
144 static const Signature TwoRangeArgs = {{0}, {2}};
147 static const Signature SinglePivotRange = {{0, 2}};
149 static const Signature SingleRangeFunc[] = {SingleRangeArgs};
151 static const Signature TwoRangeFunc[] = {TwoRangeArgs};
153 static const Signature SinglePivotFunc[] = {SinglePivotRange};
155 using ResultPolicy = StdReplacer::ResultUsePolicy;
156 using PolicyKind = ResultPolicy::Kind;
157 const ResultPolicy DefaultPolicy;
158 const ResultPolicy BeginResultPolicy = {
159 PolicyKind::AppendAccessorForUsedResult,
".begin()"};
160 const ResultPolicy OutResultPolicy = {PolicyKind::AppendAccessorForUsedResult,
163 struct AlgorithmGroup {
164 ArrayRef<Signature> Signatures;
165 ArrayRef<const char *> Names;
168 const AlgorithmGroup AlgorithmNames[] = {
178 SmallString<64> Buff;
179 for (
const auto &[Signatures, Values, Policy] : AlgorithmNames) {
180 auto Replacer = llvm::makeIntrusiveRefCnt<StdAlgorithmReplacer>(
182 for (
const auto &Name : Values) {
183 Buff.assign({
"::std::", Name});
187 if (getLangOpts().CPlusPlus23)
190 llvm::makeIntrusiveRefCnt<StdNumericReplacer>(
192 std::end(SingleRangeFunc)}));
198 UseReversePipe(Options.get(
"UseReversePipe", false)) {}
202 Options.store(Opts,
"UseReversePipe", UseReversePipe);
206 const LangOptions &LangOpts)
const {
207 return LangOpts.CPlusPlus20;
209ArrayRef<std::pair<StringRef, StringRef>>
211 static constexpr std::pair<StringRef, StringRef> Refs[] = {
212 {
"::std::begin",
"::std::end"}, {
"::std::cbegin",
"::std::cend"}};
215std::optional<UseRangesCheck::ReverseIteratorDescriptor>
217 static constexpr std::pair<StringRef, StringRef> Refs[] = {
218 {
"::std::rbegin",
"::std::rend"}, {
"::std::crbegin",
"::std::crend"}};
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override
ArrayRef< std::pair< StringRef, StringRef > > getFreeBeginEndMethods() const override
Gets the fully qualified names of begin and end functions.
UseRangesCheck(StringRef CheckName, ClangTidyContext *Context)
void storeOptions(ClangTidyOptions::OptionMap &Opts) override
ReplacerMap getReplacerMap() const override
Gets a map of function to replace and methods to create the replacements.
std::optional< ReverseIteratorDescriptor > getReverseDescriptor() const override
llvm::StringMap< llvm::IntrusiveRefCntPtr< Replacer > > ReplacerMap
void storeOptions(ClangTidyOptions::OptionMap &Opts) override
SmallVector< Indexes, 2 > Signature
static constexpr const char * SingleRangeBeginResultNames[]
static constexpr const char * TwoRangeOutResultNames[]
static constexpr const char * TwoRangeNames[]
static constexpr const char * SinglePivotRangeNames[]
static constexpr const char * SinglePivotRangeBeginResultNames[]
static constexpr const char * SinglePivotRangeOutResultNames[]
static constexpr const char * SingleRangeNames[]
static constexpr const char * SingleRangeOutResultNames[]
llvm::StringMap< ClangTidyValue > OptionMap