blob: 89d17bd340bb6fe9057488b2667bedeef9c8ca6c [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());
Ted Kremenek103a1b42007-10-29 21:23:58 +000034 assert (decl);
Ted Kremenek92866e22007-10-29 20:50:16 +000035
36 VariableArrayType* p = getVAPtr();
37 p = FindVA(p->getElementType().getTypePtr());
38 setVAPtr(p);
39
40 if (!p) {
41 VarDecl* VD = cast<VarDecl>(decl);
42
43 if (!VD->Init)
44 NextDecl();
45 }
46}
47
48void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
49 assert (inDeclMode());
50 assert (getVAPtr() == NULL);
51 assert (decl);
52
53 if (ImmediateAdvance) {
54 decl = decl->getNextDeclarator();
55
56 if (!decl) {
57 RawVAPtr = 0;
58 return;
59 }
60 }
61
62 for ( ; decl ; decl = decl->getNextDeclarator()) {
Ted Kremenek92866e22007-10-29 20:50:16 +000063 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
64 if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
65 setVAPtr(VAPtr);
66 return;
67 }
68
69 if (VD->getInit())
70 return;
71 }
72 else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(decl))
73 if (ECD->getInitExpr())
74 return;
75 }
Ted Kremenek103a1b42007-10-29 21:23:58 +000076
77 if (!decl) {
78 RawVAPtr = 0;
79 return;
80 }
Ted Kremenek92866e22007-10-29 20:50:16 +000081}
82
83StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
84 : decl(d), RawVAPtr(DeclMode) {
85 assert (decl);
86 NextDecl(false);
Ted Kremenekc7c326a2007-10-18 16:25:40 +000087}
Ted Kremenek9caf8b12007-10-18 00:24:38 +000088
Ted Kremenekb990f182007-10-25 22:24:19 +000089Stmt*& StmtIteratorBase::GetDeclExpr() const {
Ted Kremenek92866e22007-10-29 20:50:16 +000090 if (VariableArrayType* VAPtr = getVAPtr()) {
91 assert (VAPtr->SizeExpr);
92 return reinterpret_cast<Stmt*&>(VAPtr->SizeExpr);
Ted Kremenekb990f182007-10-25 22:24:19 +000093 }
Ted Kremenek92866e22007-10-29 20:50:16 +000094
95 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
96 assert (VD->Init);
97 return reinterpret_cast<Stmt*&>(VD->Init);
98 }
99
100 EnumConstantDecl* ECD = cast<EnumConstantDecl>(decl);
101 return reinterpret_cast<Stmt*&>(ECD->Init);
Ted Kremenek9caf8b12007-10-18 00:24:38 +0000102}