ParentMap.h revision e9aae62e8bca3abfc1dc36f67845444291171e13
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- ParentMap.h - Mappings from Stmts to their Parents -----*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  This file defines the ParentMap class.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_PARENTMAP_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_PARENTMAP_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Stmt;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Expr;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ParentMap {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* Impl;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsSemantic;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ParentMap(Stmt* ASTRoot, bool isSemantic = false);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ParentMap();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Adds and/or updates the parent/child-relations of the complete
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// stmt tree of S. All children of S including indirect descendants are
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// visited and updated or inserted but not the parents of S.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void addStmt(Stmt* S);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stmt *getParent(Stmt*) const;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stmt *getParentIgnoreParens(Stmt *) const;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stmt *getParentIgnoreParenCasts(Stmt *) const;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stmt *getParentIgnoreParenImpCasts(Stmt *) const;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stmt *getOuterParenParent(Stmt *) const;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Stmt *getParent(const Stmt* S) const {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getParent(const_cast<Stmt*>(S));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Stmt *getParentIgnoreParens(const Stmt *S) const {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getParentIgnoreParens(const_cast<Stmt*>(S));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Stmt *getParentIgnoreParenCasts(const Stmt *S) const {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getParentIgnoreParenCasts(const_cast<Stmt*>(S));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasParent(Stmt* S) const {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getParent(S) != 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54
55  bool isConsumedExpr(Expr *E) const;
56
57  bool isConsumedExpr(const Expr *E) const {
58    return isConsumedExpr(const_cast<Expr*>(E));
59  }
60};
61
62} // end clang namespace
63#endif
64