brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 12d8a9e Raw
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