xref: /aosp_15_r20/external/clang/lib/AST/StmtObjC.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- StmtObjC.cpp - Classes for representing ObjC statements ---------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the subclesses of Stmt class declared in StmtObjC.h
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "clang/AST/StmtObjC.h"
15*67e74705SXin Li 
16*67e74705SXin Li #include "clang/AST/Expr.h"
17*67e74705SXin Li #include "clang/AST/ASTContext.h"
18*67e74705SXin Li 
19*67e74705SXin Li using namespace clang;
20*67e74705SXin Li 
ObjCForCollectionStmt(Stmt * Elem,Expr * Collect,Stmt * Body,SourceLocation FCL,SourceLocation RPL)21*67e74705SXin Li ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect,
22*67e74705SXin Li                                              Stmt *Body, SourceLocation FCL,
23*67e74705SXin Li                                              SourceLocation RPL)
24*67e74705SXin Li     : Stmt(ObjCForCollectionStmtClass) {
25*67e74705SXin Li   SubExprs[ELEM] = Elem;
26*67e74705SXin Li   SubExprs[COLLECTION] = Collect;
27*67e74705SXin Li   SubExprs[BODY] = Body;
28*67e74705SXin Li   ForLoc = FCL;
29*67e74705SXin Li   RParenLoc = RPL;
30*67e74705SXin Li }
31*67e74705SXin Li 
ObjCAtTryStmt(SourceLocation atTryLoc,Stmt * atTryStmt,Stmt ** CatchStmts,unsigned NumCatchStmts,Stmt * atFinallyStmt)32*67e74705SXin Li ObjCAtTryStmt::ObjCAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt,
33*67e74705SXin Li                              Stmt **CatchStmts, unsigned NumCatchStmts,
34*67e74705SXin Li                              Stmt *atFinallyStmt)
35*67e74705SXin Li     : Stmt(ObjCAtTryStmtClass), AtTryLoc(atTryLoc),
36*67e74705SXin Li       NumCatchStmts(NumCatchStmts), HasFinally(atFinallyStmt != nullptr) {
37*67e74705SXin Li   Stmt **Stmts = getStmts();
38*67e74705SXin Li   Stmts[0] = atTryStmt;
39*67e74705SXin Li   for (unsigned I = 0; I != NumCatchStmts; ++I)
40*67e74705SXin Li     Stmts[I + 1] = CatchStmts[I];
41*67e74705SXin Li 
42*67e74705SXin Li   if (HasFinally)
43*67e74705SXin Li     Stmts[NumCatchStmts + 1] = atFinallyStmt;
44*67e74705SXin Li }
45*67e74705SXin Li 
Create(const ASTContext & Context,SourceLocation atTryLoc,Stmt * atTryStmt,Stmt ** CatchStmts,unsigned NumCatchStmts,Stmt * atFinallyStmt)46*67e74705SXin Li ObjCAtTryStmt *ObjCAtTryStmt::Create(const ASTContext &Context,
47*67e74705SXin Li                                      SourceLocation atTryLoc, Stmt *atTryStmt,
48*67e74705SXin Li                                      Stmt **CatchStmts, unsigned NumCatchStmts,
49*67e74705SXin Li                                      Stmt *atFinallyStmt) {
50*67e74705SXin Li   unsigned Size =
51*67e74705SXin Li       sizeof(ObjCAtTryStmt) +
52*67e74705SXin Li       (1 + NumCatchStmts + (atFinallyStmt != nullptr)) * sizeof(Stmt *);
53*67e74705SXin Li   void *Mem = Context.Allocate(Size, llvm::alignOf<ObjCAtTryStmt>());
54*67e74705SXin Li   return new (Mem) ObjCAtTryStmt(atTryLoc, atTryStmt, CatchStmts, NumCatchStmts,
55*67e74705SXin Li                                  atFinallyStmt);
56*67e74705SXin Li }
57*67e74705SXin Li 
CreateEmpty(const ASTContext & Context,unsigned NumCatchStmts,bool HasFinally)58*67e74705SXin Li ObjCAtTryStmt *ObjCAtTryStmt::CreateEmpty(const ASTContext &Context,
59*67e74705SXin Li                                           unsigned NumCatchStmts,
60*67e74705SXin Li                                           bool HasFinally) {
61*67e74705SXin Li   unsigned Size =
62*67e74705SXin Li       sizeof(ObjCAtTryStmt) + (1 + NumCatchStmts + HasFinally) * sizeof(Stmt *);
63*67e74705SXin Li   void *Mem = Context.Allocate(Size, llvm::alignOf<ObjCAtTryStmt>());
64*67e74705SXin Li   return new (Mem) ObjCAtTryStmt(EmptyShell(), NumCatchStmts, HasFinally);
65*67e74705SXin Li }
66*67e74705SXin Li 
getLocEnd() const67*67e74705SXin Li SourceLocation ObjCAtTryStmt::getLocEnd() const {
68*67e74705SXin Li   if (HasFinally)
69*67e74705SXin Li     return getFinallyStmt()->getLocEnd();
70*67e74705SXin Li   if (NumCatchStmts)
71*67e74705SXin Li     return getCatchStmt(NumCatchStmts - 1)->getLocEnd();
72*67e74705SXin Li   return getTryBody()->getLocEnd();
73*67e74705SXin Li }
74