diff options
Diffstat (limited to 'clang/lib/AST/StmtObjC.cpp')
| -rw-r--r-- | clang/lib/AST/StmtObjC.cpp | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/clang/lib/AST/StmtObjC.cpp b/clang/lib/AST/StmtObjC.cpp new file mode 100644 index 000000000000..3d586795517c --- /dev/null +++ b/clang/lib/AST/StmtObjC.cpp @@ -0,0 +1,72 @@ +//===--- StmtObjC.cpp - Classes for representing ObjC statements ---------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the subclesses of Stmt class declared in StmtObjC.h +// +//===----------------------------------------------------------------------===// + +#include "clang/AST/StmtObjC.h" + +#include "clang/AST/Expr.h" +#include "clang/AST/ASTContext.h" + +using namespace clang; + +ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect, +                                             Stmt *Body, SourceLocation FCL, +                                             SourceLocation RPL) +    : Stmt(ObjCForCollectionStmtClass) { +  SubExprs[ELEM] = Elem; +  SubExprs[COLLECTION] = Collect; +  SubExprs[BODY] = Body; +  ForLoc = FCL; +  RParenLoc = RPL; +} + +ObjCAtTryStmt::ObjCAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, +                             Stmt **CatchStmts, unsigned NumCatchStmts, +                             Stmt *atFinallyStmt) +    : Stmt(ObjCAtTryStmtClass), AtTryLoc(atTryLoc), +      NumCatchStmts(NumCatchStmts), HasFinally(atFinallyStmt != nullptr) { +  Stmt **Stmts = getStmts(); +  Stmts[0] = atTryStmt; +  for (unsigned I = 0; I != NumCatchStmts; ++I) +    Stmts[I + 1] = CatchStmts[I]; + +  if (HasFinally) +    Stmts[NumCatchStmts + 1] = atFinallyStmt; +} + +ObjCAtTryStmt *ObjCAtTryStmt::Create(const ASTContext &Context, +                                     SourceLocation atTryLoc, Stmt *atTryStmt, +                                     Stmt **CatchStmts, unsigned NumCatchStmts, +                                     Stmt *atFinallyStmt) { +  unsigned Size = +      sizeof(ObjCAtTryStmt) + +      (1 + NumCatchStmts + (atFinallyStmt != nullptr)) * sizeof(Stmt *); +  void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt)); +  return new (Mem) ObjCAtTryStmt(atTryLoc, atTryStmt, CatchStmts, NumCatchStmts, +                                 atFinallyStmt); +} + +ObjCAtTryStmt *ObjCAtTryStmt::CreateEmpty(const ASTContext &Context, +                                          unsigned NumCatchStmts, +                                          bool HasFinally) { +  unsigned Size = +      sizeof(ObjCAtTryStmt) + (1 + NumCatchStmts + HasFinally) * sizeof(Stmt *); +  void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt)); +  return new (Mem) ObjCAtTryStmt(EmptyShell(), NumCatchStmts, HasFinally); +} + +SourceLocation ObjCAtTryStmt::getEndLoc() const { +  if (HasFinally) +    return getFinallyStmt()->getEndLoc(); +  if (NumCatchStmts) +    return getCatchStmt(NumCatchStmts - 1)->getEndLoc(); +  return getTryBody()->getEndLoc(); +} | 
