//===--- ParentMap.cpp - Mappings from Stmts to their Parents ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the ParentMap class. // //===----------------------------------------------------------------------===// #include "clang/AST/ParentMap.h" #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" #include "llvm/ADT/DenseMap.h" using namespace clang; typedef llvm::DenseMap MapTy; static void BuildParentMap(MapTy& M, Stmt* S) { for (Stmt::child_iterator I=S->child_begin(), E=S->child_end(); I!=E; ++I) if (*I) { M[*I] = S; BuildParentMap(M, *I); } } ParentMap::ParentMap(Stmt* S) : Impl(0) { if (S) { MapTy *M = new MapTy(); BuildParentMap(*M, S); Impl = M; } } ParentMap::~ParentMap() { delete (MapTy*) Impl; } Stmt* ParentMap::getParent(Stmt* S) const { MapTy* M = (MapTy*) Impl; MapTy::iterator I = M->find(S); return I == M->end() ? 0 : I->second; } bool ParentMap::isSubExpr(Stmt* S) const { if (!isa(S)) return false; Stmt* P = getParent(S); return P ? !isa(P) : false; }