1 //===--- ParentMap.h - Mappings from Stmts to their Parents -----*- 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 // This file defines the ParentMap class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_AST_PARENTMAP_H 14 #define LLVM_CLANG_AST_PARENTMAP_H 15 16 namespace clang { 17 class Stmt; 18 class Expr; 19 20 class ParentMap { 21 void* Impl; 22 public: 23 ParentMap(Stmt* ASTRoot); 24 ~ParentMap(); 25 26 /// Adds and/or updates the parent/child-relations of the complete 27 /// stmt tree of S. All children of S including indirect descendants are 28 /// visited and updated or inserted but not the parents of S. 29 void addStmt(Stmt* S); 30 31 /// Manually sets the parent of \p S to \p Parent. 32 /// 33 /// If \p S is already in the map, this method will update the mapping. 34 void setParent(const Stmt *S, const Stmt *Parent); 35 36 Stmt *getParent(Stmt*) const; 37 Stmt *getParentIgnoreParens(Stmt *) const; 38 Stmt *getParentIgnoreParenCasts(Stmt *) const; 39 Stmt *getParentIgnoreParenImpCasts(Stmt *) const; 40 Stmt *getOuterParenParent(Stmt *) const; 41 getParent(const Stmt * S)42 const Stmt *getParent(const Stmt* S) const { 43 return getParent(const_cast<Stmt*>(S)); 44 } 45 getParentIgnoreParens(const Stmt * S)46 const Stmt *getParentIgnoreParens(const Stmt *S) const { 47 return getParentIgnoreParens(const_cast<Stmt*>(S)); 48 } 49 getParentIgnoreParenCasts(const Stmt * S)50 const Stmt *getParentIgnoreParenCasts(const Stmt *S) const { 51 return getParentIgnoreParenCasts(const_cast<Stmt*>(S)); 52 } 53 hasParent(const Stmt * S)54 bool hasParent(const Stmt *S) const { return getParent(S) != nullptr; } 55 56 bool isConsumedExpr(Expr *E) const; 57 isConsumedExpr(const Expr * E)58 bool isConsumedExpr(const Expr *E) const { 59 return isConsumedExpr(const_cast<Expr*>(E)); 60 } 61 }; 62 63 } // end clang namespace 64 #endif 65