blob: 2d198c029d949dcdb1dd4b29b2f0a528e94e3d4a [file] [log] [blame]
Ted Kremenek4f398252007-10-18 00:24:38 +00001//===--- StmtIterator.cpp - Iterators for Statements ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Ted Kremenek and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines internal methods for StmtIterator.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/StmtIterator.h"
Ted Kremenek6d112672007-10-18 18:19:31 +000015#include "clang/AST/Expr.h"
Ted Kremenek4f398252007-10-18 00:24:38 +000016#include "clang/AST/Decl.h"
17
18using namespace clang;
19
Ted Kremenek6d112672007-10-18 18:19:31 +000020void StmtIteratorBase::NextDecl() {
21 assert (FirstDecl && Ptr.D);
22
23 do Ptr.D = Ptr.D->getNextDeclarator();
24 while (Ptr.D != NULL && !isa<VarDecl>(Ptr.D));
Ted Kremeneka6478552007-10-18 23:28:49 +000025
26 if (Ptr.D == NULL) FirstDecl = NULL;
Ted Kremenek38290e82007-10-18 16:25:40 +000027}
28
Ted Kremenek6d112672007-10-18 18:19:31 +000029StmtIteratorBase::StmtIteratorBase(ScopedDecl* d) {
Ted Kremenek38290e82007-10-18 16:25:40 +000030 assert (d);
31
Ted Kremenek6d112672007-10-18 18:19:31 +000032 while (d != NULL) {
33 if (VarDecl* V = dyn_cast<VarDecl>(d))
34 if (V->getInit()) break;
35
36 d = d->getNextDeclarator();
37 }
38
39 FirstDecl = d;
40 Ptr.D = d;
41}
42
43void StmtIteratorBase::PrevDecl() {
44 assert (FirstDecl);
45 assert (Ptr.D != FirstDecl);
Ted Kremenek38290e82007-10-18 16:25:40 +000046
47 // March through the list of decls until we find the decl just before
48 // the one we currently point
49
Ted Kremenek6d112672007-10-18 18:19:31 +000050 ScopedDecl* d = FirstDecl;
51 ScopedDecl* lastVD = d;
Ted Kremenek38290e82007-10-18 16:25:40 +000052
Ted Kremenek6d112672007-10-18 18:19:31 +000053 while (d->getNextDeclarator() != Ptr.D) {
54 if (VarDecl* V = dyn_cast<VarDecl>(d))
55 if (V->getInit())
56 lastVD = d;
57
58 d = d->getNextDeclarator();
59 }
60
61 Ptr.D = lastVD;
Ted Kremenek38290e82007-10-18 16:25:40 +000062}
Ted Kremenek4f398252007-10-18 00:24:38 +000063
Ted Kremenekc65a1fc2007-10-24 16:52:34 +000064Stmt*& StmtIteratorBase::GetInitializer() const {
65 return reinterpret_cast<Stmt*&>(cast<VarDecl>(Ptr.D)->Init);
Ted Kremenek4f398252007-10-18 00:24:38 +000066}