Home | History | Annotate | Download | only in AST
      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 
     43   const Stmt *getParent(const Stmt* S) const {
     44     return getParent(const_cast<Stmt*>(S));
     45   }
     46 
     47   const Stmt *getParentIgnoreParens(const Stmt *S) const {
     48     return getParentIgnoreParens(const_cast<Stmt*>(S));
     49   }
     50 
     51   const Stmt *getParentIgnoreParenCasts(const Stmt *S) const {
     52     return getParentIgnoreParenCasts(const_cast<Stmt*>(S));
     53   }
     54 
     55   bool hasParent(Stmt* S) const {
     56     return getParent(S) != nullptr;
     57   }
     58 
     59   bool isConsumedExpr(Expr *E) const;
     60 
     61   bool isConsumedExpr(const Expr *E) const {
     62     return isConsumedExpr(const_cast<Expr*>(E));
     63   }
     64 };
     65 
     66 } // end clang namespace
     67 #endif
     68