1 //===--- LoopConvertCheck.h - clang-tidy-------------------------*- C++ -*-===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H
11 
12 #include "../ClangTidyCheck.h"
13 #include "../utils/IncludeInserter.h"
14 #include "LoopConvertUtils.h"
15 
16 namespace clang::tidy::modernize {
17 
18 class LoopConvertCheck : public ClangTidyCheck {
19 public:
20   LoopConvertCheck(StringRef Name, ClangTidyContext *Context);
isLanguageVersionSupported(const LangOptions & LangOpts)21   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
22     return LangOpts.CPlusPlus;
23   }
24   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
25   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
26   void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
27                            Preprocessor *ModuleExpanderPP) override;
28   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
29 
30 private:
31   struct RangeDescriptor {
32     RangeDescriptor() = default;
33     bool ContainerNeedsDereference = false;
34     bool DerefByConstRef = false;
35     bool DerefByValue = false;
36     std::string ContainerString;
37     QualType ElemType;
38     bool NeedsReverseCall = false;
39   };
40 
41   void getAliasRange(SourceManager &SM, SourceRange &DeclRange);
42 
43   void doConversion(ASTContext *Context, const VarDecl *IndexVar,
44                     const ValueDecl *MaybeContainer, const UsageResult &Usages,
45                     const DeclStmt *AliasDecl, bool AliasUseRequired,
46                     bool AliasFromForInit, const ForStmt *Loop,
47                     RangeDescriptor Descriptor);
48 
49   StringRef getContainerString(ASTContext *Context, const ForStmt *Loop,
50                                const Expr *ContainerExpr);
51 
52   void getArrayLoopQualifiers(ASTContext *Context,
53                               const ast_matchers::BoundNodes &Nodes,
54                               const Expr *ContainerExpr,
55                               const UsageResult &Usages,
56                               RangeDescriptor &Descriptor);
57 
58   void getIteratorLoopQualifiers(ASTContext *Context,
59                                  const ast_matchers::BoundNodes &Nodes,
60                                  RangeDescriptor &Descriptor);
61 
62   void determineRangeDescriptor(ASTContext *Context,
63                                 const ast_matchers::BoundNodes &Nodes,
64                                 const ForStmt *Loop, LoopFixerKind FixerKind,
65                                 const Expr *ContainerExpr,
66                                 const UsageResult &Usages,
67                                 RangeDescriptor &Descriptor);
68 
69   bool isConvertible(ASTContext *Context, const ast_matchers::BoundNodes &Nodes,
70                      const ForStmt *Loop, LoopFixerKind FixerKind);
71 
72   StringRef getReverseFunction() const;
73   StringRef getReverseHeader() const;
74 
75   std::unique_ptr<TUTrackingInfo> TUInfo;
76   const unsigned long long MaxCopySize;
77   const Confidence::Level MinConfidence;
78   const VariableNamer::NamingStyle NamingStyle;
79   utils::IncludeInserter Inserter;
80   bool UseReverseRanges;
81   const bool UseCxx20IfAvailable;
82   std::string ReverseFunction;
83   std::string ReverseHeader;
84 };
85 
86 } // namespace clang::tidy::modernize
87 
88 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H
89