blob: 9db5f6134f80e27a9dac9f4b891f38823d1f30c3 [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 Kremenek92866e22007-10-29 20:50:16 +000020static inline VariableArrayType* FindVA(Type* t) {
21 while (ArrayType* vt = dyn_cast<ArrayType>(t)) {
22 if (VariableArrayType* vat = dyn_cast<VariableArrayType>(vt))
23 if (vat->getSizeExpr())
24 return vat;
25
26 t = vt->getElementType().getTypePtr();
Ted Kremenekc325e7f2007-10-18 18:19:31 +000027 }
28
Ted Kremenek92866e22007-10-29 20:50:16 +000029 return NULL;
30}
31
32void StmtIteratorBase::NextVA() {
33 assert (getVAPtr());
34
35 VariableArrayType* p = getVAPtr();
36 p = FindVA(p->getElementType().getTypePtr());
37 setVAPtr(p);
38
39 if (!p) {
40 VarDecl* VD = cast<VarDecl>(decl);
41
42 if (!VD->Init)
43 NextDecl();
44 }
45}
46
47void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
48 assert (inDeclMode());
49 assert (getVAPtr() == NULL);
50 assert (decl);
51
52 if (ImmediateAdvance) {
53 decl = decl->getNextDeclarator();
54
55 if (!decl) {
56 RawVAPtr = 0;
57 return;
58 }
59 }
60
61 for ( ; decl ; decl = decl->getNextDeclarator()) {
62 if (!decl) {
63 RawVAPtr = 0;
64 return;
65 }
66
67 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
68 if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
69 setVAPtr(VAPtr);
70 return;
71 }
72
73 if (VD->getInit())
74 return;
75 }
76 else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(decl))
77 if (ECD->getInitExpr())
78 return;
79 }
80}
81
82StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
83 : decl(d), RawVAPtr(DeclMode) {
84 assert (decl);
85 NextDecl(false);
Ted Kremenekc7c326a2007-10-18 16:25:40 +000086}
Ted Kremenek9caf8b12007-10-18 00:24:38 +000087
Ted Kremenekb990f182007-10-25 22:24:19 +000088Stmt*& StmtIteratorBase::GetDeclExpr() const {
Ted Kremenek92866e22007-10-29 20:50:16 +000089 if (VariableArrayType* VAPtr = getVAPtr()) {
90 assert (VAPtr->SizeExpr);
91 return reinterpret_cast<Stmt*&>(VAPtr->SizeExpr);
Ted Kremenekb990f182007-10-25 22:24:19 +000092 }
Ted Kremenek92866e22007-10-29 20:50:16 +000093
94 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
95 assert (VD->Init);
96 return reinterpret_cast<Stmt*&>(VD->Init);
97 }
98
99 EnumConstantDecl* ECD = cast<EnumConstantDecl>(decl);
100 return reinterpret_cast<Stmt*&>(ECD->Init);
Ted Kremenek9caf8b12007-10-18 00:24:38 +0000101}