/src/llvm-project/clang/lib/AST/StmtObjC.cpp
Line | Count | Source (jump to first uncovered line) |
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-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | // |
9 | | // This file implements the subclesses of Stmt class declared in StmtObjC.h |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "clang/AST/StmtObjC.h" |
14 | | |
15 | | #include "clang/AST/Expr.h" |
16 | | #include "clang/AST/ASTContext.h" |
17 | | |
18 | | using namespace clang; |
19 | | |
20 | | ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect, |
21 | | Stmt *Body, SourceLocation FCL, |
22 | | SourceLocation RPL) |
23 | 0 | : Stmt(ObjCForCollectionStmtClass) { |
24 | 0 | SubExprs[ELEM] = Elem; |
25 | 0 | SubExprs[COLLECTION] = Collect; |
26 | 0 | SubExprs[BODY] = Body; |
27 | 0 | ForLoc = FCL; |
28 | 0 | RParenLoc = RPL; |
29 | 0 | } |
30 | | |
31 | | ObjCAtTryStmt::ObjCAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, |
32 | | Stmt **CatchStmts, unsigned NumCatchStmts, |
33 | | Stmt *atFinallyStmt) |
34 | | : Stmt(ObjCAtTryStmtClass), AtTryLoc(atTryLoc), |
35 | 0 | NumCatchStmts(NumCatchStmts), HasFinally(atFinallyStmt != nullptr) { |
36 | 0 | Stmt **Stmts = getStmts(); |
37 | 0 | Stmts[0] = atTryStmt; |
38 | 0 | for (unsigned I = 0; I != NumCatchStmts; ++I) |
39 | 0 | Stmts[I + 1] = CatchStmts[I]; |
40 | |
|
41 | 0 | if (HasFinally) |
42 | 0 | Stmts[NumCatchStmts + 1] = atFinallyStmt; |
43 | 0 | } |
44 | | |
45 | | ObjCAtTryStmt *ObjCAtTryStmt::Create(const ASTContext &Context, |
46 | | SourceLocation atTryLoc, Stmt *atTryStmt, |
47 | | Stmt **CatchStmts, unsigned NumCatchStmts, |
48 | 0 | Stmt *atFinallyStmt) { |
49 | 0 | size_t Size = |
50 | 0 | totalSizeToAlloc<Stmt *>(1 + NumCatchStmts + (atFinallyStmt != nullptr)); |
51 | 0 | void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt)); |
52 | 0 | return new (Mem) ObjCAtTryStmt(atTryLoc, atTryStmt, CatchStmts, NumCatchStmts, |
53 | 0 | atFinallyStmt); |
54 | 0 | } |
55 | | |
56 | | ObjCAtTryStmt *ObjCAtTryStmt::CreateEmpty(const ASTContext &Context, |
57 | | unsigned NumCatchStmts, |
58 | 0 | bool HasFinally) { |
59 | 0 | size_t Size = totalSizeToAlloc<Stmt *>(1 + NumCatchStmts + HasFinally); |
60 | 0 | void *Mem = Context.Allocate(Size, alignof(ObjCAtTryStmt)); |
61 | 0 | return new (Mem) ObjCAtTryStmt(EmptyShell(), NumCatchStmts, HasFinally); |
62 | 0 | } |
63 | | |
64 | 0 | SourceLocation ObjCAtTryStmt::getEndLoc() const { |
65 | 0 | if (HasFinally) |
66 | 0 | return getFinallyStmt()->getEndLoc(); |
67 | 0 | if (NumCatchStmts) |
68 | 0 | return getCatchStmt(NumCatchStmts - 1)->getEndLoc(); |
69 | 0 | return getTryBody()->getEndLoc(); |
70 | 0 | } |