annotate clang/lib/AST/ExprObjC.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 5f17cb93ff66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- ExprObjC.cpp - (ObjC) Expression AST Node Implementation -----------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements the subclesses of Expr class declared in ExprObjC.h
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "clang/AST/ExprObjC.h"
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTContext.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 #include "clang/AST/ComputeDependence.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 #include "clang/AST/DependenceFlags.h"
150
anatofuz
parents:
diff changeset
17 #include "clang/AST/SelectorLocationsKind.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/Type.h"
anatofuz
parents:
diff changeset
19 #include "clang/AST/TypeLoc.h"
anatofuz
parents:
diff changeset
20 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
21 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
22 #include <algorithm>
anatofuz
parents:
diff changeset
23 #include <cassert>
anatofuz
parents:
diff changeset
24 #include <cstdint>
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 using namespace clang;
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 ObjCArrayLiteral::ObjCArrayLiteral(ArrayRef<Expr *> Elements, QualType T,
anatofuz
parents:
diff changeset
29 ObjCMethodDecl *Method, SourceRange SR)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 : Expr(ObjCArrayLiteralClass, T, VK_RValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
31 NumElements(Elements.size()), Range(SR), ArrayWithObjectsMethod(Method) {
anatofuz
parents:
diff changeset
32 Expr **SaveElements = getElements();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 for (unsigned I = 0, N = Elements.size(); I != N; ++I)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 SaveElements[I] = Elements[I];
150
anatofuz
parents:
diff changeset
35
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
37 }
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 ObjCArrayLiteral *ObjCArrayLiteral::Create(const ASTContext &C,
anatofuz
parents:
diff changeset
40 ArrayRef<Expr *> Elements,
anatofuz
parents:
diff changeset
41 QualType T, ObjCMethodDecl *Method,
anatofuz
parents:
diff changeset
42 SourceRange SR) {
anatofuz
parents:
diff changeset
43 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Elements.size()));
anatofuz
parents:
diff changeset
44 return new (Mem) ObjCArrayLiteral(Elements, T, Method, SR);
anatofuz
parents:
diff changeset
45 }
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 ObjCArrayLiteral *ObjCArrayLiteral::CreateEmpty(const ASTContext &C,
anatofuz
parents:
diff changeset
48 unsigned NumElements) {
anatofuz
parents:
diff changeset
49 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumElements));
anatofuz
parents:
diff changeset
50 return new (Mem) ObjCArrayLiteral(EmptyShell(), NumElements);
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 ObjCDictionaryLiteral::ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK,
anatofuz
parents:
diff changeset
54 bool HasPackExpansions, QualType T,
anatofuz
parents:
diff changeset
55 ObjCMethodDecl *method,
anatofuz
parents:
diff changeset
56 SourceRange SR)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
57 : Expr(ObjCDictionaryLiteralClass, T, VK_RValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
58 NumElements(VK.size()), HasPackExpansions(HasPackExpansions), Range(SR),
anatofuz
parents:
diff changeset
59 DictWithObjectsMethod(method) {
anatofuz
parents:
diff changeset
60 KeyValuePair *KeyValues = getTrailingObjects<KeyValuePair>();
anatofuz
parents:
diff changeset
61 ExpansionData *Expansions =
anatofuz
parents:
diff changeset
62 HasPackExpansions ? getTrailingObjects<ExpansionData>() : nullptr;
anatofuz
parents:
diff changeset
63 for (unsigned I = 0; I < NumElements; I++) {
anatofuz
parents:
diff changeset
64 KeyValues[I].Key = VK[I].Key;
anatofuz
parents:
diff changeset
65 KeyValues[I].Value = VK[I].Value;
anatofuz
parents:
diff changeset
66 if (Expansions) {
anatofuz
parents:
diff changeset
67 Expansions[I].EllipsisLoc = VK[I].EllipsisLoc;
anatofuz
parents:
diff changeset
68 if (VK[I].NumExpansions)
anatofuz
parents:
diff changeset
69 Expansions[I].NumExpansionsPlusOne = *VK[I].NumExpansions + 1;
anatofuz
parents:
diff changeset
70 else
anatofuz
parents:
diff changeset
71 Expansions[I].NumExpansionsPlusOne = 0;
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
74 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 ObjCDictionaryLiteral *
anatofuz
parents:
diff changeset
78 ObjCDictionaryLiteral::Create(const ASTContext &C,
anatofuz
parents:
diff changeset
79 ArrayRef<ObjCDictionaryElement> VK,
anatofuz
parents:
diff changeset
80 bool HasPackExpansions, QualType T,
anatofuz
parents:
diff changeset
81 ObjCMethodDecl *method, SourceRange SR) {
anatofuz
parents:
diff changeset
82 void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>(
anatofuz
parents:
diff changeset
83 VK.size(), HasPackExpansions ? VK.size() : 0));
anatofuz
parents:
diff changeset
84 return new (Mem) ObjCDictionaryLiteral(VK, HasPackExpansions, T, method, SR);
anatofuz
parents:
diff changeset
85 }
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 ObjCDictionaryLiteral *
anatofuz
parents:
diff changeset
88 ObjCDictionaryLiteral::CreateEmpty(const ASTContext &C, unsigned NumElements,
anatofuz
parents:
diff changeset
89 bool HasPackExpansions) {
anatofuz
parents:
diff changeset
90 void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>(
anatofuz
parents:
diff changeset
91 NumElements, HasPackExpansions ? NumElements : 0));
anatofuz
parents:
diff changeset
92 return new (Mem)
anatofuz
parents:
diff changeset
93 ObjCDictionaryLiteral(EmptyShell(), NumElements, HasPackExpansions);
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 QualType ObjCPropertyRefExpr::getReceiverType(const ASTContext &ctx) const {
anatofuz
parents:
diff changeset
97 if (isClassReceiver())
anatofuz
parents:
diff changeset
98 return ctx.getObjCInterfaceType(getClassReceiver());
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 if (isSuperReceiver())
anatofuz
parents:
diff changeset
101 return getSuperReceiverType();
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 return getBase()->getType();
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
107 SourceLocation LBracLoc,
anatofuz
parents:
diff changeset
108 SourceLocation SuperLoc, bool IsInstanceSuper,
anatofuz
parents:
diff changeset
109 QualType SuperType, Selector Sel,
anatofuz
parents:
diff changeset
110 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
111 SelectorLocationsKind SelLocsK,
anatofuz
parents:
diff changeset
112 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
113 SourceLocation RBracLoc, bool isImplicit)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
114 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary),
150
anatofuz
parents:
diff changeset
115 SelectorOrMethod(
anatofuz
parents:
diff changeset
116 reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
anatofuz
parents:
diff changeset
117 Kind(IsInstanceSuper ? SuperInstance : SuperClass),
anatofuz
parents:
diff changeset
118 HasMethod(Method != nullptr), IsDelegateInitCall(false),
anatofuz
parents:
diff changeset
119 IsImplicit(isImplicit), SuperLoc(SuperLoc), LBracLoc(LBracLoc),
anatofuz
parents:
diff changeset
120 RBracLoc(RBracLoc) {
anatofuz
parents:
diff changeset
121 initArgsAndSelLocs(Args, SelLocs, SelLocsK);
anatofuz
parents:
diff changeset
122 setReceiverPointer(SuperType.getAsOpaquePtr());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
123 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
127 SourceLocation LBracLoc,
anatofuz
parents:
diff changeset
128 TypeSourceInfo *Receiver, Selector Sel,
anatofuz
parents:
diff changeset
129 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
130 SelectorLocationsKind SelLocsK,
anatofuz
parents:
diff changeset
131 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
132 SourceLocation RBracLoc, bool isImplicit)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary),
150
anatofuz
parents:
diff changeset
134 SelectorOrMethod(
anatofuz
parents:
diff changeset
135 reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
anatofuz
parents:
diff changeset
136 Kind(Class), HasMethod(Method != nullptr), IsDelegateInitCall(false),
anatofuz
parents:
diff changeset
137 IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) {
anatofuz
parents:
diff changeset
138 initArgsAndSelLocs(Args, SelLocs, SelLocsK);
anatofuz
parents:
diff changeset
139 setReceiverPointer(Receiver);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
144 SourceLocation LBracLoc, Expr *Receiver,
anatofuz
parents:
diff changeset
145 Selector Sel, ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
146 SelectorLocationsKind SelLocsK,
anatofuz
parents:
diff changeset
147 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
148 SourceLocation RBracLoc, bool isImplicit)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
149 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary),
150
anatofuz
parents:
diff changeset
150 SelectorOrMethod(
anatofuz
parents:
diff changeset
151 reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
anatofuz
parents:
diff changeset
152 Kind(Instance), HasMethod(Method != nullptr), IsDelegateInitCall(false),
anatofuz
parents:
diff changeset
153 IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) {
anatofuz
parents:
diff changeset
154 initArgsAndSelLocs(Args, SelLocs, SelLocsK);
anatofuz
parents:
diff changeset
155 setReceiverPointer(Receiver);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
156 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
160 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
161 SelectorLocationsKind SelLocsK) {
anatofuz
parents:
diff changeset
162 setNumArgs(Args.size());
anatofuz
parents:
diff changeset
163 Expr **MyArgs = getArgs();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
164 for (unsigned I = 0; I != Args.size(); ++I)
150
anatofuz
parents:
diff changeset
165 MyArgs[I] = Args[I];
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 SelLocsKind = SelLocsK;
anatofuz
parents:
diff changeset
168 if (!isImplicit()) {
anatofuz
parents:
diff changeset
169 if (SelLocsK == SelLoc_NonStandard)
anatofuz
parents:
diff changeset
170 std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
anatofuz
parents:
diff changeset
171 }
anatofuz
parents:
diff changeset
172 }
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 ObjCMessageExpr *
anatofuz
parents:
diff changeset
175 ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
176 SourceLocation LBracLoc, SourceLocation SuperLoc,
anatofuz
parents:
diff changeset
177 bool IsInstanceSuper, QualType SuperType, Selector Sel,
anatofuz
parents:
diff changeset
178 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
179 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
180 SourceLocation RBracLoc, bool isImplicit) {
anatofuz
parents:
diff changeset
181 assert((!SelLocs.empty() || isImplicit) &&
anatofuz
parents:
diff changeset
182 "No selector locs for non-implicit message");
anatofuz
parents:
diff changeset
183 ObjCMessageExpr *Mem;
anatofuz
parents:
diff changeset
184 SelectorLocationsKind SelLocsK = SelectorLocationsKind();
anatofuz
parents:
diff changeset
185 if (isImplicit)
anatofuz
parents:
diff changeset
186 Mem = alloc(Context, Args.size(), 0);
anatofuz
parents:
diff changeset
187 else
anatofuz
parents:
diff changeset
188 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
anatofuz
parents:
diff changeset
189 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
anatofuz
parents:
diff changeset
190 SuperType, Sel, SelLocs, SelLocsK, Method,
anatofuz
parents:
diff changeset
191 Args, RBracLoc, isImplicit);
anatofuz
parents:
diff changeset
192 }
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 ObjCMessageExpr *
anatofuz
parents:
diff changeset
195 ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
196 SourceLocation LBracLoc, TypeSourceInfo *Receiver,
anatofuz
parents:
diff changeset
197 Selector Sel, ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
198 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
199 SourceLocation RBracLoc, bool isImplicit) {
anatofuz
parents:
diff changeset
200 assert((!SelLocs.empty() || isImplicit) &&
anatofuz
parents:
diff changeset
201 "No selector locs for non-implicit message");
anatofuz
parents:
diff changeset
202 ObjCMessageExpr *Mem;
anatofuz
parents:
diff changeset
203 SelectorLocationsKind SelLocsK = SelectorLocationsKind();
anatofuz
parents:
diff changeset
204 if (isImplicit)
anatofuz
parents:
diff changeset
205 Mem = alloc(Context, Args.size(), 0);
anatofuz
parents:
diff changeset
206 else
anatofuz
parents:
diff changeset
207 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
anatofuz
parents:
diff changeset
208 return new (Mem)
anatofuz
parents:
diff changeset
209 ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method,
anatofuz
parents:
diff changeset
210 Args, RBracLoc, isImplicit);
anatofuz
parents:
diff changeset
211 }
anatofuz
parents:
diff changeset
212
anatofuz
parents:
diff changeset
213 ObjCMessageExpr *
anatofuz
parents:
diff changeset
214 ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
215 SourceLocation LBracLoc, Expr *Receiver, Selector Sel,
anatofuz
parents:
diff changeset
216 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
217 ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
218 SourceLocation RBracLoc, bool isImplicit) {
anatofuz
parents:
diff changeset
219 assert((!SelLocs.empty() || isImplicit) &&
anatofuz
parents:
diff changeset
220 "No selector locs for non-implicit message");
anatofuz
parents:
diff changeset
221 ObjCMessageExpr *Mem;
anatofuz
parents:
diff changeset
222 SelectorLocationsKind SelLocsK = SelectorLocationsKind();
anatofuz
parents:
diff changeset
223 if (isImplicit)
anatofuz
parents:
diff changeset
224 Mem = alloc(Context, Args.size(), 0);
anatofuz
parents:
diff changeset
225 else
anatofuz
parents:
diff changeset
226 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
anatofuz
parents:
diff changeset
227 return new (Mem)
anatofuz
parents:
diff changeset
228 ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method,
anatofuz
parents:
diff changeset
229 Args, RBracLoc, isImplicit);
anatofuz
parents:
diff changeset
230 }
anatofuz
parents:
diff changeset
231
anatofuz
parents:
diff changeset
232 ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(const ASTContext &Context,
anatofuz
parents:
diff changeset
233 unsigned NumArgs,
anatofuz
parents:
diff changeset
234 unsigned NumStoredSelLocs) {
anatofuz
parents:
diff changeset
235 ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs);
anatofuz
parents:
diff changeset
236 return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
anatofuz
parents:
diff changeset
237 }
anatofuz
parents:
diff changeset
238
anatofuz
parents:
diff changeset
239 ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C,
anatofuz
parents:
diff changeset
240 ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
241 SourceLocation RBraceLoc,
anatofuz
parents:
diff changeset
242 ArrayRef<SourceLocation> SelLocs,
anatofuz
parents:
diff changeset
243 Selector Sel,
anatofuz
parents:
diff changeset
244 SelectorLocationsKind &SelLocsK) {
anatofuz
parents:
diff changeset
245 SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc);
anatofuz
parents:
diff changeset
246 unsigned NumStoredSelLocs =
anatofuz
parents:
diff changeset
247 (SelLocsK == SelLoc_NonStandard) ? SelLocs.size() : 0;
anatofuz
parents:
diff changeset
248 return alloc(C, Args.size(), NumStoredSelLocs);
anatofuz
parents:
diff changeset
249 }
anatofuz
parents:
diff changeset
250
anatofuz
parents:
diff changeset
251 ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C, unsigned NumArgs,
anatofuz
parents:
diff changeset
252 unsigned NumStoredSelLocs) {
anatofuz
parents:
diff changeset
253 return (ObjCMessageExpr *)C.Allocate(
anatofuz
parents:
diff changeset
254 totalSizeToAlloc<void *, SourceLocation>(NumArgs + 1, NumStoredSelLocs),
anatofuz
parents:
diff changeset
255 alignof(ObjCMessageExpr));
anatofuz
parents:
diff changeset
256 }
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 void ObjCMessageExpr::getSelectorLocs(
anatofuz
parents:
diff changeset
259 SmallVectorImpl<SourceLocation> &SelLocs) const {
anatofuz
parents:
diff changeset
260 for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i)
anatofuz
parents:
diff changeset
261 SelLocs.push_back(getSelectorLoc(i));
anatofuz
parents:
diff changeset
262 }
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 QualType ObjCMessageExpr::getCallReturnType(ASTContext &Ctx) const {
anatofuz
parents:
diff changeset
266 if (const ObjCMethodDecl *MD = getMethodDecl()) {
anatofuz
parents:
diff changeset
267 QualType QT = MD->getReturnType();
anatofuz
parents:
diff changeset
268 if (QT == Ctx.getObjCInstanceType()) {
anatofuz
parents:
diff changeset
269 // instancetype corresponds to expression types.
anatofuz
parents:
diff changeset
270 return getType();
anatofuz
parents:
diff changeset
271 }
anatofuz
parents:
diff changeset
272 return QT;
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 // Expression type might be different from an expected call return type,
anatofuz
parents:
diff changeset
276 // as expression type would never be a reference even if call returns a
anatofuz
parents:
diff changeset
277 // reference. Reconstruct the original expression type.
anatofuz
parents:
diff changeset
278 QualType QT = getType();
anatofuz
parents:
diff changeset
279 switch (getValueKind()) {
anatofuz
parents:
diff changeset
280 case VK_LValue:
anatofuz
parents:
diff changeset
281 return Ctx.getLValueReferenceType(QT);
anatofuz
parents:
diff changeset
282 case VK_XValue:
anatofuz
parents:
diff changeset
283 return Ctx.getRValueReferenceType(QT);
anatofuz
parents:
diff changeset
284 case VK_RValue:
anatofuz
parents:
diff changeset
285 return QT;
anatofuz
parents:
diff changeset
286 }
anatofuz
parents:
diff changeset
287 llvm_unreachable("Unsupported ExprValueKind");
anatofuz
parents:
diff changeset
288 }
anatofuz
parents:
diff changeset
289
anatofuz
parents:
diff changeset
290 SourceRange ObjCMessageExpr::getReceiverRange() const {
anatofuz
parents:
diff changeset
291 switch (getReceiverKind()) {
anatofuz
parents:
diff changeset
292 case Instance:
anatofuz
parents:
diff changeset
293 return getInstanceReceiver()->getSourceRange();
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 case Class:
anatofuz
parents:
diff changeset
296 return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 case SuperInstance:
anatofuz
parents:
diff changeset
299 case SuperClass:
anatofuz
parents:
diff changeset
300 return getSuperLoc();
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 llvm_unreachable("Invalid ReceiverKind!");
anatofuz
parents:
diff changeset
304 }
anatofuz
parents:
diff changeset
305
anatofuz
parents:
diff changeset
306 Selector ObjCMessageExpr::getSelector() const {
anatofuz
parents:
diff changeset
307 if (HasMethod)
anatofuz
parents:
diff changeset
308 return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
anatofuz
parents:
diff changeset
309 ->getSelector();
anatofuz
parents:
diff changeset
310 return Selector(SelectorOrMethod);
anatofuz
parents:
diff changeset
311 }
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 QualType ObjCMessageExpr::getReceiverType() const {
anatofuz
parents:
diff changeset
314 switch (getReceiverKind()) {
anatofuz
parents:
diff changeset
315 case Instance:
anatofuz
parents:
diff changeset
316 return getInstanceReceiver()->getType();
anatofuz
parents:
diff changeset
317 case Class:
anatofuz
parents:
diff changeset
318 return getClassReceiver();
anatofuz
parents:
diff changeset
319 case SuperInstance:
anatofuz
parents:
diff changeset
320 case SuperClass:
anatofuz
parents:
diff changeset
321 return getSuperType();
anatofuz
parents:
diff changeset
322 }
anatofuz
parents:
diff changeset
323
anatofuz
parents:
diff changeset
324 llvm_unreachable("unexpected receiver kind");
anatofuz
parents:
diff changeset
325 }
anatofuz
parents:
diff changeset
326
anatofuz
parents:
diff changeset
327 ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
anatofuz
parents:
diff changeset
328 QualType T = getReceiverType();
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
anatofuz
parents:
diff changeset
331 return Ptr->getInterfaceDecl();
anatofuz
parents:
diff changeset
332
anatofuz
parents:
diff changeset
333 if (const ObjCObjectType *Ty = T->getAs<ObjCObjectType>())
anatofuz
parents:
diff changeset
334 return Ty->getInterface();
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 return nullptr;
anatofuz
parents:
diff changeset
337 }
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 Stmt::child_range ObjCMessageExpr::children() {
anatofuz
parents:
diff changeset
340 Stmt **begin;
anatofuz
parents:
diff changeset
341 if (getReceiverKind() == Instance)
anatofuz
parents:
diff changeset
342 begin = reinterpret_cast<Stmt **>(getTrailingObjects<void *>());
anatofuz
parents:
diff changeset
343 else
anatofuz
parents:
diff changeset
344 begin = reinterpret_cast<Stmt **>(getArgs());
anatofuz
parents:
diff changeset
345 return child_range(begin,
anatofuz
parents:
diff changeset
346 reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
anatofuz
parents:
diff changeset
347 }
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 Stmt::const_child_range ObjCMessageExpr::children() const {
anatofuz
parents:
diff changeset
350 auto Children = const_cast<ObjCMessageExpr *>(this)->children();
anatofuz
parents:
diff changeset
351 return const_child_range(Children.begin(), Children.end());
anatofuz
parents:
diff changeset
352 }
anatofuz
parents:
diff changeset
353
anatofuz
parents:
diff changeset
354 StringRef ObjCBridgedCastExpr::getBridgeKindName() const {
anatofuz
parents:
diff changeset
355 switch (getBridgeKind()) {
anatofuz
parents:
diff changeset
356 case OBC_Bridge:
anatofuz
parents:
diff changeset
357 return "__bridge";
anatofuz
parents:
diff changeset
358 case OBC_BridgeTransfer:
anatofuz
parents:
diff changeset
359 return "__bridge_transfer";
anatofuz
parents:
diff changeset
360 case OBC_BridgeRetained:
anatofuz
parents:
diff changeset
361 return "__bridge_retained";
anatofuz
parents:
diff changeset
362 }
anatofuz
parents:
diff changeset
363
anatofuz
parents:
diff changeset
364 llvm_unreachable("Invalid BridgeKind!");
anatofuz
parents:
diff changeset
365 }