1*67e74705SXin Li //===--- ExprObjC.cpp - (ObjC) Expression AST Node Implementation ---------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the subclesses of Expr class declared in ExprObjC.h
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li
14*67e74705SXin Li #include "clang/AST/ExprObjC.h"
15*67e74705SXin Li
16*67e74705SXin Li #include "clang/AST/ASTContext.h"
17*67e74705SXin Li
18*67e74705SXin Li using namespace clang;
19*67e74705SXin Li
ObjCArrayLiteral(ArrayRef<Expr * > Elements,QualType T,ObjCMethodDecl * Method,SourceRange SR)20*67e74705SXin Li ObjCArrayLiteral::ObjCArrayLiteral(ArrayRef<Expr *> Elements, QualType T,
21*67e74705SXin Li ObjCMethodDecl *Method, SourceRange SR)
22*67e74705SXin Li : Expr(ObjCArrayLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
23*67e74705SXin Li false, false),
24*67e74705SXin Li NumElements(Elements.size()), Range(SR), ArrayWithObjectsMethod(Method) {
25*67e74705SXin Li Expr **SaveElements = getElements();
26*67e74705SXin Li for (unsigned I = 0, N = Elements.size(); I != N; ++I) {
27*67e74705SXin Li if (Elements[I]->isTypeDependent() || Elements[I]->isValueDependent())
28*67e74705SXin Li ExprBits.ValueDependent = true;
29*67e74705SXin Li if (Elements[I]->isInstantiationDependent())
30*67e74705SXin Li ExprBits.InstantiationDependent = true;
31*67e74705SXin Li if (Elements[I]->containsUnexpandedParameterPack())
32*67e74705SXin Li ExprBits.ContainsUnexpandedParameterPack = true;
33*67e74705SXin Li
34*67e74705SXin Li SaveElements[I] = Elements[I];
35*67e74705SXin Li }
36*67e74705SXin Li }
37*67e74705SXin Li
Create(const ASTContext & C,ArrayRef<Expr * > Elements,QualType T,ObjCMethodDecl * Method,SourceRange SR)38*67e74705SXin Li ObjCArrayLiteral *ObjCArrayLiteral::Create(const ASTContext &C,
39*67e74705SXin Li ArrayRef<Expr *> Elements,
40*67e74705SXin Li QualType T, ObjCMethodDecl *Method,
41*67e74705SXin Li SourceRange SR) {
42*67e74705SXin Li void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Elements.size()));
43*67e74705SXin Li return new (Mem) ObjCArrayLiteral(Elements, T, Method, SR);
44*67e74705SXin Li }
45*67e74705SXin Li
CreateEmpty(const ASTContext & C,unsigned NumElements)46*67e74705SXin Li ObjCArrayLiteral *ObjCArrayLiteral::CreateEmpty(const ASTContext &C,
47*67e74705SXin Li unsigned NumElements) {
48*67e74705SXin Li
49*67e74705SXin Li void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumElements));
50*67e74705SXin Li return new (Mem) ObjCArrayLiteral(EmptyShell(), NumElements);
51*67e74705SXin Li }
52*67e74705SXin Li
ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK,bool HasPackExpansions,QualType T,ObjCMethodDecl * method,SourceRange SR)53*67e74705SXin Li ObjCDictionaryLiteral::ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK,
54*67e74705SXin Li bool HasPackExpansions, QualType T,
55*67e74705SXin Li ObjCMethodDecl *method,
56*67e74705SXin Li SourceRange SR)
57*67e74705SXin Li : Expr(ObjCDictionaryLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
58*67e74705SXin Li false, false),
59*67e74705SXin Li NumElements(VK.size()), HasPackExpansions(HasPackExpansions), Range(SR),
60*67e74705SXin Li DictWithObjectsMethod(method) {
61*67e74705SXin Li KeyValuePair *KeyValues = getTrailingObjects<KeyValuePair>();
62*67e74705SXin Li ExpansionData *Expansions =
63*67e74705SXin Li HasPackExpansions ? getTrailingObjects<ExpansionData>() : nullptr;
64*67e74705SXin Li for (unsigned I = 0; I < NumElements; I++) {
65*67e74705SXin Li if (VK[I].Key->isTypeDependent() || VK[I].Key->isValueDependent() ||
66*67e74705SXin Li VK[I].Value->isTypeDependent() || VK[I].Value->isValueDependent())
67*67e74705SXin Li ExprBits.ValueDependent = true;
68*67e74705SXin Li if (VK[I].Key->isInstantiationDependent() ||
69*67e74705SXin Li VK[I].Value->isInstantiationDependent())
70*67e74705SXin Li ExprBits.InstantiationDependent = true;
71*67e74705SXin Li if (VK[I].EllipsisLoc.isInvalid() &&
72*67e74705SXin Li (VK[I].Key->containsUnexpandedParameterPack() ||
73*67e74705SXin Li VK[I].Value->containsUnexpandedParameterPack()))
74*67e74705SXin Li ExprBits.ContainsUnexpandedParameterPack = true;
75*67e74705SXin Li
76*67e74705SXin Li KeyValues[I].Key = VK[I].Key;
77*67e74705SXin Li KeyValues[I].Value = VK[I].Value;
78*67e74705SXin Li if (Expansions) {
79*67e74705SXin Li Expansions[I].EllipsisLoc = VK[I].EllipsisLoc;
80*67e74705SXin Li if (VK[I].NumExpansions)
81*67e74705SXin Li Expansions[I].NumExpansionsPlusOne = *VK[I].NumExpansions + 1;
82*67e74705SXin Li else
83*67e74705SXin Li Expansions[I].NumExpansionsPlusOne = 0;
84*67e74705SXin Li }
85*67e74705SXin Li }
86*67e74705SXin Li }
87*67e74705SXin Li
88*67e74705SXin Li ObjCDictionaryLiteral *
Create(const ASTContext & C,ArrayRef<ObjCDictionaryElement> VK,bool HasPackExpansions,QualType T,ObjCMethodDecl * method,SourceRange SR)89*67e74705SXin Li ObjCDictionaryLiteral::Create(const ASTContext &C,
90*67e74705SXin Li ArrayRef<ObjCDictionaryElement> VK,
91*67e74705SXin Li bool HasPackExpansions, QualType T,
92*67e74705SXin Li ObjCMethodDecl *method, SourceRange SR) {
93*67e74705SXin Li void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>(
94*67e74705SXin Li VK.size(), HasPackExpansions ? VK.size() : 0));
95*67e74705SXin Li return new (Mem) ObjCDictionaryLiteral(VK, HasPackExpansions, T, method, SR);
96*67e74705SXin Li }
97*67e74705SXin Li
98*67e74705SXin Li ObjCDictionaryLiteral *
CreateEmpty(const ASTContext & C,unsigned NumElements,bool HasPackExpansions)99*67e74705SXin Li ObjCDictionaryLiteral::CreateEmpty(const ASTContext &C, unsigned NumElements,
100*67e74705SXin Li bool HasPackExpansions) {
101*67e74705SXin Li void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>(
102*67e74705SXin Li NumElements, HasPackExpansions ? NumElements : 0));
103*67e74705SXin Li return new (Mem)
104*67e74705SXin Li ObjCDictionaryLiteral(EmptyShell(), NumElements, HasPackExpansions);
105*67e74705SXin Li }
106*67e74705SXin Li
getReceiverType(const ASTContext & ctx) const107*67e74705SXin Li QualType ObjCPropertyRefExpr::getReceiverType(const ASTContext &ctx) const {
108*67e74705SXin Li if (isClassReceiver())
109*67e74705SXin Li return ctx.getObjCInterfaceType(getClassReceiver());
110*67e74705SXin Li
111*67e74705SXin Li if (isSuperReceiver())
112*67e74705SXin Li return getSuperReceiverType();
113*67e74705SXin Li
114*67e74705SXin Li return getBase()->getType();
115*67e74705SXin Li }
116*67e74705SXin Li
ObjCMessageExpr(QualType T,ExprValueKind VK,SourceLocation LBracLoc,SourceLocation SuperLoc,bool IsInstanceSuper,QualType SuperType,Selector Sel,ArrayRef<SourceLocation> SelLocs,SelectorLocationsKind SelLocsK,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)117*67e74705SXin Li ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
118*67e74705SXin Li SourceLocation LBracLoc,
119*67e74705SXin Li SourceLocation SuperLoc, bool IsInstanceSuper,
120*67e74705SXin Li QualType SuperType, Selector Sel,
121*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
122*67e74705SXin Li SelectorLocationsKind SelLocsK,
123*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
124*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit)
125*67e74705SXin Li : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
126*67e74705SXin Li /*TypeDependent=*/false, /*ValueDependent=*/false,
127*67e74705SXin Li /*InstantiationDependent=*/false,
128*67e74705SXin Li /*ContainsUnexpandedParameterPack=*/false),
129*67e74705SXin Li SelectorOrMethod(
130*67e74705SXin Li reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
131*67e74705SXin Li Kind(IsInstanceSuper ? SuperInstance : SuperClass),
132*67e74705SXin Li HasMethod(Method != nullptr), IsDelegateInitCall(false),
133*67e74705SXin Li IsImplicit(isImplicit), SuperLoc(SuperLoc), LBracLoc(LBracLoc),
134*67e74705SXin Li RBracLoc(RBracLoc) {
135*67e74705SXin Li initArgsAndSelLocs(Args, SelLocs, SelLocsK);
136*67e74705SXin Li setReceiverPointer(SuperType.getAsOpaquePtr());
137*67e74705SXin Li }
138*67e74705SXin Li
ObjCMessageExpr(QualType T,ExprValueKind VK,SourceLocation LBracLoc,TypeSourceInfo * Receiver,Selector Sel,ArrayRef<SourceLocation> SelLocs,SelectorLocationsKind SelLocsK,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)139*67e74705SXin Li ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
140*67e74705SXin Li SourceLocation LBracLoc,
141*67e74705SXin Li TypeSourceInfo *Receiver, Selector Sel,
142*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
143*67e74705SXin Li SelectorLocationsKind SelLocsK,
144*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
145*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit)
146*67e74705SXin Li : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
147*67e74705SXin Li T->isDependentType(), T->isInstantiationDependentType(),
148*67e74705SXin Li T->containsUnexpandedParameterPack()),
149*67e74705SXin Li SelectorOrMethod(
150*67e74705SXin Li reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
151*67e74705SXin Li Kind(Class), HasMethod(Method != nullptr), IsDelegateInitCall(false),
152*67e74705SXin Li IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) {
153*67e74705SXin Li initArgsAndSelLocs(Args, SelLocs, SelLocsK);
154*67e74705SXin Li setReceiverPointer(Receiver);
155*67e74705SXin Li }
156*67e74705SXin Li
ObjCMessageExpr(QualType T,ExprValueKind VK,SourceLocation LBracLoc,Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelLocs,SelectorLocationsKind SelLocsK,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)157*67e74705SXin Li ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK,
158*67e74705SXin Li SourceLocation LBracLoc, Expr *Receiver,
159*67e74705SXin Li Selector Sel, ArrayRef<SourceLocation> SelLocs,
160*67e74705SXin Li SelectorLocationsKind SelLocsK,
161*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
162*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit)
163*67e74705SXin Li : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
164*67e74705SXin Li Receiver->isTypeDependent(), Receiver->isTypeDependent(),
165*67e74705SXin Li Receiver->isInstantiationDependent(),
166*67e74705SXin Li Receiver->containsUnexpandedParameterPack()),
167*67e74705SXin Li SelectorOrMethod(
168*67e74705SXin Li reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())),
169*67e74705SXin Li Kind(Instance), HasMethod(Method != nullptr), IsDelegateInitCall(false),
170*67e74705SXin Li IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) {
171*67e74705SXin Li initArgsAndSelLocs(Args, SelLocs, SelLocsK);
172*67e74705SXin Li setReceiverPointer(Receiver);
173*67e74705SXin Li }
174*67e74705SXin Li
initArgsAndSelLocs(ArrayRef<Expr * > Args,ArrayRef<SourceLocation> SelLocs,SelectorLocationsKind SelLocsK)175*67e74705SXin Li void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args,
176*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
177*67e74705SXin Li SelectorLocationsKind SelLocsK) {
178*67e74705SXin Li setNumArgs(Args.size());
179*67e74705SXin Li Expr **MyArgs = getArgs();
180*67e74705SXin Li for (unsigned I = 0; I != Args.size(); ++I) {
181*67e74705SXin Li if (Args[I]->isTypeDependent())
182*67e74705SXin Li ExprBits.TypeDependent = true;
183*67e74705SXin Li if (Args[I]->isValueDependent())
184*67e74705SXin Li ExprBits.ValueDependent = true;
185*67e74705SXin Li if (Args[I]->isInstantiationDependent())
186*67e74705SXin Li ExprBits.InstantiationDependent = true;
187*67e74705SXin Li if (Args[I]->containsUnexpandedParameterPack())
188*67e74705SXin Li ExprBits.ContainsUnexpandedParameterPack = true;
189*67e74705SXin Li
190*67e74705SXin Li MyArgs[I] = Args[I];
191*67e74705SXin Li }
192*67e74705SXin Li
193*67e74705SXin Li SelLocsKind = SelLocsK;
194*67e74705SXin Li if (!isImplicit()) {
195*67e74705SXin Li if (SelLocsK == SelLoc_NonStandard)
196*67e74705SXin Li std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
197*67e74705SXin Li }
198*67e74705SXin Li }
199*67e74705SXin Li
200*67e74705SXin Li ObjCMessageExpr *
Create(const ASTContext & Context,QualType T,ExprValueKind VK,SourceLocation LBracLoc,SourceLocation SuperLoc,bool IsInstanceSuper,QualType SuperType,Selector Sel,ArrayRef<SourceLocation> SelLocs,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)201*67e74705SXin Li ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
202*67e74705SXin Li SourceLocation LBracLoc, SourceLocation SuperLoc,
203*67e74705SXin Li bool IsInstanceSuper, QualType SuperType, Selector Sel,
204*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
205*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
206*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit) {
207*67e74705SXin Li assert((!SelLocs.empty() || isImplicit) &&
208*67e74705SXin Li "No selector locs for non-implicit message");
209*67e74705SXin Li ObjCMessageExpr *Mem;
210*67e74705SXin Li SelectorLocationsKind SelLocsK = SelectorLocationsKind();
211*67e74705SXin Li if (isImplicit)
212*67e74705SXin Li Mem = alloc(Context, Args.size(), 0);
213*67e74705SXin Li else
214*67e74705SXin Li Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
215*67e74705SXin Li return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
216*67e74705SXin Li SuperType, Sel, SelLocs, SelLocsK, Method,
217*67e74705SXin Li Args, RBracLoc, isImplicit);
218*67e74705SXin Li }
219*67e74705SXin Li
220*67e74705SXin Li ObjCMessageExpr *
Create(const ASTContext & Context,QualType T,ExprValueKind VK,SourceLocation LBracLoc,TypeSourceInfo * Receiver,Selector Sel,ArrayRef<SourceLocation> SelLocs,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)221*67e74705SXin Li ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
222*67e74705SXin Li SourceLocation LBracLoc, TypeSourceInfo *Receiver,
223*67e74705SXin Li Selector Sel, ArrayRef<SourceLocation> SelLocs,
224*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
225*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit) {
226*67e74705SXin Li assert((!SelLocs.empty() || isImplicit) &&
227*67e74705SXin Li "No selector locs for non-implicit message");
228*67e74705SXin Li ObjCMessageExpr *Mem;
229*67e74705SXin Li SelectorLocationsKind SelLocsK = SelectorLocationsKind();
230*67e74705SXin Li if (isImplicit)
231*67e74705SXin Li Mem = alloc(Context, Args.size(), 0);
232*67e74705SXin Li else
233*67e74705SXin Li Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
234*67e74705SXin Li return new (Mem)
235*67e74705SXin Li ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method,
236*67e74705SXin Li Args, RBracLoc, isImplicit);
237*67e74705SXin Li }
238*67e74705SXin Li
239*67e74705SXin Li ObjCMessageExpr *
Create(const ASTContext & Context,QualType T,ExprValueKind VK,SourceLocation LBracLoc,Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelLocs,ObjCMethodDecl * Method,ArrayRef<Expr * > Args,SourceLocation RBracLoc,bool isImplicit)240*67e74705SXin Li ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK,
241*67e74705SXin Li SourceLocation LBracLoc, Expr *Receiver, Selector Sel,
242*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
243*67e74705SXin Li ObjCMethodDecl *Method, ArrayRef<Expr *> Args,
244*67e74705SXin Li SourceLocation RBracLoc, bool isImplicit) {
245*67e74705SXin Li assert((!SelLocs.empty() || isImplicit) &&
246*67e74705SXin Li "No selector locs for non-implicit message");
247*67e74705SXin Li ObjCMessageExpr *Mem;
248*67e74705SXin Li SelectorLocationsKind SelLocsK = SelectorLocationsKind();
249*67e74705SXin Li if (isImplicit)
250*67e74705SXin Li Mem = alloc(Context, Args.size(), 0);
251*67e74705SXin Li else
252*67e74705SXin Li Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
253*67e74705SXin Li return new (Mem)
254*67e74705SXin Li ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method,
255*67e74705SXin Li Args, RBracLoc, isImplicit);
256*67e74705SXin Li }
257*67e74705SXin Li
CreateEmpty(const ASTContext & Context,unsigned NumArgs,unsigned NumStoredSelLocs)258*67e74705SXin Li ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(const ASTContext &Context,
259*67e74705SXin Li unsigned NumArgs,
260*67e74705SXin Li unsigned NumStoredSelLocs) {
261*67e74705SXin Li ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs);
262*67e74705SXin Li return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
263*67e74705SXin Li }
264*67e74705SXin Li
alloc(const ASTContext & C,ArrayRef<Expr * > Args,SourceLocation RBraceLoc,ArrayRef<SourceLocation> SelLocs,Selector Sel,SelectorLocationsKind & SelLocsK)265*67e74705SXin Li ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C,
266*67e74705SXin Li ArrayRef<Expr *> Args,
267*67e74705SXin Li SourceLocation RBraceLoc,
268*67e74705SXin Li ArrayRef<SourceLocation> SelLocs,
269*67e74705SXin Li Selector Sel,
270*67e74705SXin Li SelectorLocationsKind &SelLocsK) {
271*67e74705SXin Li SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc);
272*67e74705SXin Li unsigned NumStoredSelLocs =
273*67e74705SXin Li (SelLocsK == SelLoc_NonStandard) ? SelLocs.size() : 0;
274*67e74705SXin Li return alloc(C, Args.size(), NumStoredSelLocs);
275*67e74705SXin Li }
276*67e74705SXin Li
alloc(const ASTContext & C,unsigned NumArgs,unsigned NumStoredSelLocs)277*67e74705SXin Li ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C, unsigned NumArgs,
278*67e74705SXin Li unsigned NumStoredSelLocs) {
279*67e74705SXin Li return (ObjCMessageExpr *)C.Allocate(
280*67e74705SXin Li totalSizeToAlloc<void *, SourceLocation>(NumArgs + 1, NumStoredSelLocs),
281*67e74705SXin Li llvm::AlignOf<ObjCMessageExpr>::Alignment);
282*67e74705SXin Li }
283*67e74705SXin Li
getSelectorLocs(SmallVectorImpl<SourceLocation> & SelLocs) const284*67e74705SXin Li void ObjCMessageExpr::getSelectorLocs(
285*67e74705SXin Li SmallVectorImpl<SourceLocation> &SelLocs) const {
286*67e74705SXin Li for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i)
287*67e74705SXin Li SelLocs.push_back(getSelectorLoc(i));
288*67e74705SXin Li }
289*67e74705SXin Li
getReceiverRange() const290*67e74705SXin Li SourceRange ObjCMessageExpr::getReceiverRange() const {
291*67e74705SXin Li switch (getReceiverKind()) {
292*67e74705SXin Li case Instance:
293*67e74705SXin Li return getInstanceReceiver()->getSourceRange();
294*67e74705SXin Li
295*67e74705SXin Li case Class:
296*67e74705SXin Li return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
297*67e74705SXin Li
298*67e74705SXin Li case SuperInstance:
299*67e74705SXin Li case SuperClass:
300*67e74705SXin Li return getSuperLoc();
301*67e74705SXin Li }
302*67e74705SXin Li
303*67e74705SXin Li llvm_unreachable("Invalid ReceiverKind!");
304*67e74705SXin Li }
305*67e74705SXin Li
getSelector() const306*67e74705SXin Li Selector ObjCMessageExpr::getSelector() const {
307*67e74705SXin Li if (HasMethod)
308*67e74705SXin Li return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
309*67e74705SXin Li ->getSelector();
310*67e74705SXin Li return Selector(SelectorOrMethod);
311*67e74705SXin Li }
312*67e74705SXin Li
getReceiverType() const313*67e74705SXin Li QualType ObjCMessageExpr::getReceiverType() const {
314*67e74705SXin Li switch (getReceiverKind()) {
315*67e74705SXin Li case Instance:
316*67e74705SXin Li return getInstanceReceiver()->getType();
317*67e74705SXin Li case Class:
318*67e74705SXin Li return getClassReceiver();
319*67e74705SXin Li case SuperInstance:
320*67e74705SXin Li case SuperClass:
321*67e74705SXin Li return getSuperType();
322*67e74705SXin Li }
323*67e74705SXin Li
324*67e74705SXin Li llvm_unreachable("unexpected receiver kind");
325*67e74705SXin Li }
326*67e74705SXin Li
getReceiverInterface() const327*67e74705SXin Li ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
328*67e74705SXin Li QualType T = getReceiverType();
329*67e74705SXin Li
330*67e74705SXin Li if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>())
331*67e74705SXin Li return Ptr->getInterfaceDecl();
332*67e74705SXin Li
333*67e74705SXin Li if (const ObjCObjectType *Ty = T->getAs<ObjCObjectType>())
334*67e74705SXin Li return Ty->getInterface();
335*67e74705SXin Li
336*67e74705SXin Li return nullptr;
337*67e74705SXin Li }
338*67e74705SXin Li
children()339*67e74705SXin Li Stmt::child_range ObjCMessageExpr::children() {
340*67e74705SXin Li Stmt **begin;
341*67e74705SXin Li if (getReceiverKind() == Instance)
342*67e74705SXin Li begin = reinterpret_cast<Stmt **>(getTrailingObjects<void *>());
343*67e74705SXin Li else
344*67e74705SXin Li begin = reinterpret_cast<Stmt **>(getArgs());
345*67e74705SXin Li return child_range(begin,
346*67e74705SXin Li reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
347*67e74705SXin Li }
348*67e74705SXin Li
getBridgeKindName() const349*67e74705SXin Li StringRef ObjCBridgedCastExpr::getBridgeKindName() const {
350*67e74705SXin Li switch (getBridgeKind()) {
351*67e74705SXin Li case OBC_Bridge:
352*67e74705SXin Li return "__bridge";
353*67e74705SXin Li case OBC_BridgeTransfer:
354*67e74705SXin Li return "__bridge_transfer";
355*67e74705SXin Li case OBC_BridgeRetained:
356*67e74705SXin Li return "__bridge_retained";
357*67e74705SXin Li }
358*67e74705SXin Li
359*67e74705SXin Li llvm_unreachable("Invalid BridgeKind!");
360*67e74705SXin Li }
361