blob: 82341c78f8278ad87f3e474c4a8076ccf9acbdb6 [file] [log] [blame]
//===--- 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<Stmt*, Stmt*> 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<Expr>(S))
return false;
Stmt* P = getParent(S);
return P ? !isa<CompoundStmt>(P) : false;
}