71 lines · cpp
1//===--- StmtObjC.cpp - Classes for representing ObjC statements ---------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the subclesses of Stmt class declared in StmtObjC.h10//11//===----------------------------------------------------------------------===//12 13#include "clang/AST/StmtObjC.h"14 15#include "clang/AST/Expr.h"16#include "clang/AST/ASTContext.h"17 18using namespace clang;19 20ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect,21 Stmt *Body, SourceLocation FCL,22 SourceLocation RPL)23 : Stmt(ObjCForCollectionStmtClass) {24 SubExprs[ELEM] = Elem;25 SubExprs[COLLECTION] = Collect;26 SubExprs[BODY] = Body;27 ForLoc = FCL;28 RParenLoc = RPL;29}30 31ObjCAtTryStmt::ObjCAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt,32 Stmt **CatchStmts, unsigned NumCatchStmts,33 Stmt *atFinallyStmt)34 : Stmt(ObjCAtTryStmtClass), AtTryLoc(atTryLoc),35 NumCatchStmts(NumCatchStmts), HasFinally(atFinallyStmt != nullptr) {36 Stmt **Stmts = getStmts();37 Stmts[0] = atTryStmt;38 for (unsigned I = 0; I != NumCatchStmts; ++I)39 Stmts[I + 1] = CatchStmts[I];40 41 if (HasFinally)42 Stmts[NumCatchStmts + 1] = atFinallyStmt;43}44 45ObjCAtTryStmt *ObjCAtTryStmt::Create(const ASTContext &Context,46 SourceLocation atTryLoc, Stmt *atTryStmt,47 Stmt **CatchStmts, unsigned NumCatchStmts,48 Stmt *atFinallyStmt) {49 size_t Size =50 totalSizeToAlloc<Stmt *>(1 + NumCatchStmts + (atFinallyStmt != nullptr));51 void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt));52 return new (Mem) ObjCAtTryStmt(atTryLoc, atTryStmt, CatchStmts, NumCatchStmts,53 atFinallyStmt);54}55 56ObjCAtTryStmt *ObjCAtTryStmt::CreateEmpty(const ASTContext &Context,57 unsigned NumCatchStmts,58 bool HasFinally) {59 size_t Size = totalSizeToAlloc<Stmt *>(1 + NumCatchStmts + HasFinally);60 void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt));61 return new (Mem) ObjCAtTryStmt(EmptyShell(), NumCatchStmts, HasFinally);62}63 64SourceLocation ObjCAtTryStmt::getEndLoc() const {65 if (HasFinally)66 return getFinallyStmt()->getEndLoc();67 if (NumCatchStmts)68 return getCatchStmt(NumCatchStmts - 1)->getEndLoc();69 return getTryBody()->getEndLoc();70}71