//===--- LoopConvertUtils.h - clang-tidy ------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_UTILS_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_UTILS_H #include "clang/AST/ASTContext.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include <algorithm> #include <memory> #include <string> #include <utility> namespace clang::tidy::modernize { enum LoopFixerKind { … }; /// A map used to walk the AST in reverse: maps child Stmt to parent Stmt. StmtParentMap; /// A map used to walk the AST in reverse: /// maps VarDecl to the to parent DeclStmt. DeclParentMap; /// A map used to track which variables have been removed by a refactoring pass. /// It maps the parent ForStmt to the removed index variable's VarDecl. ReplacedVarsMap; /// A map used to remember the variable names generated in a Stmt StmtGeneratedVarNameMap; /// A vector used to store the AST subtrees of an Expr. ComponentVector; /// Class used build the reverse AST properties needed to detect /// name conflicts and free variables. class StmtAncestorASTVisitor : public clang::RecursiveASTVisitor<StmtAncestorASTVisitor> { … }; /// Class used to find the variables and member expressions on which an /// arbitrary expression depends. class ComponentFinderASTVisitor : public clang::RecursiveASTVisitor<ComponentFinderASTVisitor> { … }; /// Class used to determine if an expression is dependent on a variable declared /// inside of the loop where it would be used. class DependencyFinderASTVisitor : public clang::RecursiveASTVisitor<DependencyFinderASTVisitor> { … }; /// Class used to determine if any declarations used in a Stmt would conflict /// with a particular identifier. This search includes the names that don't /// actually appear in the AST (i.e. created by a refactoring tool) by including /// a map from Stmts to generated names associated with those stmts. class DeclFinderASTVisitor : public clang::RecursiveASTVisitor<DeclFinderASTVisitor> { … }; /// The information needed to describe a valid convertible usage /// of an array index or iterator. struct Usage { … }; /// A class to encapsulate lowering of the tool's confidence level. class Confidence { … }; // The main computational result of ForLoopIndexVisitor. UsageResult; // General functions used by ForLoopIndexUseVisitor and LoopConvertCheck. const Expr *digThroughConstructorsConversions(const Expr *E); bool areSameExpr(ASTContext *Context, const Expr *First, const Expr *Second); const DeclRefExpr *getDeclRef(const Expr *E); bool areSameVariable(const ValueDecl *First, const ValueDecl *Second); /// Discover usages of expressions consisting of index or iterator /// access. /// /// Given an index variable, recursively crawls a for loop to discover if the /// index variable is used in a way consistent with range-based for loop access. class ForLoopIndexUseVisitor : public RecursiveASTVisitor<ForLoopIndexUseVisitor> { … }; struct TUTrackingInfo { … }; /// Create names for generated variables within a particular statement. /// /// VariableNamer uses a DeclContext as a reference point, checking for any /// conflicting declarations higher up in the context or within SourceStmt. /// It creates a variable name using hints from a source container and the old /// index, if they exist. class VariableNamer { … }; } // namespace clang::tidy::modernize #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_UTILS_H