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>
57 "uninitialized_default_construct",
58 "uninitialized_value_construct",
63 "remove",
"remove_if",
"stable_partition",
"partition",
"unique"};
66 "copy",
"copy_if",
"copy_backward",
"move",
67 "move_backward",
"remove_copy",
"remove_copy_if",
"reverse_copy",
68 "transform",
"unique_copy",
"uninitialized_copy",
"uninitialized_move",
74 "equal_range",
"minmax_element"};
80 "equal",
"includes",
"lexicographical_compare",
81 "find_end",
"search",
"is_permutation",
89 "set_symmetric_difference",
107 ResultUsePolicy ResultPolicy = {})
108 : Signatures(std::
move(Signatures)), ResultPolicy(ResultPolicy) {}
109 std::optional<std::string>
110 getReplaceName(
const NamedDecl &OriginalName)
const override {
111 return (
"std::ranges::" + OriginalName.getName()).str();
113 ArrayRef<UseRangesCheck::Signature>
114 getReplacementSignatures()
const override {
117 ResultUsePolicy getResultUsePolicy(
const NamedDecl &,
bool)
const override {
122 SmallVector<UseRangesCheck::Signature> Signatures;
123 ResultUsePolicy ResultPolicy;
126class StdAlgorithmReplacer :
public StdReplacer {
127 using StdReplacer::StdReplacer;
128 std::optional<std::string>
129 getHeaderInclusion(
const NamedDecl & )
const override {
130 return "<algorithm>";
134class StdNumericReplacer :
public StdReplacer {
135 using StdReplacer::StdReplacer;
136 std::optional<std::string>
137 getHeaderInclusion(
const NamedDecl & )
const override {
147 static const Signature SingleRangeArgs = {{0}};
150 static const Signature TwoRangeArgs = {{0}, {2}};
153 static const Signature SinglePivotRange = {{0, 2}};
155 static const Signature SingleRangeFunc[] = {SingleRangeArgs};
157 static const Signature TwoRangeFunc[] = {TwoRangeArgs};
159 static const Signature SinglePivotFunc[] = {SinglePivotRange};
161 using ResultPolicy = StdReplacer::ResultUsePolicy;
162 using PolicyKind = ResultPolicy::Kind;
163 const ResultPolicy DefaultPolicy;
164 const ResultPolicy BeginResultPolicy = {
165 PolicyKind::AppendAccessorForUsedResult,
".begin()"};
166 const ResultPolicy OutResultPolicy = {PolicyKind::AppendAccessorForUsedResult,
168 const ResultPolicy FunctionResultPolicy = {
169 PolicyKind::AppendAccessorForUsedResult,
".fun"};
170 const ResultPolicy StructuredBindingPolicy = {
171 PolicyKind::KeepFixItOnlyForStructuredBinding, {}};
172 const ResultPolicy DiagnosticOnlyPolicy = {
173 PolicyKind::SuppressFixItForUsedResult, {}};
175 struct AlgorithmGroup {
176 ArrayRef<Signature> Signatures;
177 ArrayRef<const char *> Names;
180 const AlgorithmGroup AlgorithmNames[] = {
186 StructuredBindingPolicy},
195 SmallString<64> Buff;
196 for (
const auto &[Signatures, Values, Policy] : AlgorithmNames) {
197 auto Replacer = llvm::makeIntrusiveRefCnt<StdAlgorithmReplacer>(
199 for (
const auto &Name : Values) {
200 Buff.assign({
"::std::", Name});
204 if (getLangOpts().CPlusPlus23)
207 llvm::makeIntrusiveRefCnt<StdNumericReplacer>(
209 std::end(SingleRangeFunc)}));
215 UseReversePipe(Options.get(
"UseReversePipe", false)) {}
219 Options.store(Opts,
"UseReversePipe", UseReversePipe);
223 const LangOptions &LangOpts)
const {
224 return LangOpts.CPlusPlus20;
226ArrayRef<std::pair<StringRef, StringRef>>
228 static constexpr std::pair<StringRef, StringRef> Refs[] = {
229 {
"::std::begin",
"::std::end"}, {
"::std::cbegin",
"::std::cend"}};
232std::optional<UseRangesCheck::ReverseIteratorDescriptor>
234 static constexpr std::pair<StringRef, StringRef> Refs[] = {
235 {
"::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 * SingleRangeStructuredBindingNames[]
static constexpr const char * SinglePivotRangeBeginResultNames[]
static constexpr const char * SinglePivotRangeOutResultNames[]
static constexpr const char * TwoRangeStructuredBindingNames[]
static constexpr const char * SingleRangeNames[]
static constexpr const char * SingleRangeOutResultNames[]
static constexpr const char * SingleRangeFunctionResultNames[]
static constexpr const char * SingleRangeDiagnosticOnlyNames[]
llvm::StringMap< ClangTidyValue > OptionMap