15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//===--- StmtObjC.h - Classes for representing ObjC statements --*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \file 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Defines the Objective-C statement AST node classes. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_AST_STMTOBJC_H 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_AST_STMTOBJC_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Stmt.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/Compiler.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace clang { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's collection statement. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This is represented as 'for (element 'in' collection-expression)' stmt. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCForCollectionStmt : public Stmt { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ELEM, COLLECTION, BODY, END_EXPR }; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt* SubExprs[END_EXPR]; // SubExprs[ELEM] is an expression or declstmt. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation ForLoc; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation RParenLoc; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCForCollectionStmt(Stmt *Elem, Expr *Collect, Stmt *Body, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation FCL, SourceLocation RPL); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObjCForCollectionStmt(EmptyShell Empty) : 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt(ObjCForCollectionStmtClass, Empty) { } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getElement() { return SubExprs[ELEM]; } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getCollection() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<Expr*>(SubExprs[COLLECTION]); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getBody() { return SubExprs[BODY]; } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *getElement() const { return SubExprs[ELEM]; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getCollection() const { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<Expr*>(SubExprs[COLLECTION]); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *getBody() const { return SubExprs[BODY]; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setElement(Stmt *S) { SubExprs[ELEM] = S; } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setCollection(Expr *E) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[COLLECTION] = reinterpret_cast<Stmt*>(E); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setBody(Stmt *S) { SubExprs[BODY] = S; } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SourceLocation getForLoc() const { return ForLoc; } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setForLoc(SourceLocation Loc) { ForLoc = Loc; } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getRParenLoc() const { return RParenLoc; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return ForLoc; } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SubExprs[BODY]->getLocEnd(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCForCollectionStmtClass; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child_range(&SubExprs[0], &SubExprs[END_EXPR]); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@catch statement. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAtCatchStmt : public Stmt { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarDecl *ExceptionDecl; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *Body; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtCatchLoc, RParenLoc; 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObjCAtCatchStmt(SourceLocation atCatchLoc, SourceLocation rparenloc, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarDecl *catchVarDecl, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *atCatchStmt) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Stmt(ObjCAtCatchStmtClass), ExceptionDecl(catchVarDecl), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Body(atCatchStmt), AtCatchLoc(atCatchLoc), RParenLoc(rparenloc) { } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObjCAtCatchStmt(EmptyShell Empty) : 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt(ObjCAtCatchStmtClass, Empty) { } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *getCatchBody() const { return Body; } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getCatchBody() { return Body; } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setCatchBody(Stmt *S) { Body = S; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VarDecl *getCatchParamDecl() const { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExceptionDecl; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarDecl *getCatchParamDecl() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExceptionDecl; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setCatchParamDecl(VarDecl *D) { ExceptionDecl = D; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getAtCatchLoc() const { return AtCatchLoc; } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setAtCatchLoc(SourceLocation Loc) { AtCatchLoc = Loc; } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getRParenLoc() const { return RParenLoc; } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtCatchLoc; } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { return Body->getLocEnd(); } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasEllipsis() const { return getCatchParamDecl() == nullptr; } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAtCatchStmtClass; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { return child_range(&Body, &Body + 1); } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@finally statement 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAtFinallyStmt : public Stmt { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *AtFinallyStmt; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtFinallyLoc; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObjCAtFinallyStmt(SourceLocation atFinallyLoc, Stmt *atFinallyStmt) 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : Stmt(ObjCAtFinallyStmtClass), 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AtFinallyStmt(atFinallyStmt), AtFinallyLoc(atFinallyLoc) {} 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) explicit ObjCAtFinallyStmt(EmptyShell Empty) : 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Stmt(ObjCAtFinallyStmtClass, Empty) { } 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const Stmt *getFinallyBody() const { return AtFinallyStmt; } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getFinallyBody() { return AtFinallyStmt; } 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void setFinallyBody(Stmt *S) { AtFinallyStmt = S; } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtFinallyLoc; } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AtFinallyStmt->getLocEnd(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getAtFinallyLoc() const { return AtFinallyLoc; } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setAtFinallyLoc(SourceLocation Loc) { AtFinallyLoc = Loc; } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAtFinallyStmtClass; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child_range(&AtFinallyStmt, &AtFinallyStmt+1); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@try ... \@catch ... \@finally statement. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAtTryStmt : public Stmt { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The location of the @ in the \@try. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtTryLoc; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of catch blocks in this statement. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumCatchStmts : 16; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether this statement has a \@finally statement. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasFinally : 1; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// \brief Retrieve the statements that are stored after this \@try statement. 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// The order of the statements in memory follows the order in the source, 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// with the \@try body first, followed by the \@catch statements (if any) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// and, finally, the \@finally (if it exists). 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Stmt **getStmts() { return reinterpret_cast<Stmt **> (this + 1); } 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const Stmt* const *getStmts() const { 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return reinterpret_cast<const Stmt * const*> (this + 1); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObjCAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Stmt **CatchStmts, unsigned NumCatchStmts, 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Stmt *atFinallyStmt); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit ObjCAtTryStmt(EmptyShell Empty, unsigned NumCatchStmts, 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool HasFinally) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Stmt(ObjCAtTryStmtClass, Empty), NumCatchStmts(NumCatchStmts), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasFinally(HasFinally) { } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ObjCAtTryStmt *Create(const ASTContext &Context, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation atTryLoc, Stmt *atTryStmt, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt **CatchStmts, unsigned NumCatchStmts, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *atFinallyStmt); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ObjCAtTryStmt *CreateEmpty(const ASTContext &Context, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumCatchStmts, bool HasFinally); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the location of the @ in the \@try. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getAtTryLoc() const { return AtTryLoc; } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setAtTryLoc(SourceLocation Loc) { AtTryLoc = Loc; } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the \@try body. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *getTryBody() const { return getStmts()[0]; } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getTryBody() { return getStmts()[0]; } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setTryBody(Stmt *S) { getStmts()[0] = S; } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the number of \@catch statements in this try-catch-finally 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// block. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned getNumCatchStmts() const { return NumCatchStmts; } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve a \@catch statement. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjCAtCatchStmt *getCatchStmt(unsigned I) const { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(I < NumCatchStmts && "Out-of-bounds @catch index"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast_or_null<ObjCAtCatchStmt>(getStmts()[I + 1]); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve a \@catch statement. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCAtCatchStmt *getCatchStmt(unsigned I) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(I < NumCatchStmts && "Out-of-bounds @catch index"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast_or_null<ObjCAtCatchStmt>(getStmts()[I + 1]); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Set a particular catch statement. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setCatchStmt(unsigned I, ObjCAtCatchStmt *S) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(I < NumCatchStmts && "Out-of-bounds @catch index"); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getStmts()[I + 1] = S; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the \@finally statement, if any. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjCAtFinallyStmt *getFinallyStmt() const { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasFinally) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nullptr; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast_or_null<ObjCAtFinallyStmt>(getStmts()[1 + NumCatchStmts]); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCAtFinallyStmt *getFinallyStmt() { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasFinally) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nullptr; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast_or_null<ObjCAtFinallyStmt>(getStmts()[1 + NumCatchStmts]); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setFinallyStmt(Stmt *S) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(HasFinally && "@try does not have a @finally slot!"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getStmts()[1 + NumCatchStmts] = S; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtTryLoc; } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool classof(const Stmt *T) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAtTryStmtClass; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child_range(getStmts(), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getStmts() + 1 + NumCatchStmts + HasFinally); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@synchronized statement. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Example: 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \code 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// @synchronized (sem) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// do-something; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \endcode 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAtSynchronizedStmt : public Stmt { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { SYNC_EXPR, SYNC_BODY, END_EXPR }; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt* SubStmts[END_EXPR]; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtSynchronizedLoc; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCAtSynchronizedStmt(SourceLocation atSynchronizedLoc, Stmt *synchExpr, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *synchBody) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Stmt(ObjCAtSynchronizedStmtClass) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubStmts[SYNC_EXPR] = synchExpr; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubStmts[SYNC_BODY] = synchBody; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtSynchronizedLoc = atSynchronizedLoc; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObjCAtSynchronizedStmt(EmptyShell Empty) : 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt(ObjCAtSynchronizedStmtClass, Empty) { } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getAtSynchronizedLoc() const { return AtSynchronizedLoc; } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setAtSynchronizedLoc(SourceLocation Loc) { AtSynchronizedLoc = Loc; } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompoundStmt *getSynchBody() const { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CompoundStmt*>(SubStmts[SYNC_BODY]); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundStmt *getSynchBody() { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CompoundStmt*>(SubStmts[SYNC_BODY]); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setSynchBody(Stmt *S) { SubStmts[SYNC_BODY] = S; } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getSynchExpr() const { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<Expr*>(SubStmts[SYNC_EXPR]); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSynchExpr() { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<Expr*>(SubStmts[SYNC_EXPR]); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setSynchExpr(Stmt *S) { SubStmts[SYNC_EXPR] = S; } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtSynchronizedLoc; } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSynchBody()->getLocEnd(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAtSynchronizedStmtClass; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return child_range(&SubStmts[0], &SubStmts[0]+END_EXPR); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@throw statement. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAtThrowStmt : public Stmt { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *Throw; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtThrowLoc; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCAtThrowStmt(SourceLocation atThrowLoc, Stmt *throwExpr) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Stmt(ObjCAtThrowStmtClass), Throw(throwExpr) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtThrowLoc = atThrowLoc; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObjCAtThrowStmt(EmptyShell Empty) : 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt(ObjCAtThrowStmtClass, Empty) { } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getThrowExpr() const { return reinterpret_cast<Expr*>(Throw); } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getThrowExpr() { return reinterpret_cast<Expr*>(Throw); } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setThrowExpr(Stmt *S) { Throw = S; } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getThrowLoc() { return AtThrowLoc; } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setThrowLoc(SourceLocation Loc) { AtThrowLoc = Loc; } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtThrowLoc; } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Throw ? Throw->getLocEnd() : AtThrowLoc; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAtThrowStmtClass; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { return child_range(&Throw, &Throw+1); } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Represents Objective-C's \@autoreleasepool Statement 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjCAutoreleasePoolStmt : public Stmt { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *SubStmt; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation AtLoc; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCAutoreleasePoolStmt(SourceLocation atLoc, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *subStmt) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Stmt(ObjCAutoreleasePoolStmtClass), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubStmt(subStmt), AtLoc(atLoc) {} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObjCAutoreleasePoolStmt(EmptyShell Empty) : 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt(ObjCAutoreleasePoolStmtClass, Empty) { } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *getSubStmt() const { return SubStmt; } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getSubStmt() { return SubStmt; } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setSubStmt(Stmt *S) { SubStmt = S; } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLocEnd() const LLVM_READONLY { return SubStmt->getLocEnd();} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getAtLoc() const { return AtLoc; } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setAtLoc(SourceLocation Loc) { AtLoc = Loc; } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ObjCAutoreleasePoolStmtClass; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_range children() { return child_range(&SubStmt, &SubStmt + 1); } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace clang 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)