]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / include / clang / AST / ExprObjC.h
1 //===--- ExprObjC.h - Classes for representing ObjC expressions -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file defines the ExprObjC interface and subclasses.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_AST_EXPROBJC_H
15 #define LLVM_CLANG_AST_EXPROBJC_H
16
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/Basic/IdentifierTable.h"
20
21 namespace clang {
22   class IdentifierInfo;
23   class ASTContext;
24
25 /// ObjCStringLiteral, used for Objective-C string literals
26 /// i.e. @"foo".
27 class ObjCStringLiteral : public Expr {
28   Stmt *String;
29   SourceLocation AtLoc;
30 public:
31   ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L)
32     : Expr(ObjCStringLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
33            false, false),
34       String(SL), AtLoc(L) {}
35   explicit ObjCStringLiteral(EmptyShell Empty)
36     : Expr(ObjCStringLiteralClass, Empty) {}
37
38   StringLiteral *getString() { return cast<StringLiteral>(String); }
39   const StringLiteral *getString() const { return cast<StringLiteral>(String); }
40   void setString(StringLiteral *S) { String = S; }
41
42   SourceLocation getAtLoc() const { return AtLoc; }
43   void setAtLoc(SourceLocation L) { AtLoc = L; }
44
45   SourceRange getSourceRange() const {
46     return SourceRange(AtLoc, String->getLocEnd());
47   }
48
49   static bool classof(const Stmt *T) {
50     return T->getStmtClass() == ObjCStringLiteralClass;
51   }
52   static bool classof(const ObjCStringLiteral *) { return true; }
53
54   // Iterators
55   child_range children() { return child_range(&String, &String+1); }
56 };
57
58 /// ObjCEncodeExpr, used for @encode in Objective-C.  @encode has the same type
59 /// and behavior as StringLiteral except that the string initializer is obtained
60 /// from ASTContext with the encoding type as an argument.
61 class ObjCEncodeExpr : public Expr {
62   TypeSourceInfo *EncodedType;
63   SourceLocation AtLoc, RParenLoc;
64 public:
65   ObjCEncodeExpr(QualType T, TypeSourceInfo *EncodedType,
66                  SourceLocation at, SourceLocation rp)
67     : Expr(ObjCEncodeExprClass, T, VK_LValue, OK_Ordinary,
68            EncodedType->getType()->isDependentType(),
69            EncodedType->getType()->isDependentType(),
70            EncodedType->getType()->isInstantiationDependentType(),
71            EncodedType->getType()->containsUnexpandedParameterPack()), 
72       EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {}
73
74   explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){}
75
76
77   SourceLocation getAtLoc() const { return AtLoc; }
78   void setAtLoc(SourceLocation L) { AtLoc = L; }
79   SourceLocation getRParenLoc() const { return RParenLoc; }
80   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
81
82   QualType getEncodedType() const { return EncodedType->getType(); }
83
84   TypeSourceInfo *getEncodedTypeSourceInfo() const { return EncodedType; }
85   void setEncodedTypeSourceInfo(TypeSourceInfo *EncType) { 
86     EncodedType = EncType; 
87   }
88
89   SourceRange getSourceRange() const {
90     return SourceRange(AtLoc, RParenLoc);
91   }
92
93   static bool classof(const Stmt *T) {
94     return T->getStmtClass() == ObjCEncodeExprClass;
95   }
96   static bool classof(const ObjCEncodeExpr *) { return true; }
97
98   // Iterators
99   child_range children() { return child_range(); }
100 };
101
102 /// ObjCSelectorExpr used for @selector in Objective-C.
103 class ObjCSelectorExpr : public Expr {
104   Selector SelName;
105   SourceLocation AtLoc, RParenLoc;
106 public:
107   ObjCSelectorExpr(QualType T, Selector selInfo,
108                    SourceLocation at, SourceLocation rp)
109     : Expr(ObjCSelectorExprClass, T, VK_RValue, OK_Ordinary, false, false, 
110            false, false),
111     SelName(selInfo), AtLoc(at), RParenLoc(rp){}
112   explicit ObjCSelectorExpr(EmptyShell Empty)
113    : Expr(ObjCSelectorExprClass, Empty) {}
114
115   Selector getSelector() const { return SelName; }
116   void setSelector(Selector S) { SelName = S; }
117
118   SourceLocation getAtLoc() const { return AtLoc; }
119   SourceLocation getRParenLoc() const { return RParenLoc; }
120   void setAtLoc(SourceLocation L) { AtLoc = L; }
121   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
122
123   SourceRange getSourceRange() const {
124     return SourceRange(AtLoc, RParenLoc);
125   }
126
127   /// getNumArgs - Return the number of actual arguments to this call.
128   unsigned getNumArgs() const { return SelName.getNumArgs(); }
129
130   static bool classof(const Stmt *T) {
131     return T->getStmtClass() == ObjCSelectorExprClass;
132   }
133   static bool classof(const ObjCSelectorExpr *) { return true; }
134
135   // Iterators
136   child_range children() { return child_range(); }
137 };
138
139 /// ObjCProtocolExpr used for protocol expression in Objective-C.  This is used
140 /// as: @protocol(foo), as in:
141 ///   obj conformsToProtocol:@protocol(foo)]
142 /// The return type is "Protocol*".
143 class ObjCProtocolExpr : public Expr {
144   ObjCProtocolDecl *TheProtocol;
145   SourceLocation AtLoc, RParenLoc;
146 public:
147   ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol,
148                    SourceLocation at, SourceLocation rp)
149     : Expr(ObjCProtocolExprClass, T, VK_RValue, OK_Ordinary, false, false,
150            false, false),
151       TheProtocol(protocol), AtLoc(at), RParenLoc(rp) {}
152   explicit ObjCProtocolExpr(EmptyShell Empty)
153     : Expr(ObjCProtocolExprClass, Empty) {}
154
155   ObjCProtocolDecl *getProtocol() const { return TheProtocol; }
156   void setProtocol(ObjCProtocolDecl *P) { TheProtocol = P; }
157
158   SourceLocation getAtLoc() const { return AtLoc; }
159   SourceLocation getRParenLoc() const { return RParenLoc; }
160   void setAtLoc(SourceLocation L) { AtLoc = L; }
161   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
162
163   SourceRange getSourceRange() const {
164     return SourceRange(AtLoc, RParenLoc);
165   }
166
167   static bool classof(const Stmt *T) {
168     return T->getStmtClass() == ObjCProtocolExprClass;
169   }
170   static bool classof(const ObjCProtocolExpr *) { return true; }
171
172   // Iterators
173   child_range children() { return child_range(); }
174 };
175
176 /// ObjCIvarRefExpr - A reference to an ObjC instance variable.
177 class ObjCIvarRefExpr : public Expr {
178   class ObjCIvarDecl *D;
179   SourceLocation Loc;
180   Stmt *Base;
181   bool IsArrow:1;      // True if this is "X->F", false if this is "X.F".
182   bool IsFreeIvar:1;   // True if ivar reference has no base (self assumed).
183
184 public:
185   ObjCIvarRefExpr(ObjCIvarDecl *d, QualType t,
186                   SourceLocation l, Expr *base,
187                   bool arrow = false, bool freeIvar = false) :
188     Expr(ObjCIvarRefExprClass, t, VK_LValue, OK_Ordinary,
189          /*TypeDependent=*/false, base->isValueDependent(), 
190          base->isInstantiationDependent(),
191          base->containsUnexpandedParameterPack()), 
192     D(d), Loc(l), Base(base), IsArrow(arrow), IsFreeIvar(freeIvar) {}
193
194   explicit ObjCIvarRefExpr(EmptyShell Empty)
195     : Expr(ObjCIvarRefExprClass, Empty) {}
196
197   ObjCIvarDecl *getDecl() { return D; }
198   const ObjCIvarDecl *getDecl() const { return D; }
199   void setDecl(ObjCIvarDecl *d) { D = d; }
200
201   const Expr *getBase() const { return cast<Expr>(Base); }
202   Expr *getBase() { return cast<Expr>(Base); }
203   void setBase(Expr * base) { Base = base; }
204
205   bool isArrow() const { return IsArrow; }
206   bool isFreeIvar() const { return IsFreeIvar; }
207   void setIsArrow(bool A) { IsArrow = A; }
208   void setIsFreeIvar(bool A) { IsFreeIvar = A; }
209
210   SourceLocation getLocation() const { return Loc; }
211   void setLocation(SourceLocation L) { Loc = L; }
212
213   SourceRange getSourceRange() const {
214     return isFreeIvar() ? SourceRange(Loc)
215     : SourceRange(getBase()->getLocStart(), Loc);
216   }
217
218   static bool classof(const Stmt *T) {
219     return T->getStmtClass() == ObjCIvarRefExprClass;
220   }
221   static bool classof(const ObjCIvarRefExpr *) { return true; }
222
223   // Iterators
224   child_range children() { return child_range(&Base, &Base+1); }
225 };
226
227 /// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC
228 /// property.
229 ///
230 class ObjCPropertyRefExpr : public Expr {
231 private:
232   /// If the bool is true, this is an implicit property reference; the
233   /// pointer is an (optional) ObjCMethodDecl and Setter may be set.
234   /// if the bool is false, this is an explicit property reference;
235   /// the pointer is an ObjCPropertyDecl and Setter is always null.
236   llvm::PointerIntPair<NamedDecl*, 1, bool> PropertyOrGetter;
237   ObjCMethodDecl *Setter;
238
239   SourceLocation IdLoc;
240   
241   /// \brief When the receiver in property access is 'super', this is
242   /// the location of the 'super' keyword.  When it's an interface,
243   /// this is that interface.
244   SourceLocation ReceiverLoc;
245   llvm::PointerUnion3<Stmt*, const Type*, ObjCInterfaceDecl*> Receiver;
246   
247 public:
248   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
249                       ExprValueKind VK, ExprObjectKind OK,
250                       SourceLocation l, Expr *base)
251     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
252            /*TypeDependent=*/false, base->isValueDependent(),
253            base->isInstantiationDependent(),
254            base->containsUnexpandedParameterPack()),
255       PropertyOrGetter(PD, false), Setter(0),
256       IdLoc(l), ReceiverLoc(), Receiver(base) {
257   }
258   
259   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
260                       ExprValueKind VK, ExprObjectKind OK,
261                       SourceLocation l, SourceLocation sl, QualType st)
262     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
263            /*TypeDependent=*/false, false, st->isInstantiationDependentType(),
264            st->containsUnexpandedParameterPack()),
265       PropertyOrGetter(PD, false), Setter(0),
266       IdLoc(l), ReceiverLoc(sl), Receiver(st.getTypePtr()) {
267   }
268
269   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
270                       QualType T, ExprValueKind VK, ExprObjectKind OK,
271                       SourceLocation IdLoc, Expr *Base)
272     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false,
273            Base->isValueDependent(), Base->isInstantiationDependent(),
274            Base->containsUnexpandedParameterPack()),
275       PropertyOrGetter(Getter, true), Setter(Setter),
276       IdLoc(IdLoc), ReceiverLoc(), Receiver(Base) {
277   }
278
279   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
280                       QualType T, ExprValueKind VK, ExprObjectKind OK,
281                       SourceLocation IdLoc,
282                       SourceLocation SuperLoc, QualType SuperTy)
283     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
284       PropertyOrGetter(Getter, true), Setter(Setter),
285       IdLoc(IdLoc), ReceiverLoc(SuperLoc), Receiver(SuperTy.getTypePtr()) {
286   }
287
288   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
289                       QualType T, ExprValueKind VK, ExprObjectKind OK,
290                       SourceLocation IdLoc,
291                       SourceLocation ReceiverLoc, ObjCInterfaceDecl *Receiver)
292     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
293       PropertyOrGetter(Getter, true), Setter(Setter),
294       IdLoc(IdLoc), ReceiverLoc(ReceiverLoc), Receiver(Receiver) {
295   }
296
297   explicit ObjCPropertyRefExpr(EmptyShell Empty)
298     : Expr(ObjCPropertyRefExprClass, Empty) {}
299
300   bool isImplicitProperty() const { return PropertyOrGetter.getInt(); }
301   bool isExplicitProperty() const { return !PropertyOrGetter.getInt(); }
302
303   ObjCPropertyDecl *getExplicitProperty() const {
304     assert(!isImplicitProperty());
305     return cast<ObjCPropertyDecl>(PropertyOrGetter.getPointer());
306   }
307
308   ObjCMethodDecl *getImplicitPropertyGetter() const {
309     assert(isImplicitProperty());
310     return cast_or_null<ObjCMethodDecl>(PropertyOrGetter.getPointer());
311   }
312
313   ObjCMethodDecl *getImplicitPropertySetter() const {
314     assert(isImplicitProperty());
315     return Setter;
316   }
317
318   Selector getGetterSelector() const {
319     if (isImplicitProperty())
320       return getImplicitPropertyGetter()->getSelector();
321     return getExplicitProperty()->getGetterName();
322   }
323
324   Selector getSetterSelector() const {
325     if (isImplicitProperty())
326       return getImplicitPropertySetter()->getSelector();
327     return getExplicitProperty()->getSetterName();
328   }
329
330   const Expr *getBase() const { 
331     return cast<Expr>(Receiver.get<Stmt*>()); 
332   }
333   Expr *getBase() { 
334     return cast<Expr>(Receiver.get<Stmt*>()); 
335   }
336
337   SourceLocation getLocation() const { return IdLoc; }
338   
339   SourceLocation getReceiverLocation() const { return ReceiverLoc; }
340   QualType getSuperReceiverType() const { 
341     return QualType(Receiver.get<const Type*>(), 0); 
342   }
343   QualType getGetterResultType() const {
344     QualType ResultType;
345     if (isExplicitProperty()) {
346       const ObjCPropertyDecl *PDecl = getExplicitProperty();
347       if (const ObjCMethodDecl *Getter = PDecl->getGetterMethodDecl())
348         ResultType = Getter->getResultType();
349       else
350         ResultType = getType();
351     } else {
352       const ObjCMethodDecl *Getter = getImplicitPropertyGetter();
353       ResultType = Getter->getResultType(); // with reference!
354     }
355     return ResultType;
356   }
357   
358   QualType getSetterArgType() const {
359     QualType ArgType;
360     if (isImplicitProperty()) {
361       const ObjCMethodDecl *Setter = getImplicitPropertySetter();
362       ObjCMethodDecl::param_iterator P = Setter->param_begin(); 
363       ArgType = (*P)->getType();
364     } else {
365       if (ObjCPropertyDecl *PDecl = getExplicitProperty())
366         if (const ObjCMethodDecl *Setter = PDecl->getSetterMethodDecl()) {
367           ObjCMethodDecl::param_iterator P = Setter->param_begin(); 
368           ArgType = (*P)->getType();
369         }
370       if (ArgType.isNull())
371         ArgType = getType();
372     }
373     return ArgType;
374   }
375   
376   ObjCInterfaceDecl *getClassReceiver() const {
377     return Receiver.get<ObjCInterfaceDecl*>();
378   }
379   bool isObjectReceiver() const { return Receiver.is<Stmt*>(); }
380   bool isSuperReceiver() const { return Receiver.is<const Type*>(); }
381   bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); }
382
383   SourceRange getSourceRange() const {
384     return SourceRange((isObjectReceiver() ? getBase()->getLocStart()
385                                            : getReceiverLocation()), 
386                        IdLoc);
387   }
388
389   static bool classof(const Stmt *T) {
390     return T->getStmtClass() == ObjCPropertyRefExprClass;
391   }
392   static bool classof(const ObjCPropertyRefExpr *) { return true; }
393
394   // Iterators
395   child_range children() {
396     if (Receiver.is<Stmt*>()) {
397       Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack!
398       return child_range(begin, begin+1);
399     }
400     return child_range();
401   }
402
403 private:
404   friend class ASTStmtReader;
405   void setExplicitProperty(ObjCPropertyDecl *D) {
406     PropertyOrGetter.setPointer(D);
407     PropertyOrGetter.setInt(false);
408     Setter = 0;
409   }
410   void setImplicitProperty(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter) {
411     PropertyOrGetter.setPointer(Getter);
412     PropertyOrGetter.setInt(true);
413     this->Setter = Setter;
414   }
415   void setBase(Expr *Base) { Receiver = Base; }
416   void setSuperReceiver(QualType T) { Receiver = T.getTypePtr(); }
417   void setClassReceiver(ObjCInterfaceDecl *D) { Receiver = D; }
418
419   void setLocation(SourceLocation L) { IdLoc = L; }
420   void setReceiverLocation(SourceLocation Loc) { ReceiverLoc = Loc; }
421 };
422
423 /// \brief An expression that sends a message to the given Objective-C
424 /// object or class.
425 ///
426 /// The following contains two message send expressions:
427 ///
428 /// \code
429 ///   [[NSString alloc] initWithString:@"Hello"]
430 /// \endcode
431 ///
432 /// The innermost message send invokes the "alloc" class method on the
433 /// NSString class, while the outermost message send invokes the
434 /// "initWithString" instance method on the object returned from
435 /// NSString's "alloc". In all, an Objective-C message send can take
436 /// on four different (although related) forms:
437 ///
438 ///   1. Send to an object instance.
439 ///   2. Send to a class.
440 ///   3. Send to the superclass instance of the current class.
441 ///   4. Send to the superclass of the current class.
442 ///
443 /// All four kinds of message sends are modeled by the ObjCMessageExpr
444 /// class, and can be distinguished via \c getReceiverKind(). Example:
445 ///
446 class ObjCMessageExpr : public Expr {
447   /// \brief The number of arguments in the message send, not
448   /// including the receiver.
449   unsigned NumArgs : 16;
450
451   /// \brief The kind of message send this is, which is one of the
452   /// ReceiverKind values.
453   ///
454   /// We pad this out to a byte to avoid excessive masking and shifting.
455   unsigned Kind : 8;
456
457   /// \brief Whether we have an actual method prototype in \c
458   /// SelectorOrMethod.
459   ///
460   /// When non-zero, we have a method declaration; otherwise, we just
461   /// have a selector.
462   unsigned HasMethod : 1;
463
464   /// \brief Whether this message send is a "delegate init call",
465   /// i.e. a call of an init method on self from within an init method.
466   unsigned IsDelegateInitCall : 1;
467
468   /// \brief When the message expression is a send to 'super', this is
469   /// the location of the 'super' keyword.
470   SourceLocation SuperLoc;
471
472   /// \brief Stores either the selector that this message is sending
473   /// to (when \c HasMethod is zero) or an \c ObjCMethodDecl pointer
474   /// referring to the method that we type-checked against.
475   uintptr_t SelectorOrMethod;
476
477   /// \brief Location of the selector.
478   SourceLocation SelectorLoc;
479
480   /// \brief The source locations of the open and close square
481   /// brackets ('[' and ']', respectively).
482   SourceLocation LBracLoc, RBracLoc;
483
484   ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs)
485     : Expr(ObjCMessageExprClass, Empty), NumArgs(NumArgs), Kind(0), 
486       HasMethod(0), IsDelegateInitCall(0), SelectorOrMethod(0) { }
487
488   ObjCMessageExpr(QualType T, ExprValueKind VK,
489                   SourceLocation LBracLoc,
490                   SourceLocation SuperLoc,
491                   bool IsInstanceSuper,
492                   QualType SuperType,
493                   Selector Sel, 
494                   SourceLocation SelLoc,
495                   ObjCMethodDecl *Method,
496                   Expr **Args, unsigned NumArgs,
497                   SourceLocation RBracLoc);
498   ObjCMessageExpr(QualType T, ExprValueKind VK,
499                   SourceLocation LBracLoc,
500                   TypeSourceInfo *Receiver,
501                   Selector Sel, 
502                   SourceLocation SelLoc,
503                   ObjCMethodDecl *Method,
504                   Expr **Args, unsigned NumArgs,
505                   SourceLocation RBracLoc);
506   ObjCMessageExpr(QualType T, ExprValueKind VK,
507                   SourceLocation LBracLoc,
508                   Expr *Receiver,
509                   Selector Sel, 
510                   SourceLocation SelLoc,
511                   ObjCMethodDecl *Method,
512                   Expr **Args, unsigned NumArgs,
513                   SourceLocation RBracLoc);
514
515   /// \brief Retrieve the pointer value of the message receiver.
516   void *getReceiverPointer() const {
517     return *const_cast<void **>(
518                              reinterpret_cast<const void * const*>(this + 1));
519   }
520
521   /// \brief Set the pointer value of the message receiver.
522   void setReceiverPointer(void *Value) {
523     *reinterpret_cast<void **>(this + 1) = Value;
524   }
525
526 public:
527   /// \brief The kind of receiver this message is sending to.
528   enum ReceiverKind {
529     /// \brief The receiver is a class.
530     Class = 0,
531     /// \brief The receiver is an object instance.
532     Instance,
533     /// \brief The receiver is a superclass.
534     SuperClass,
535     /// \brief The receiver is the instance of the superclass object.
536     SuperInstance
537   };
538
539   /// \brief Create a message send to super.
540   ///
541   /// \param Context The ASTContext in which this expression will be created.
542   ///
543   /// \param T The result type of this message.
544   ///
545   /// \param VK The value kind of this message.  A message returning
546   /// a l-value or r-value reference will be an l-value or x-value,
547   /// respectively.
548   ///
549   /// \param LBrac The location of the open square bracket '['.
550   ///
551   /// \param SuperLoc The location of the "super" keyword.
552   ///
553   /// \param IsInstanceSuper Whether this is an instance "super"
554   /// message (otherwise, it's a class "super" message).
555   ///
556   /// \param Sel The selector used to determine which method gets called.
557   ///
558   /// \param Method The Objective-C method against which this message
559   /// send was type-checked. May be NULL.
560   ///
561   /// \param Args The message send arguments.
562   ///
563   /// \param NumArgs The number of arguments.
564   ///
565   /// \param RBracLoc The location of the closing square bracket ']'.
566   static ObjCMessageExpr *Create(ASTContext &Context, QualType T, 
567                                  ExprValueKind VK,
568                                  SourceLocation LBracLoc,
569                                  SourceLocation SuperLoc,
570                                  bool IsInstanceSuper,
571                                  QualType SuperType,
572                                  Selector Sel, 
573                                  SourceLocation SelLoc,
574                                  ObjCMethodDecl *Method,
575                                  Expr **Args, unsigned NumArgs,
576                                  SourceLocation RBracLoc);
577
578   /// \brief Create a class message send.
579   ///
580   /// \param Context The ASTContext in which this expression will be created.
581   ///
582   /// \param T The result type of this message.
583   ///
584   /// \param VK The value kind of this message.  A message returning
585   /// a l-value or r-value reference will be an l-value or x-value,
586   /// respectively.
587   ///
588   /// \param LBrac The location of the open square bracket '['.
589   ///
590   /// \param Receiver The type of the receiver, including
591   /// source-location information.
592   ///
593   /// \param Sel The selector used to determine which method gets called.
594   ///
595   /// \param Method The Objective-C method against which this message
596   /// send was type-checked. May be NULL.
597   ///
598   /// \param Args The message send arguments.
599   ///
600   /// \param NumArgs The number of arguments.
601   ///
602   /// \param RBracLoc The location of the closing square bracket ']'.
603   static ObjCMessageExpr *Create(ASTContext &Context, QualType T,
604                                  ExprValueKind VK,
605                                  SourceLocation LBracLoc,
606                                  TypeSourceInfo *Receiver,
607                                  Selector Sel, 
608                                  SourceLocation SelLoc,
609                                  ObjCMethodDecl *Method,
610                                  Expr **Args, unsigned NumArgs,
611                                  SourceLocation RBracLoc);
612
613   /// \brief Create an instance message send.
614   ///
615   /// \param Context The ASTContext in which this expression will be created.
616   ///
617   /// \param T The result type of this message.
618   ///
619   /// \param VK The value kind of this message.  A message returning
620   /// a l-value or r-value reference will be an l-value or x-value,
621   /// respectively.
622   ///
623   /// \param LBrac The location of the open square bracket '['.
624   ///
625   /// \param Receiver The expression used to produce the object that
626   /// will receive this message.
627   ///
628   /// \param Sel The selector used to determine which method gets called.
629   ///
630   /// \param Method The Objective-C method against which this message
631   /// send was type-checked. May be NULL.
632   ///
633   /// \param Args The message send arguments.
634   ///
635   /// \param NumArgs The number of arguments.
636   ///
637   /// \param RBracLoc The location of the closing square bracket ']'.
638   static ObjCMessageExpr *Create(ASTContext &Context, QualType T,
639                                  ExprValueKind VK,
640                                  SourceLocation LBracLoc,
641                                  Expr *Receiver,
642                                  Selector Sel, 
643                                  SourceLocation SelLoc,
644                                  ObjCMethodDecl *Method,
645                                  Expr **Args, unsigned NumArgs,
646                                  SourceLocation RBracLoc);
647
648   /// \brief Create an empty Objective-C message expression, to be
649   /// filled in by subsequent calls.
650   ///
651   /// \param Context The context in which the message send will be created.
652   ///
653   /// \param NumArgs The number of message arguments, not including
654   /// the receiver.
655   static ObjCMessageExpr *CreateEmpty(ASTContext &Context, unsigned NumArgs);
656
657   /// \brief Determine the kind of receiver that this message is being
658   /// sent to.
659   ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; }
660
661   /// \brief Source range of the receiver.
662   SourceRange getReceiverRange() const;
663
664   /// \brief Determine whether this is an instance message to either a
665   /// computed object or to super.
666   bool isInstanceMessage() const {
667     return getReceiverKind() == Instance || getReceiverKind() == SuperInstance;
668   }
669
670   /// \brief Determine whether this is an class message to either a
671   /// specified class or to super.
672   bool isClassMessage() const {
673     return getReceiverKind() == Class || getReceiverKind() == SuperClass;
674   }
675
676   /// \brief Returns the receiver of an instance message.
677   ///
678   /// \brief Returns the object expression for an instance message, or
679   /// NULL for a message that is not an instance message.
680   Expr *getInstanceReceiver() {
681     if (getReceiverKind() == Instance)
682       return static_cast<Expr *>(getReceiverPointer());
683
684     return 0;
685   }
686   const Expr *getInstanceReceiver() const {
687     return const_cast<ObjCMessageExpr*>(this)->getInstanceReceiver();
688   }
689
690   /// \brief Turn this message send into an instance message that
691   /// computes the receiver object with the given expression.
692   void setInstanceReceiver(Expr *rec) { 
693     Kind = Instance;
694     setReceiverPointer(rec);
695   }
696   
697   /// \brief Returns the type of a class message send, or NULL if the
698   /// message is not a class message.
699   QualType getClassReceiver() const { 
700     if (TypeSourceInfo *TSInfo = getClassReceiverTypeInfo())
701       return TSInfo->getType();
702
703     return QualType();
704   }
705
706   /// \brief Returns a type-source information of a class message
707   /// send, or NULL if the message is not a class message.
708   TypeSourceInfo *getClassReceiverTypeInfo() const {
709     if (getReceiverKind() == Class)
710       return reinterpret_cast<TypeSourceInfo *>(getReceiverPointer());
711     return 0;
712   }
713
714   void setClassReceiver(TypeSourceInfo *TSInfo) {
715     Kind = Class;
716     setReceiverPointer(TSInfo);
717   }
718
719   /// \brief Retrieve the location of the 'super' keyword for a class
720   /// or instance message to 'super', otherwise an invalid source location.
721   SourceLocation getSuperLoc() const { 
722     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
723       return SuperLoc;
724
725     return SourceLocation();
726   }
727
728   /// \brief Retrieve the Objective-C interface to which this message
729   /// is being directed, if known.
730   ///
731   /// This routine cross-cuts all of the different kinds of message
732   /// sends to determine what the underlying (statically known) type
733   /// of the receiver will be; use \c getReceiverKind() to determine
734   /// whether the message is a class or an instance method, whether it
735   /// is a send to super or not, etc.
736   ///
737   /// \returns The Objective-C interface if known, otherwise NULL.
738   ObjCInterfaceDecl *getReceiverInterface() const;
739
740   /// \brief Retrieve the type referred to by 'super'. 
741   ///
742   /// The returned type will either be an ObjCInterfaceType (for an
743   /// class message to super) or an ObjCObjectPointerType that refers
744   /// to a class (for an instance message to super);
745   QualType getSuperType() const {
746     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
747       return QualType::getFromOpaquePtr(getReceiverPointer());
748
749     return QualType();
750   }
751
752   void setSuper(SourceLocation Loc, QualType T, bool IsInstanceSuper) {
753     Kind = IsInstanceSuper? SuperInstance : SuperClass;
754     SuperLoc = Loc;
755     setReceiverPointer(T.getAsOpaquePtr());
756   }
757
758   Selector getSelector() const;
759
760   void setSelector(Selector S) { 
761     HasMethod = false;
762     SelectorOrMethod = reinterpret_cast<uintptr_t>(S.getAsOpaquePtr());
763   }
764
765   const ObjCMethodDecl *getMethodDecl() const { 
766     if (HasMethod)
767       return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod);
768
769     return 0;
770   }
771
772   ObjCMethodDecl *getMethodDecl() { 
773     if (HasMethod)
774       return reinterpret_cast<ObjCMethodDecl *>(SelectorOrMethod);
775
776     return 0;
777   }
778
779   void setMethodDecl(ObjCMethodDecl *MD) { 
780     HasMethod = true;
781     SelectorOrMethod = reinterpret_cast<uintptr_t>(MD);
782   }
783
784   ObjCMethodFamily getMethodFamily() const {
785     if (HasMethod) return getMethodDecl()->getMethodFamily();
786     return getSelector().getMethodFamily();
787   }
788
789   /// \brief Return the number of actual arguments in this message,
790   /// not counting the receiver.
791   unsigned getNumArgs() const { return NumArgs; }
792
793   /// \brief Retrieve the arguments to this message, not including the
794   /// receiver.
795   Expr **getArgs() {
796     return reinterpret_cast<Expr **>(this + 1) + 1;
797   }
798   const Expr * const *getArgs() const {
799     return reinterpret_cast<const Expr * const *>(this + 1) + 1;
800   }
801
802   /// getArg - Return the specified argument.
803   Expr *getArg(unsigned Arg) {
804     assert(Arg < NumArgs && "Arg access out of range!");
805     return cast<Expr>(getArgs()[Arg]);
806   }
807   const Expr *getArg(unsigned Arg) const {
808     assert(Arg < NumArgs && "Arg access out of range!");
809     return cast<Expr>(getArgs()[Arg]);
810   }
811   /// setArg - Set the specified argument.
812   void setArg(unsigned Arg, Expr *ArgExpr) {
813     assert(Arg < NumArgs && "Arg access out of range!");
814     getArgs()[Arg] = ArgExpr;
815   }
816
817   /// isDelegateInitCall - Answers whether this message send has been
818   /// tagged as a "delegate init call", i.e. a call to a method in the
819   /// -init family on self from within an -init method implementation.
820   bool isDelegateInitCall() const { return IsDelegateInitCall; }
821   void setDelegateInitCall(bool isDelegate) { IsDelegateInitCall = isDelegate; }
822
823   SourceLocation getLeftLoc() const { return LBracLoc; }
824   SourceLocation getRightLoc() const { return RBracLoc; }
825   SourceLocation getSelectorLoc() const { return SelectorLoc; }
826
827   void setSourceRange(SourceRange R) {
828     LBracLoc = R.getBegin();
829     RBracLoc = R.getEnd();
830   }
831   SourceRange getSourceRange() const {
832     return SourceRange(LBracLoc, RBracLoc);
833   }
834
835   static bool classof(const Stmt *T) {
836     return T->getStmtClass() == ObjCMessageExprClass;
837   }
838   static bool classof(const ObjCMessageExpr *) { return true; }
839
840   // Iterators
841   child_range children();
842
843   typedef ExprIterator arg_iterator;
844   typedef ConstExprIterator const_arg_iterator;
845
846   arg_iterator arg_begin() { return reinterpret_cast<Stmt **>(getArgs()); }
847   arg_iterator arg_end()   { 
848     return reinterpret_cast<Stmt **>(getArgs() + NumArgs); 
849   }
850   const_arg_iterator arg_begin() const { 
851     return reinterpret_cast<Stmt const * const*>(getArgs()); 
852   }
853   const_arg_iterator arg_end() const { 
854     return reinterpret_cast<Stmt const * const*>(getArgs() + NumArgs); 
855   }
856
857   friend class ASTStmtReader;
858   friend class ASTStmtWriter;
859 };
860
861 /// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
862 /// (similar in spirit to MemberExpr).
863 class ObjCIsaExpr : public Expr {
864   /// Base - the expression for the base object pointer.
865   Stmt *Base;
866
867   /// IsaMemberLoc - This is the location of the 'isa'.
868   SourceLocation IsaMemberLoc;
869
870   /// IsArrow - True if this is "X->F", false if this is "X.F".
871   bool IsArrow;
872 public:
873   ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, QualType ty)
874     : Expr(ObjCIsaExprClass, ty, VK_LValue, OK_Ordinary,
875            /*TypeDependent=*/false, base->isValueDependent(),
876            base->isInstantiationDependent(),
877            /*ContainsUnexpandedParameterPack=*/false),
878       Base(base), IsaMemberLoc(l), IsArrow(isarrow) {}
879
880   /// \brief Build an empty expression.
881   explicit ObjCIsaExpr(EmptyShell Empty) : Expr(ObjCIsaExprClass, Empty) { }
882
883   void setBase(Expr *E) { Base = E; }
884   Expr *getBase() const { return cast<Expr>(Base); }
885
886   bool isArrow() const { return IsArrow; }
887   void setArrow(bool A) { IsArrow = A; }
888
889   /// getMemberLoc - Return the location of the "member", in X->F, it is the
890   /// location of 'F'.
891   SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; }
892   void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; }
893
894   SourceRange getSourceRange() const {
895     return SourceRange(getBase()->getLocStart(), IsaMemberLoc);
896   }
897
898   SourceLocation getExprLoc() const { return IsaMemberLoc; }
899
900   static bool classof(const Stmt *T) {
901     return T->getStmtClass() == ObjCIsaExprClass;
902   }
903   static bool classof(const ObjCIsaExpr *) { return true; }
904
905   // Iterators
906   child_range children() { return child_range(&Base, &Base+1); }
907 };
908
909
910 /// ObjCIndirectCopyRestoreExpr - Represents the passing of a function
911 /// argument by indirect copy-restore in ARC.  This is used to support
912 /// passing indirect arguments with the wrong lifetime, e.g. when
913 /// passing the address of a __strong local variable to an 'out'
914 /// parameter.  This expression kind is only valid in an "argument"
915 /// position to some sort of call expression.
916 ///
917 /// The parameter must have type 'pointer to T', and the argument must
918 /// have type 'pointer to U', where T and U agree except possibly in
919 /// qualification.  If the argument value is null, then a null pointer
920 /// is passed;  otherwise it points to an object A, and:
921 /// 1. A temporary object B of type T is initialized, either by
922 ///    zero-initialization (used when initializing an 'out' parameter)
923 ///    or copy-initialization (used when initializing an 'inout'
924 ///    parameter).
925 /// 2. The address of the temporary is passed to the function.
926 /// 3. If the call completes normally, A is move-assigned from B.
927 /// 4. Finally, A is destroyed immediately.
928 ///
929 /// Currently 'T' must be a retainable object lifetime and must be
930 /// __autoreleasing;  this qualifier is ignored when initializing
931 /// the value.
932 class ObjCIndirectCopyRestoreExpr : public Expr {
933   Stmt *Operand;
934
935   // unsigned ObjCIndirectCopyRestoreBits.ShouldCopy : 1;
936
937   friend class ASTReader;
938   friend class ASTStmtReader;
939
940   void setShouldCopy(bool shouldCopy) {
941     ObjCIndirectCopyRestoreExprBits.ShouldCopy = shouldCopy;
942   }
943
944   explicit ObjCIndirectCopyRestoreExpr(EmptyShell Empty)
945     : Expr(ObjCIndirectCopyRestoreExprClass, Empty) { }
946
947 public:
948   ObjCIndirectCopyRestoreExpr(Expr *operand, QualType type, bool shouldCopy)
949     : Expr(ObjCIndirectCopyRestoreExprClass, type, VK_LValue, OK_Ordinary,
950            operand->isTypeDependent(), operand->isValueDependent(),
951            operand->isInstantiationDependent(),
952            operand->containsUnexpandedParameterPack()),
953       Operand(operand) {
954     setShouldCopy(shouldCopy);
955   }
956
957   Expr *getSubExpr() { return cast<Expr>(Operand); }
958   const Expr *getSubExpr() const { return cast<Expr>(Operand); }
959
960   /// shouldCopy - True if we should do the 'copy' part of the
961   /// copy-restore.  If false, the temporary will be zero-initialized.
962   bool shouldCopy() const { return ObjCIndirectCopyRestoreExprBits.ShouldCopy; }
963
964   child_range children() { return child_range(&Operand, &Operand+1); }  
965
966   // Source locations are determined by the subexpression.
967   SourceRange getSourceRange() const { return Operand->getSourceRange(); }
968   SourceLocation getExprLoc() const { return getSubExpr()->getExprLoc(); }
969
970   static bool classof(const Stmt *s) {
971     return s->getStmtClass() == ObjCIndirectCopyRestoreExprClass;
972   }
973   static bool classof(const ObjCIndirectCopyRestoreExpr *) { return true; }
974 };
975
976 /// \brief An Objective-C "bridged" cast expression, which casts between
977 /// Objective-C pointers and C pointers, transferring ownership in the process.
978 ///
979 /// \code
980 /// NSString *str = (__bridge_transfer NSString *)CFCreateString();
981 /// \endcode
982 class ObjCBridgedCastExpr : public ExplicitCastExpr {
983   SourceLocation LParenLoc;
984   SourceLocation BridgeKeywordLoc;
985   unsigned Kind : 2;
986   
987   friend class ASTStmtReader;
988   friend class ASTStmtWriter;
989   
990 public:
991   ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind,
992                       SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo,
993                       Expr *Operand)
994     : ExplicitCastExpr(ObjCBridgedCastExprClass, TSInfo->getType(), VK_RValue,
995                        CK_BitCast, Operand, 0, TSInfo),
996       LParenLoc(LParenLoc), BridgeKeywordLoc(BridgeKeywordLoc), Kind(Kind) { }
997   
998   /// \brief Construct an empty Objective-C bridged cast.
999   explicit ObjCBridgedCastExpr(EmptyShell Shell)
1000     : ExplicitCastExpr(ObjCBridgedCastExprClass, Shell, 0) { }
1001
1002   SourceLocation getLParenLoc() const { return LParenLoc; }
1003
1004   /// \brief Determine which kind of bridge is being performed via this cast.
1005   ObjCBridgeCastKind getBridgeKind() const { 
1006     return static_cast<ObjCBridgeCastKind>(Kind); 
1007   }
1008   
1009   /// \brief Retrieve the kind of bridge being performed as a string.
1010   llvm::StringRef getBridgeKindName() const;
1011   
1012   /// \brief The location of the bridge keyword.
1013   SourceLocation getBridgeKeywordLoc() const { return BridgeKeywordLoc; }
1014   
1015   SourceRange getSourceRange() const {
1016     return SourceRange(LParenLoc, getSubExpr()->getLocEnd());
1017   }
1018   
1019   static bool classof(const Stmt *T) {
1020     return T->getStmtClass() == ObjCBridgedCastExprClass;
1021   }
1022   static bool classof(const ObjCBridgedCastExpr *) { return true; }
1023  
1024 };
1025   
1026 }  // end namespace clang
1027
1028 #endif