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_PARENTMAP_H 15 #define LLVM_CLANG_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 Stmt *getParent(Stmt*) const; 33 Stmt *getParentIgnoreParens(Stmt *) const; 34 Stmt *getParentIgnoreParenCasts(Stmt *) const; 35 Stmt *getOuterParenParent(Stmt *) const; 36 37 const Stmt *getParent(const Stmt* S) const { 38 return getParent(const_cast<Stmt*>(S)); 39 } 40 41 const Stmt *getParentIgnoreParens(const Stmt *S) const { 42 return getParentIgnoreParens(const_cast<Stmt*>(S)); 43 } 44 45 const Stmt *getParentIgnoreParenCasts(const Stmt *S) const { 46 return getParentIgnoreParenCasts(const_cast<Stmt*>(S)); 47 } 48 49 bool hasParent(Stmt* S) const { 50 return getParent(S) != 0; 51 } 52 53 bool isConsumedExpr(Expr *E) const; 54 55 bool isConsumedExpr(const Expr *E) const { 56 return isConsumedExpr(const_cast<Expr*>(E)); 57 } 58 }; 59 60 } // end clang namespace 61 #endif 62