blob: 961ca50f2445726f5e8ca33231ed39012997934d [file] [log] [blame]
Ted Kremenek9caf8b12007-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 Kremenekc325e7f2007-10-18 18:19:31 +000015#include "clang/AST/Expr.h"
Ted Kremenek9caf8b12007-10-18 00:24:38 +000016#include "clang/AST/Decl.h"
17
18using namespace clang;
19
Ted Kremenekb990f182007-10-25 22:24:19 +000020static inline bool declHasExpr(ScopedDecl *decl) {
21 if (VarDecl* D = dyn_cast<VarDecl>(decl))
22 if (D->getInit())
23 return true;
24
25 if (EnumConstantDecl* D = dyn_cast<EnumConstantDecl>(decl))
26 if (D->getInitExpr())
27 return true;
28
29 return false;
30}
31
Ted Kremenekc325e7f2007-10-18 18:19:31 +000032void StmtIteratorBase::NextDecl() {
33 assert (FirstDecl && Ptr.D);
34
35 do Ptr.D = Ptr.D->getNextDeclarator();
Ted Kremenekb990f182007-10-25 22:24:19 +000036 while (Ptr.D != NULL && !declHasExpr(Ptr.D));
Ted Kremenek9ac59282007-10-18 23:28:49 +000037
38 if (Ptr.D == NULL) FirstDecl = NULL;
Ted Kremenekc7c326a2007-10-18 16:25:40 +000039}
40
Ted Kremenekc325e7f2007-10-18 18:19:31 +000041StmtIteratorBase::StmtIteratorBase(ScopedDecl* d) {
Ted Kremenekc7c326a2007-10-18 16:25:40 +000042 assert (d);
43
Ted Kremenekb990f182007-10-25 22:24:19 +000044 while (d != NULL && !declHasExpr(d))
Ted Kremenekc325e7f2007-10-18 18:19:31 +000045 d = d->getNextDeclarator();
Ted Kremenekc325e7f2007-10-18 18:19:31 +000046
47 FirstDecl = d;
48 Ptr.D = d;
49}
50
51void StmtIteratorBase::PrevDecl() {
52 assert (FirstDecl);
53 assert (Ptr.D != FirstDecl);
Ted Kremenekc7c326a2007-10-18 16:25:40 +000054
55 // March through the list of decls until we find the decl just before
56 // the one we currently point
57
Ted Kremenekc325e7f2007-10-18 18:19:31 +000058 ScopedDecl* d = FirstDecl;
59 ScopedDecl* lastVD = d;
Ted Kremenekc7c326a2007-10-18 16:25:40 +000060
Ted Kremenekc325e7f2007-10-18 18:19:31 +000061 while (d->getNextDeclarator() != Ptr.D) {
62 if (VarDecl* V = dyn_cast<VarDecl>(d))
63 if (V->getInit())
64 lastVD = d;
65
66 d = d->getNextDeclarator();
67 }
68
69 Ptr.D = lastVD;
Ted Kremenekc7c326a2007-10-18 16:25:40 +000070}
Ted Kremenek9caf8b12007-10-18 00:24:38 +000071
Ted Kremenekb990f182007-10-25 22:24:19 +000072Stmt*& StmtIteratorBase::GetDeclExpr() const {
73 if (VarDecl* D = dyn_cast<VarDecl>(Ptr.D))
74 return reinterpret_cast<Stmt*&>(D->Init);
75 else {
76 EnumConstantDecl* D = cast<EnumConstantDecl>(Ptr.D);
77 return reinterpret_cast<Stmt*&>(D->Init);
78 }
Ted Kremenek9caf8b12007-10-18 00:24:38 +000079}