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