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/AST/SelectorLocationsKind.h" 20 #include "clang/Basic/IdentifierTable.h" 21 #include "llvm/Support/Compiler.h" 22 23 namespace clang { 24 class IdentifierInfo; 25 class ASTContext; 26 27 /// ObjCStringLiteral, used for Objective-C string literals 28 /// i.e. @"foo". 29 class ObjCStringLiteral : public Expr { 30 Stmt *String; 31 SourceLocation AtLoc; 32 public: ObjCStringLiteral(StringLiteral * SL,QualType T,SourceLocation L)33 ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L) 34 : Expr(ObjCStringLiteralClass, T, VK_RValue, OK_Ordinary, false, false, 35 false, false), 36 String(SL), AtLoc(L) {} ObjCStringLiteral(EmptyShell Empty)37 explicit ObjCStringLiteral(EmptyShell Empty) 38 : Expr(ObjCStringLiteralClass, Empty) {} 39 getString()40 StringLiteral *getString() { return cast<StringLiteral>(String); } getString()41 const StringLiteral *getString() const { return cast<StringLiteral>(String); } setString(StringLiteral * S)42 void setString(StringLiteral *S) { String = S; } 43 getAtLoc()44 SourceLocation getAtLoc() const { return AtLoc; } setAtLoc(SourceLocation L)45 void setAtLoc(SourceLocation L) { AtLoc = L; } 46 getLocStart()47 SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; } getLocEnd()48 SourceLocation getLocEnd() const LLVM_READONLY { return String->getLocEnd(); } 49 classof(const Stmt * T)50 static bool classof(const Stmt *T) { 51 return T->getStmtClass() == ObjCStringLiteralClass; 52 } 53 54 // Iterators children()55 child_range children() { return child_range(&String, &String+1); } 56 }; 57 58 /// ObjCBoolLiteralExpr - Objective-C Boolean Literal. 59 /// 60 class ObjCBoolLiteralExpr : public Expr { 61 bool Value; 62 SourceLocation Loc; 63 public: ObjCBoolLiteralExpr(bool val,QualType Ty,SourceLocation l)64 ObjCBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 65 Expr(ObjCBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 66 false, false), Value(val), Loc(l) {} 67 ObjCBoolLiteralExpr(EmptyShell Empty)68 explicit ObjCBoolLiteralExpr(EmptyShell Empty) 69 : Expr(ObjCBoolLiteralExprClass, Empty) { } 70 getValue()71 bool getValue() const { return Value; } setValue(bool V)72 void setValue(bool V) { Value = V; } 73 getLocStart()74 SourceLocation getLocStart() const LLVM_READONLY { return Loc; } getLocEnd()75 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 76 getLocation()77 SourceLocation getLocation() const { return Loc; } setLocation(SourceLocation L)78 void setLocation(SourceLocation L) { Loc = L; } 79 classof(const Stmt * T)80 static bool classof(const Stmt *T) { 81 return T->getStmtClass() == ObjCBoolLiteralExprClass; 82 } 83 84 // Iterators children()85 child_range children() { return child_range(); } 86 }; 87 88 /// ObjCBoxedExpr - used for generalized expression boxing. 89 /// as in: @(strdup("hello world")) or @(random()) 90 /// Also used for boxing non-parenthesized numeric literals; 91 /// as in: @42 or \@true (c++/objc++) or \@__yes (c/objc). 92 class ObjCBoxedExpr : public Expr { 93 Stmt *SubExpr; 94 ObjCMethodDecl *BoxingMethod; 95 SourceRange Range; 96 public: ObjCBoxedExpr(Expr * E,QualType T,ObjCMethodDecl * method,SourceRange R)97 ObjCBoxedExpr(Expr *E, QualType T, ObjCMethodDecl *method, 98 SourceRange R) 99 : Expr(ObjCBoxedExprClass, T, VK_RValue, OK_Ordinary, 100 E->isTypeDependent(), E->isValueDependent(), 101 E->isInstantiationDependent(), E->containsUnexpandedParameterPack()), 102 SubExpr(E), BoxingMethod(method), Range(R) {} ObjCBoxedExpr(EmptyShell Empty)103 explicit ObjCBoxedExpr(EmptyShell Empty) 104 : Expr(ObjCBoxedExprClass, Empty) {} 105 getSubExpr()106 Expr *getSubExpr() { return cast<Expr>(SubExpr); } getSubExpr()107 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 108 getBoxingMethod()109 ObjCMethodDecl *getBoxingMethod() const { 110 return BoxingMethod; 111 } 112 getAtLoc()113 SourceLocation getAtLoc() const { return Range.getBegin(); } 114 getLocStart()115 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } getLocEnd()116 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } getSourceRange()117 SourceRange getSourceRange() const LLVM_READONLY { 118 return Range; 119 } 120 classof(const Stmt * T)121 static bool classof(const Stmt *T) { 122 return T->getStmtClass() == ObjCBoxedExprClass; 123 } 124 125 // Iterators children()126 child_range children() { return child_range(&SubExpr, &SubExpr+1); } 127 128 typedef ConstExprIterator const_arg_iterator; 129 arg_begin()130 const_arg_iterator arg_begin() const { 131 return reinterpret_cast<Stmt const * const*>(&SubExpr); 132 } arg_end()133 const_arg_iterator arg_end() const { 134 return reinterpret_cast<Stmt const * const*>(&SubExpr + 1); 135 } 136 137 friend class ASTStmtReader; 138 }; 139 140 /// ObjCArrayLiteral - used for objective-c array containers; as in: 141 /// @[@"Hello", NSApp, [NSNumber numberWithInt:42]]; 142 class ObjCArrayLiteral : public Expr { 143 unsigned NumElements; 144 SourceRange Range; 145 ObjCMethodDecl *ArrayWithObjectsMethod; 146 147 ObjCArrayLiteral(ArrayRef<Expr *> Elements, 148 QualType T, ObjCMethodDecl * Method, 149 SourceRange SR); 150 ObjCArrayLiteral(EmptyShell Empty,unsigned NumElements)151 explicit ObjCArrayLiteral(EmptyShell Empty, unsigned NumElements) 152 : Expr(ObjCArrayLiteralClass, Empty), NumElements(NumElements) {} 153 154 public: 155 static ObjCArrayLiteral *Create(const ASTContext &C, 156 ArrayRef<Expr *> Elements, 157 QualType T, ObjCMethodDecl * Method, 158 SourceRange SR); 159 160 static ObjCArrayLiteral *CreateEmpty(const ASTContext &C, 161 unsigned NumElements); 162 getLocStart()163 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } getLocEnd()164 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } getSourceRange()165 SourceRange getSourceRange() const LLVM_READONLY { return Range; } 166 classof(const Stmt * T)167 static bool classof(const Stmt *T) { 168 return T->getStmtClass() == ObjCArrayLiteralClass; 169 } 170 171 /// \brief Retrieve elements of array of literals. getElements()172 Expr **getElements() { return reinterpret_cast<Expr **>(this + 1); } 173 174 /// \brief Retrieve elements of array of literals. getElements()175 const Expr * const *getElements() const { 176 return reinterpret_cast<const Expr * const*>(this + 1); 177 } 178 179 /// getNumElements - Return number of elements of objective-c array literal. getNumElements()180 unsigned getNumElements() const { return NumElements; } 181 182 /// getExpr - Return the Expr at the specified index. getElement(unsigned Index)183 Expr *getElement(unsigned Index) { 184 assert((Index < NumElements) && "Arg access out of range!"); 185 return cast<Expr>(getElements()[Index]); 186 } getElement(unsigned Index)187 const Expr *getElement(unsigned Index) const { 188 assert((Index < NumElements) && "Arg access out of range!"); 189 return cast<Expr>(getElements()[Index]); 190 } 191 getArrayWithObjectsMethod()192 ObjCMethodDecl *getArrayWithObjectsMethod() const { 193 return ArrayWithObjectsMethod; 194 } 195 196 // Iterators children()197 child_range children() { 198 return child_range((Stmt **)getElements(), 199 (Stmt **)getElements() + NumElements); 200 } 201 202 friend class ASTStmtReader; 203 }; 204 205 /// \brief An element in an Objective-C dictionary literal. 206 /// 207 struct ObjCDictionaryElement { 208 /// \brief The key for the dictionary element. 209 Expr *Key; 210 211 /// \brief The value of the dictionary element. 212 Expr *Value; 213 214 /// \brief The location of the ellipsis, if this is a pack expansion. 215 SourceLocation EllipsisLoc; 216 217 /// \brief The number of elements this pack expansion will expand to, if 218 /// this is a pack expansion and is known. 219 Optional<unsigned> NumExpansions; 220 221 /// \brief Determines whether this dictionary element is a pack expansion. isPackExpansionObjCDictionaryElement222 bool isPackExpansion() const { return EllipsisLoc.isValid(); } 223 }; 224 } // end namespace clang 225 226 namespace llvm { 227 template <> struct isPodLike<clang::ObjCDictionaryElement> : std::true_type {}; 228 } 229 230 namespace clang { 231 /// ObjCDictionaryLiteral - AST node to represent objective-c dictionary 232 /// literals; as in: @{@"name" : NSUserName(), @"date" : [NSDate date] }; 233 class ObjCDictionaryLiteral : public Expr { 234 /// \brief Key/value pair used to store the key and value of a given element. 235 /// 236 /// Objects of this type are stored directly after the expression. 237 struct KeyValuePair { 238 Expr *Key; 239 Expr *Value; 240 }; 241 242 /// \brief Data that describes an element that is a pack expansion, used if any 243 /// of the elements in the dictionary literal are pack expansions. 244 struct ExpansionData { 245 /// \brief The location of the ellipsis, if this element is a pack 246 /// expansion. 247 SourceLocation EllipsisLoc; 248 249 /// \brief If non-zero, the number of elements that this pack 250 /// expansion will expand to (+1). 251 unsigned NumExpansionsPlusOne; 252 }; 253 254 /// \brief The number of elements in this dictionary literal. 255 unsigned NumElements : 31; 256 257 /// \brief Determine whether this dictionary literal has any pack expansions. 258 /// 259 /// If the dictionary literal has pack expansions, then there will 260 /// be an array of pack expansion data following the array of 261 /// key/value pairs, which provide the locations of the ellipses (if 262 /// any) and number of elements in the expansion (if known). If 263 /// there are no pack expansions, we optimize away this storage. 264 unsigned HasPackExpansions : 1; 265 266 SourceRange Range; 267 ObjCMethodDecl *DictWithObjectsMethod; 268 269 ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK, 270 bool HasPackExpansions, 271 QualType T, ObjCMethodDecl *method, 272 SourceRange SR); 273 274 explicit ObjCDictionaryLiteral(EmptyShell Empty, unsigned NumElements, 275 bool HasPackExpansions) 276 : Expr(ObjCDictionaryLiteralClass, Empty), NumElements(NumElements), 277 HasPackExpansions(HasPackExpansions) {} 278 279 KeyValuePair *getKeyValues() { 280 return reinterpret_cast<KeyValuePair *>(this + 1); 281 } 282 283 const KeyValuePair *getKeyValues() const { 284 return reinterpret_cast<const KeyValuePair *>(this + 1); 285 } 286 287 ExpansionData *getExpansionData() { 288 if (!HasPackExpansions) 289 return nullptr; 290 291 return reinterpret_cast<ExpansionData *>(getKeyValues() + NumElements); 292 } 293 294 const ExpansionData *getExpansionData() const { 295 if (!HasPackExpansions) 296 return nullptr; 297 298 return reinterpret_cast<const ExpansionData *>(getKeyValues()+NumElements); 299 } 300 301 public: 302 static ObjCDictionaryLiteral *Create(const ASTContext &C, 303 ArrayRef<ObjCDictionaryElement> VK, 304 bool HasPackExpansions, 305 QualType T, ObjCMethodDecl *method, 306 SourceRange SR); 307 308 static ObjCDictionaryLiteral *CreateEmpty(const ASTContext &C, 309 unsigned NumElements, 310 bool HasPackExpansions); 311 312 /// getNumElements - Return number of elements of objective-c dictionary 313 /// literal. 314 unsigned getNumElements() const { return NumElements; } 315 316 ObjCDictionaryElement getKeyValueElement(unsigned Index) const { 317 assert((Index < NumElements) && "Arg access out of range!"); 318 const KeyValuePair &KV = getKeyValues()[Index]; 319 ObjCDictionaryElement Result = { KV.Key, KV.Value, SourceLocation(), None }; 320 if (HasPackExpansions) { 321 const ExpansionData &Expansion = getExpansionData()[Index]; 322 Result.EllipsisLoc = Expansion.EllipsisLoc; 323 if (Expansion.NumExpansionsPlusOne > 0) 324 Result.NumExpansions = Expansion.NumExpansionsPlusOne - 1; 325 } 326 return Result; 327 } 328 329 ObjCMethodDecl *getDictWithObjectsMethod() const 330 { return DictWithObjectsMethod; } 331 332 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 333 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 334 SourceRange getSourceRange() const LLVM_READONLY { return Range; } 335 336 static bool classof(const Stmt *T) { 337 return T->getStmtClass() == ObjCDictionaryLiteralClass; 338 } 339 340 // Iterators 341 child_range children() { 342 // Note: we're taking advantage of the layout of the KeyValuePair struct 343 // here. If that struct changes, this code will need to change as well. 344 return child_range(reinterpret_cast<Stmt **>(this + 1), 345 reinterpret_cast<Stmt **>(this + 1) + NumElements * 2); 346 } 347 348 friend class ASTStmtReader; 349 friend class ASTStmtWriter; 350 }; 351 352 353 /// ObjCEncodeExpr, used for \@encode in Objective-C. \@encode has the same 354 /// type and behavior as StringLiteral except that the string initializer is 355 /// obtained from ASTContext with the encoding type as an argument. 356 class ObjCEncodeExpr : public Expr { 357 TypeSourceInfo *EncodedType; 358 SourceLocation AtLoc, RParenLoc; 359 public: 360 ObjCEncodeExpr(QualType T, TypeSourceInfo *EncodedType, 361 SourceLocation at, SourceLocation rp) 362 : Expr(ObjCEncodeExprClass, T, VK_LValue, OK_Ordinary, 363 EncodedType->getType()->isDependentType(), 364 EncodedType->getType()->isDependentType(), 365 EncodedType->getType()->isInstantiationDependentType(), 366 EncodedType->getType()->containsUnexpandedParameterPack()), 367 EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {} 368 369 explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){} 370 371 372 SourceLocation getAtLoc() const { return AtLoc; } 373 void setAtLoc(SourceLocation L) { AtLoc = L; } 374 SourceLocation getRParenLoc() const { return RParenLoc; } 375 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 376 377 QualType getEncodedType() const { return EncodedType->getType(); } 378 379 TypeSourceInfo *getEncodedTypeSourceInfo() const { return EncodedType; } 380 void setEncodedTypeSourceInfo(TypeSourceInfo *EncType) { 381 EncodedType = EncType; 382 } 383 384 SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; } 385 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 386 387 static bool classof(const Stmt *T) { 388 return T->getStmtClass() == ObjCEncodeExprClass; 389 } 390 391 // Iterators 392 child_range children() { return child_range(); } 393 }; 394 395 /// ObjCSelectorExpr used for \@selector in Objective-C. 396 class ObjCSelectorExpr : public Expr { 397 Selector SelName; 398 SourceLocation AtLoc, RParenLoc; 399 public: 400 ObjCSelectorExpr(QualType T, Selector selInfo, 401 SourceLocation at, SourceLocation rp) 402 : Expr(ObjCSelectorExprClass, T, VK_RValue, OK_Ordinary, false, false, 403 false, false), 404 SelName(selInfo), AtLoc(at), RParenLoc(rp){} 405 explicit ObjCSelectorExpr(EmptyShell Empty) 406 : Expr(ObjCSelectorExprClass, Empty) {} 407 408 Selector getSelector() const { return SelName; } 409 void setSelector(Selector S) { SelName = S; } 410 411 SourceLocation getAtLoc() const { return AtLoc; } 412 SourceLocation getRParenLoc() const { return RParenLoc; } 413 void setAtLoc(SourceLocation L) { AtLoc = L; } 414 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 415 416 SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; } 417 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 418 419 /// getNumArgs - Return the number of actual arguments to this call. 420 unsigned getNumArgs() const { return SelName.getNumArgs(); } 421 422 static bool classof(const Stmt *T) { 423 return T->getStmtClass() == ObjCSelectorExprClass; 424 } 425 426 // Iterators 427 child_range children() { return child_range(); } 428 }; 429 430 /// ObjCProtocolExpr used for protocol expression in Objective-C. 431 /// 432 /// This is used as: \@protocol(foo), as in: 433 /// \code 434 /// [obj conformsToProtocol:@protocol(foo)] 435 /// \endcode 436 /// 437 /// The return type is "Protocol*". 438 class ObjCProtocolExpr : public Expr { 439 ObjCProtocolDecl *TheProtocol; 440 SourceLocation AtLoc, ProtoLoc, RParenLoc; 441 public: 442 ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol, 443 SourceLocation at, SourceLocation protoLoc, SourceLocation rp) 444 : Expr(ObjCProtocolExprClass, T, VK_RValue, OK_Ordinary, false, false, 445 false, false), 446 TheProtocol(protocol), AtLoc(at), ProtoLoc(protoLoc), RParenLoc(rp) {} 447 explicit ObjCProtocolExpr(EmptyShell Empty) 448 : Expr(ObjCProtocolExprClass, Empty) {} 449 450 ObjCProtocolDecl *getProtocol() const { return TheProtocol; } 451 void setProtocol(ObjCProtocolDecl *P) { TheProtocol = P; } 452 453 SourceLocation getProtocolIdLoc() const { return ProtoLoc; } 454 SourceLocation getAtLoc() const { return AtLoc; } 455 SourceLocation getRParenLoc() const { return RParenLoc; } 456 void setAtLoc(SourceLocation L) { AtLoc = L; } 457 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 458 459 SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; } 460 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 461 462 static bool classof(const Stmt *T) { 463 return T->getStmtClass() == ObjCProtocolExprClass; 464 } 465 466 // Iterators 467 child_range children() { return child_range(); } 468 469 friend class ASTStmtReader; 470 friend class ASTStmtWriter; 471 }; 472 473 /// ObjCIvarRefExpr - A reference to an ObjC instance variable. 474 class ObjCIvarRefExpr : public Expr { 475 ObjCIvarDecl *D; 476 Stmt *Base; 477 SourceLocation Loc; 478 /// OpLoc - This is the location of '.' or '->' 479 SourceLocation OpLoc; 480 481 bool IsArrow:1; // True if this is "X->F", false if this is "X.F". 482 bool IsFreeIvar:1; // True if ivar reference has no base (self assumed). 483 484 public: 485 ObjCIvarRefExpr(ObjCIvarDecl *d, QualType t, 486 SourceLocation l, SourceLocation oploc, 487 Expr *base, 488 bool arrow = false, bool freeIvar = false) : 489 Expr(ObjCIvarRefExprClass, t, VK_LValue, 490 d->isBitField() ? OK_BitField : OK_Ordinary, 491 /*TypeDependent=*/false, base->isValueDependent(), 492 base->isInstantiationDependent(), 493 base->containsUnexpandedParameterPack()), 494 D(d), Base(base), Loc(l), OpLoc(oploc), 495 IsArrow(arrow), IsFreeIvar(freeIvar) {} 496 497 explicit ObjCIvarRefExpr(EmptyShell Empty) 498 : Expr(ObjCIvarRefExprClass, Empty) {} 499 500 ObjCIvarDecl *getDecl() { return D; } 501 const ObjCIvarDecl *getDecl() const { return D; } 502 void setDecl(ObjCIvarDecl *d) { D = d; } 503 504 const Expr *getBase() const { return cast<Expr>(Base); } 505 Expr *getBase() { return cast<Expr>(Base); } 506 void setBase(Expr * base) { Base = base; } 507 508 bool isArrow() const { return IsArrow; } 509 bool isFreeIvar() const { return IsFreeIvar; } 510 void setIsArrow(bool A) { IsArrow = A; } 511 void setIsFreeIvar(bool A) { IsFreeIvar = A; } 512 513 SourceLocation getLocation() const { return Loc; } 514 void setLocation(SourceLocation L) { Loc = L; } 515 516 SourceLocation getLocStart() const LLVM_READONLY { 517 return isFreeIvar() ? Loc : getBase()->getLocStart(); 518 } 519 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 520 521 SourceLocation getOpLoc() const { return OpLoc; } 522 void setOpLoc(SourceLocation L) { OpLoc = L; } 523 524 static bool classof(const Stmt *T) { 525 return T->getStmtClass() == ObjCIvarRefExprClass; 526 } 527 528 // Iterators 529 child_range children() { return child_range(&Base, &Base+1); } 530 }; 531 532 /// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC 533 /// property. 534 class ObjCPropertyRefExpr : public Expr { 535 private: 536 /// If the bool is true, this is an implicit property reference; the 537 /// pointer is an (optional) ObjCMethodDecl and Setter may be set. 538 /// if the bool is false, this is an explicit property reference; 539 /// the pointer is an ObjCPropertyDecl and Setter is always null. 540 llvm::PointerIntPair<NamedDecl*, 1, bool> PropertyOrGetter; 541 542 /// \brief Indicates whether the property reference will result in a message 543 /// to the getter, the setter, or both. 544 /// This applies to both implicit and explicit property references. 545 enum MethodRefFlags { 546 MethodRef_None = 0, 547 MethodRef_Getter = 0x1, 548 MethodRef_Setter = 0x2 549 }; 550 551 /// \brief Contains the Setter method pointer and MethodRefFlags bit flags. 552 llvm::PointerIntPair<ObjCMethodDecl *, 2, unsigned> SetterAndMethodRefFlags; 553 554 // FIXME: Maybe we should store the property identifier here, 555 // because it's not rederivable from the other data when there's an 556 // implicit property with no getter (because the 'foo' -> 'setFoo:' 557 // transformation is lossy on the first character). 558 559 SourceLocation IdLoc; 560 561 /// \brief When the receiver in property access is 'super', this is 562 /// the location of the 'super' keyword. When it's an interface, 563 /// this is that interface. 564 SourceLocation ReceiverLoc; 565 llvm::PointerUnion3<Stmt*, const Type*, ObjCInterfaceDecl*> Receiver; 566 567 public: 568 ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t, 569 ExprValueKind VK, ExprObjectKind OK, 570 SourceLocation l, Expr *base) 571 : Expr(ObjCPropertyRefExprClass, t, VK, OK, 572 /*TypeDependent=*/false, base->isValueDependent(), 573 base->isInstantiationDependent(), 574 base->containsUnexpandedParameterPack()), 575 PropertyOrGetter(PD, false), SetterAndMethodRefFlags(), 576 IdLoc(l), ReceiverLoc(), Receiver(base) { 577 assert(t->isSpecificPlaceholderType(BuiltinType::PseudoObject)); 578 } 579 580 ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t, 581 ExprValueKind VK, ExprObjectKind OK, 582 SourceLocation l, SourceLocation sl, QualType st) 583 : Expr(ObjCPropertyRefExprClass, t, VK, OK, 584 /*TypeDependent=*/false, false, st->isInstantiationDependentType(), 585 st->containsUnexpandedParameterPack()), 586 PropertyOrGetter(PD, false), SetterAndMethodRefFlags(), 587 IdLoc(l), ReceiverLoc(sl), Receiver(st.getTypePtr()) { 588 assert(t->isSpecificPlaceholderType(BuiltinType::PseudoObject)); 589 } 590 591 ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter, 592 QualType T, ExprValueKind VK, ExprObjectKind OK, 593 SourceLocation IdLoc, Expr *Base) 594 : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, 595 Base->isValueDependent(), Base->isInstantiationDependent(), 596 Base->containsUnexpandedParameterPack()), 597 PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0), 598 IdLoc(IdLoc), ReceiverLoc(), Receiver(Base) { 599 assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject)); 600 } 601 602 ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter, 603 QualType T, ExprValueKind VK, ExprObjectKind OK, 604 SourceLocation IdLoc, 605 SourceLocation SuperLoc, QualType SuperTy) 606 : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false), 607 PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0), 608 IdLoc(IdLoc), ReceiverLoc(SuperLoc), Receiver(SuperTy.getTypePtr()) { 609 assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject)); 610 } 611 612 ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter, 613 QualType T, ExprValueKind VK, ExprObjectKind OK, 614 SourceLocation IdLoc, 615 SourceLocation ReceiverLoc, ObjCInterfaceDecl *Receiver) 616 : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false), 617 PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0), 618 IdLoc(IdLoc), ReceiverLoc(ReceiverLoc), Receiver(Receiver) { 619 assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject)); 620 } 621 622 explicit ObjCPropertyRefExpr(EmptyShell Empty) 623 : Expr(ObjCPropertyRefExprClass, Empty) {} 624 625 bool isImplicitProperty() const { return PropertyOrGetter.getInt(); } 626 bool isExplicitProperty() const { return !PropertyOrGetter.getInt(); } 627 628 ObjCPropertyDecl *getExplicitProperty() const { 629 assert(!isImplicitProperty()); 630 return cast<ObjCPropertyDecl>(PropertyOrGetter.getPointer()); 631 } 632 633 ObjCMethodDecl *getImplicitPropertyGetter() const { 634 assert(isImplicitProperty()); 635 return cast_or_null<ObjCMethodDecl>(PropertyOrGetter.getPointer()); 636 } 637 638 ObjCMethodDecl *getImplicitPropertySetter() const { 639 assert(isImplicitProperty()); 640 return SetterAndMethodRefFlags.getPointer(); 641 } 642 643 Selector getGetterSelector() const { 644 if (isImplicitProperty()) 645 return getImplicitPropertyGetter()->getSelector(); 646 return getExplicitProperty()->getGetterName(); 647 } 648 649 Selector getSetterSelector() const { 650 if (isImplicitProperty()) 651 return getImplicitPropertySetter()->getSelector(); 652 return getExplicitProperty()->getSetterName(); 653 } 654 655 /// \brief True if the property reference will result in a message to the 656 /// getter. 657 /// This applies to both implicit and explicit property references. 658 bool isMessagingGetter() const { 659 return SetterAndMethodRefFlags.getInt() & MethodRef_Getter; 660 } 661 662 /// \brief True if the property reference will result in a message to the 663 /// setter. 664 /// This applies to both implicit and explicit property references. 665 bool isMessagingSetter() const { 666 return SetterAndMethodRefFlags.getInt() & MethodRef_Setter; 667 } 668 669 void setIsMessagingGetter(bool val = true) { 670 setMethodRefFlag(MethodRef_Getter, val); 671 } 672 673 void setIsMessagingSetter(bool val = true) { 674 setMethodRefFlag(MethodRef_Setter, val); 675 } 676 677 const Expr *getBase() const { 678 return cast<Expr>(Receiver.get<Stmt*>()); 679 } 680 Expr *getBase() { 681 return cast<Expr>(Receiver.get<Stmt*>()); 682 } 683 684 SourceLocation getLocation() const { return IdLoc; } 685 686 SourceLocation getReceiverLocation() const { return ReceiverLoc; } 687 QualType getSuperReceiverType() const { 688 return QualType(Receiver.get<const Type*>(), 0); 689 } 690 QualType getGetterResultType() const { 691 QualType ResultType; 692 if (isExplicitProperty()) { 693 const ObjCPropertyDecl *PDecl = getExplicitProperty(); 694 if (const ObjCMethodDecl *Getter = PDecl->getGetterMethodDecl()) 695 ResultType = Getter->getReturnType(); 696 else 697 ResultType = PDecl->getType(); 698 } else { 699 const ObjCMethodDecl *Getter = getImplicitPropertyGetter(); 700 if (Getter) 701 ResultType = Getter->getReturnType(); // with reference! 702 } 703 return ResultType; 704 } 705 706 QualType getSetterArgType() const { 707 QualType ArgType; 708 if (isImplicitProperty()) { 709 const ObjCMethodDecl *Setter = getImplicitPropertySetter(); 710 ObjCMethodDecl::param_const_iterator P = Setter->param_begin(); 711 ArgType = (*P)->getType(); 712 } else { 713 if (ObjCPropertyDecl *PDecl = getExplicitProperty()) 714 if (const ObjCMethodDecl *Setter = PDecl->getSetterMethodDecl()) { 715 ObjCMethodDecl::param_const_iterator P = Setter->param_begin(); 716 ArgType = (*P)->getType(); 717 } 718 if (ArgType.isNull()) 719 ArgType = getType(); 720 } 721 return ArgType; 722 } 723 724 ObjCInterfaceDecl *getClassReceiver() const { 725 return Receiver.get<ObjCInterfaceDecl*>(); 726 } 727 bool isObjectReceiver() const { return Receiver.is<Stmt*>(); } 728 bool isSuperReceiver() const { return Receiver.is<const Type*>(); } 729 bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); } 730 731 SourceLocation getLocStart() const LLVM_READONLY { 732 return isObjectReceiver() ? getBase()->getLocStart() :getReceiverLocation(); 733 } 734 SourceLocation getLocEnd() const LLVM_READONLY { return IdLoc; } 735 736 static bool classof(const Stmt *T) { 737 return T->getStmtClass() == ObjCPropertyRefExprClass; 738 } 739 740 // Iterators 741 child_range children() { 742 if (Receiver.is<Stmt*>()) { 743 Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack! 744 return child_range(begin, begin+1); 745 } 746 return child_range(); 747 } 748 749 private: 750 friend class ASTStmtReader; 751 friend class ASTStmtWriter; 752 void setExplicitProperty(ObjCPropertyDecl *D, unsigned methRefFlags) { 753 PropertyOrGetter.setPointer(D); 754 PropertyOrGetter.setInt(false); 755 SetterAndMethodRefFlags.setPointer(nullptr); 756 SetterAndMethodRefFlags.setInt(methRefFlags); 757 } 758 void setImplicitProperty(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter, 759 unsigned methRefFlags) { 760 PropertyOrGetter.setPointer(Getter); 761 PropertyOrGetter.setInt(true); 762 SetterAndMethodRefFlags.setPointer(Setter); 763 SetterAndMethodRefFlags.setInt(methRefFlags); 764 } 765 void setBase(Expr *Base) { Receiver = Base; } 766 void setSuperReceiver(QualType T) { Receiver = T.getTypePtr(); } 767 void setClassReceiver(ObjCInterfaceDecl *D) { Receiver = D; } 768 769 void setLocation(SourceLocation L) { IdLoc = L; } 770 void setReceiverLocation(SourceLocation Loc) { ReceiverLoc = Loc; } 771 772 void setMethodRefFlag(MethodRefFlags flag, bool val) { 773 unsigned f = SetterAndMethodRefFlags.getInt(); 774 if (val) 775 f |= flag; 776 else 777 f &= ~flag; 778 SetterAndMethodRefFlags.setInt(f); 779 } 780 }; 781 782 /// ObjCSubscriptRefExpr - used for array and dictionary subscripting. 783 /// array[4] = array[3]; dictionary[key] = dictionary[alt_key]; 784 /// 785 class ObjCSubscriptRefExpr : public Expr { 786 // Location of ']' in an indexing expression. 787 SourceLocation RBracket; 788 // array/dictionary base expression. 789 // for arrays, this is a numeric expression. For dictionaries, this is 790 // an objective-c object pointer expression. 791 enum { BASE, KEY, END_EXPR }; 792 Stmt* SubExprs[END_EXPR]; 793 794 ObjCMethodDecl *GetAtIndexMethodDecl; 795 796 // For immutable objects this is null. When ObjCSubscriptRefExpr is to read 797 // an indexed object this is null too. 798 ObjCMethodDecl *SetAtIndexMethodDecl; 799 800 public: 801 802 ObjCSubscriptRefExpr(Expr *base, Expr *key, QualType T, 803 ExprValueKind VK, ExprObjectKind OK, 804 ObjCMethodDecl *getMethod, 805 ObjCMethodDecl *setMethod, SourceLocation RB) 806 : Expr(ObjCSubscriptRefExprClass, T, VK, OK, 807 base->isTypeDependent() || key->isTypeDependent(), 808 base->isValueDependent() || key->isValueDependent(), 809 base->isInstantiationDependent() || key->isInstantiationDependent(), 810 (base->containsUnexpandedParameterPack() || 811 key->containsUnexpandedParameterPack())), 812 RBracket(RB), 813 GetAtIndexMethodDecl(getMethod), 814 SetAtIndexMethodDecl(setMethod) 815 {SubExprs[BASE] = base; SubExprs[KEY] = key;} 816 817 explicit ObjCSubscriptRefExpr(EmptyShell Empty) 818 : Expr(ObjCSubscriptRefExprClass, Empty) {} 819 820 static ObjCSubscriptRefExpr *Create(const ASTContext &C, 821 Expr *base, 822 Expr *key, QualType T, 823 ObjCMethodDecl *getMethod, 824 ObjCMethodDecl *setMethod, 825 SourceLocation RB); 826 827 SourceLocation getRBracket() const { return RBracket; } 828 void setRBracket(SourceLocation RB) { RBracket = RB; } 829 830 SourceLocation getLocStart() const LLVM_READONLY { 831 return SubExprs[BASE]->getLocStart(); 832 } 833 SourceLocation getLocEnd() const LLVM_READONLY { return RBracket; } 834 835 static bool classof(const Stmt *T) { 836 return T->getStmtClass() == ObjCSubscriptRefExprClass; 837 } 838 839 Expr *getBaseExpr() const { return cast<Expr>(SubExprs[BASE]); } 840 void setBaseExpr(Stmt *S) { SubExprs[BASE] = S; } 841 842 Expr *getKeyExpr() const { return cast<Expr>(SubExprs[KEY]); } 843 void setKeyExpr(Stmt *S) { SubExprs[KEY] = S; } 844 845 ObjCMethodDecl *getAtIndexMethodDecl() const { 846 return GetAtIndexMethodDecl; 847 } 848 849 ObjCMethodDecl *setAtIndexMethodDecl() const { 850 return SetAtIndexMethodDecl; 851 } 852 853 bool isArraySubscriptRefExpr() const { 854 return getKeyExpr()->getType()->isIntegralOrEnumerationType(); 855 } 856 857 child_range children() { 858 return child_range(SubExprs, SubExprs+END_EXPR); 859 } 860 private: 861 friend class ASTStmtReader; 862 }; 863 864 865 /// \brief An expression that sends a message to the given Objective-C 866 /// object or class. 867 /// 868 /// The following contains two message send expressions: 869 /// 870 /// \code 871 /// [[NSString alloc] initWithString:@"Hello"] 872 /// \endcode 873 /// 874 /// The innermost message send invokes the "alloc" class method on the 875 /// NSString class, while the outermost message send invokes the 876 /// "initWithString" instance method on the object returned from 877 /// NSString's "alloc". In all, an Objective-C message send can take 878 /// on four different (although related) forms: 879 /// 880 /// 1. Send to an object instance. 881 /// 2. Send to a class. 882 /// 3. Send to the superclass instance of the current class. 883 /// 4. Send to the superclass of the current class. 884 /// 885 /// All four kinds of message sends are modeled by the ObjCMessageExpr 886 /// class, and can be distinguished via \c getReceiverKind(). Example: 887 /// 888 class ObjCMessageExpr : public Expr { 889 /// \brief Stores either the selector that this message is sending 890 /// to (when \c HasMethod is zero) or an \c ObjCMethodDecl pointer 891 /// referring to the method that we type-checked against. 892 uintptr_t SelectorOrMethod; 893 894 enum { NumArgsBitWidth = 16 }; 895 896 /// \brief The number of arguments in the message send, not 897 /// including the receiver. 898 unsigned NumArgs : NumArgsBitWidth; 899 900 void setNumArgs(unsigned Num) { 901 assert((Num >> NumArgsBitWidth) == 0 && "Num of args is out of range!"); 902 NumArgs = Num; 903 } 904 905 /// \brief The kind of message send this is, which is one of the 906 /// ReceiverKind values. 907 /// 908 /// We pad this out to a byte to avoid excessive masking and shifting. 909 unsigned Kind : 8; 910 911 /// \brief Whether we have an actual method prototype in \c 912 /// SelectorOrMethod. 913 /// 914 /// When non-zero, we have a method declaration; otherwise, we just 915 /// have a selector. 916 unsigned HasMethod : 1; 917 918 /// \brief Whether this message send is a "delegate init call", 919 /// i.e. a call of an init method on self from within an init method. 920 unsigned IsDelegateInitCall : 1; 921 922 /// \brief Whether this message send was implicitly generated by 923 /// the implementation rather than explicitly written by the user. 924 unsigned IsImplicit : 1; 925 926 /// \brief Whether the locations of the selector identifiers are in a 927 /// "standard" position, a enum SelectorLocationsKind. 928 unsigned SelLocsKind : 2; 929 930 /// \brief When the message expression is a send to 'super', this is 931 /// the location of the 'super' keyword. 932 SourceLocation SuperLoc; 933 934 /// \brief The source locations of the open and close square 935 /// brackets ('[' and ']', respectively). 936 SourceLocation LBracLoc, RBracLoc; 937 938 ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs) 939 : Expr(ObjCMessageExprClass, Empty), SelectorOrMethod(0), Kind(0), 940 HasMethod(0), IsDelegateInitCall(0), IsImplicit(0), SelLocsKind(0) { 941 setNumArgs(NumArgs); 942 } 943 944 ObjCMessageExpr(QualType T, ExprValueKind VK, 945 SourceLocation LBracLoc, 946 SourceLocation SuperLoc, 947 bool IsInstanceSuper, 948 QualType SuperType, 949 Selector Sel, 950 ArrayRef<SourceLocation> SelLocs, 951 SelectorLocationsKind SelLocsK, 952 ObjCMethodDecl *Method, 953 ArrayRef<Expr *> Args, 954 SourceLocation RBracLoc, 955 bool isImplicit); 956 ObjCMessageExpr(QualType T, ExprValueKind VK, 957 SourceLocation LBracLoc, 958 TypeSourceInfo *Receiver, 959 Selector Sel, 960 ArrayRef<SourceLocation> SelLocs, 961 SelectorLocationsKind SelLocsK, 962 ObjCMethodDecl *Method, 963 ArrayRef<Expr *> Args, 964 SourceLocation RBracLoc, 965 bool isImplicit); 966 ObjCMessageExpr(QualType T, ExprValueKind VK, 967 SourceLocation LBracLoc, 968 Expr *Receiver, 969 Selector Sel, 970 ArrayRef<SourceLocation> SelLocs, 971 SelectorLocationsKind SelLocsK, 972 ObjCMethodDecl *Method, 973 ArrayRef<Expr *> Args, 974 SourceLocation RBracLoc, 975 bool isImplicit); 976 977 void initArgsAndSelLocs(ArrayRef<Expr *> Args, 978 ArrayRef<SourceLocation> SelLocs, 979 SelectorLocationsKind SelLocsK); 980 981 /// \brief Retrieve the pointer value of the message receiver. 982 void *getReceiverPointer() const { 983 return *const_cast<void **>( 984 reinterpret_cast<const void * const*>(this + 1)); 985 } 986 987 /// \brief Set the pointer value of the message receiver. 988 void setReceiverPointer(void *Value) { 989 *reinterpret_cast<void **>(this + 1) = Value; 990 } 991 992 SelectorLocationsKind getSelLocsKind() const { 993 return (SelectorLocationsKind)SelLocsKind; 994 } 995 bool hasStandardSelLocs() const { 996 return getSelLocsKind() != SelLoc_NonStandard; 997 } 998 999 /// \brief Get a pointer to the stored selector identifiers locations array. 1000 /// No locations will be stored if HasStandardSelLocs is true. 1001 SourceLocation *getStoredSelLocs() { 1002 return reinterpret_cast<SourceLocation*>(getArgs() + getNumArgs()); 1003 } 1004 const SourceLocation *getStoredSelLocs() const { 1005 return reinterpret_cast<const SourceLocation*>(getArgs() + getNumArgs()); 1006 } 1007 1008 /// \brief Get the number of stored selector identifiers locations. 1009 /// No locations will be stored if HasStandardSelLocs is true. 1010 unsigned getNumStoredSelLocs() const { 1011 if (hasStandardSelLocs()) 1012 return 0; 1013 return getNumSelectorLocs(); 1014 } 1015 1016 static ObjCMessageExpr *alloc(const ASTContext &C, 1017 ArrayRef<Expr *> Args, 1018 SourceLocation RBraceLoc, 1019 ArrayRef<SourceLocation> SelLocs, 1020 Selector Sel, 1021 SelectorLocationsKind &SelLocsK); 1022 static ObjCMessageExpr *alloc(const ASTContext &C, 1023 unsigned NumArgs, 1024 unsigned NumStoredSelLocs); 1025 1026 public: 1027 /// \brief The kind of receiver this message is sending to. 1028 enum ReceiverKind { 1029 /// \brief The receiver is a class. 1030 Class = 0, 1031 /// \brief The receiver is an object instance. 1032 Instance, 1033 /// \brief The receiver is a superclass. 1034 SuperClass, 1035 /// \brief The receiver is the instance of the superclass object. 1036 SuperInstance 1037 }; 1038 1039 /// \brief Create a message send to super. 1040 /// 1041 /// \param Context The ASTContext in which this expression will be created. 1042 /// 1043 /// \param T The result type of this message. 1044 /// 1045 /// \param VK The value kind of this message. A message returning 1046 /// a l-value or r-value reference will be an l-value or x-value, 1047 /// respectively. 1048 /// 1049 /// \param LBracLoc The location of the open square bracket '['. 1050 /// 1051 /// \param SuperLoc The location of the "super" keyword. 1052 /// 1053 /// \param IsInstanceSuper Whether this is an instance "super" 1054 /// message (otherwise, it's a class "super" message). 1055 /// 1056 /// \param Sel The selector used to determine which method gets called. 1057 /// 1058 /// \param Method The Objective-C method against which this message 1059 /// send was type-checked. May be NULL. 1060 /// 1061 /// \param Args The message send arguments. 1062 /// 1063 /// \param RBracLoc The location of the closing square bracket ']'. 1064 static ObjCMessageExpr *Create(const ASTContext &Context, QualType T, 1065 ExprValueKind VK, 1066 SourceLocation LBracLoc, 1067 SourceLocation SuperLoc, 1068 bool IsInstanceSuper, 1069 QualType SuperType, 1070 Selector Sel, 1071 ArrayRef<SourceLocation> SelLocs, 1072 ObjCMethodDecl *Method, 1073 ArrayRef<Expr *> Args, 1074 SourceLocation RBracLoc, 1075 bool isImplicit); 1076 1077 /// \brief Create a class message send. 1078 /// 1079 /// \param Context The ASTContext in which this expression will be created. 1080 /// 1081 /// \param T The result type of this message. 1082 /// 1083 /// \param VK The value kind of this message. A message returning 1084 /// a l-value or r-value reference will be an l-value or x-value, 1085 /// respectively. 1086 /// 1087 /// \param LBracLoc The location of the open square bracket '['. 1088 /// 1089 /// \param Receiver The type of the receiver, including 1090 /// source-location information. 1091 /// 1092 /// \param Sel The selector used to determine which method gets called. 1093 /// 1094 /// \param Method The Objective-C method against which this message 1095 /// send was type-checked. May be NULL. 1096 /// 1097 /// \param Args The message send arguments. 1098 /// 1099 /// \param RBracLoc The location of the closing square bracket ']'. 1100 static ObjCMessageExpr *Create(const ASTContext &Context, QualType T, 1101 ExprValueKind VK, 1102 SourceLocation LBracLoc, 1103 TypeSourceInfo *Receiver, 1104 Selector Sel, 1105 ArrayRef<SourceLocation> SelLocs, 1106 ObjCMethodDecl *Method, 1107 ArrayRef<Expr *> Args, 1108 SourceLocation RBracLoc, 1109 bool isImplicit); 1110 1111 /// \brief Create an instance message send. 1112 /// 1113 /// \param Context The ASTContext in which this expression will be created. 1114 /// 1115 /// \param T The result type of this message. 1116 /// 1117 /// \param VK The value kind of this message. A message returning 1118 /// a l-value or r-value reference will be an l-value or x-value, 1119 /// respectively. 1120 /// 1121 /// \param LBracLoc The location of the open square bracket '['. 1122 /// 1123 /// \param Receiver The expression used to produce the object that 1124 /// will receive this message. 1125 /// 1126 /// \param Sel The selector used to determine which method gets called. 1127 /// 1128 /// \param Method The Objective-C method against which this message 1129 /// send was type-checked. May be NULL. 1130 /// 1131 /// \param Args The message send arguments. 1132 /// 1133 /// \param RBracLoc The location of the closing square bracket ']'. 1134 static ObjCMessageExpr *Create(const ASTContext &Context, QualType T, 1135 ExprValueKind VK, 1136 SourceLocation LBracLoc, 1137 Expr *Receiver, 1138 Selector Sel, 1139 ArrayRef<SourceLocation> SeLocs, 1140 ObjCMethodDecl *Method, 1141 ArrayRef<Expr *> Args, 1142 SourceLocation RBracLoc, 1143 bool isImplicit); 1144 1145 /// \brief Create an empty Objective-C message expression, to be 1146 /// filled in by subsequent calls. 1147 /// 1148 /// \param Context The context in which the message send will be created. 1149 /// 1150 /// \param NumArgs The number of message arguments, not including 1151 /// the receiver. 1152 static ObjCMessageExpr *CreateEmpty(const ASTContext &Context, 1153 unsigned NumArgs, 1154 unsigned NumStoredSelLocs); 1155 1156 /// \brief Indicates whether the message send was implicitly 1157 /// generated by the implementation. If false, it was written explicitly 1158 /// in the source code. 1159 bool isImplicit() const { return IsImplicit; } 1160 1161 /// \brief Determine the kind of receiver that this message is being 1162 /// sent to. 1163 ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; } 1164 1165 /// \brief Source range of the receiver. 1166 SourceRange getReceiverRange() const; 1167 1168 /// \brief Determine whether this is an instance message to either a 1169 /// computed object or to super. 1170 bool isInstanceMessage() const { 1171 return getReceiverKind() == Instance || getReceiverKind() == SuperInstance; 1172 } 1173 1174 /// \brief Determine whether this is an class message to either a 1175 /// specified class or to super. 1176 bool isClassMessage() const { 1177 return getReceiverKind() == Class || getReceiverKind() == SuperClass; 1178 } 1179 1180 /// \brief Returns the object expression (receiver) for an instance message, 1181 /// or null for a message that is not an instance message. 1182 Expr *getInstanceReceiver() { 1183 if (getReceiverKind() == Instance) 1184 return static_cast<Expr *>(getReceiverPointer()); 1185 1186 return nullptr; 1187 } 1188 const Expr *getInstanceReceiver() const { 1189 return const_cast<ObjCMessageExpr*>(this)->getInstanceReceiver(); 1190 } 1191 1192 /// \brief Turn this message send into an instance message that 1193 /// computes the receiver object with the given expression. 1194 void setInstanceReceiver(Expr *rec) { 1195 Kind = Instance; 1196 setReceiverPointer(rec); 1197 } 1198 1199 /// \brief Returns the type of a class message send, or NULL if the 1200 /// message is not a class message. 1201 QualType getClassReceiver() const { 1202 if (TypeSourceInfo *TSInfo = getClassReceiverTypeInfo()) 1203 return TSInfo->getType(); 1204 1205 return QualType(); 1206 } 1207 1208 /// \brief Returns a type-source information of a class message 1209 /// send, or NULL if the message is not a class message. 1210 TypeSourceInfo *getClassReceiverTypeInfo() const { 1211 if (getReceiverKind() == Class) 1212 return reinterpret_cast<TypeSourceInfo *>(getReceiverPointer()); 1213 return nullptr; 1214 } 1215 1216 void setClassReceiver(TypeSourceInfo *TSInfo) { 1217 Kind = Class; 1218 setReceiverPointer(TSInfo); 1219 } 1220 1221 /// \brief Retrieve the location of the 'super' keyword for a class 1222 /// or instance message to 'super', otherwise an invalid source location. 1223 SourceLocation getSuperLoc() const { 1224 if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass) 1225 return SuperLoc; 1226 1227 return SourceLocation(); 1228 } 1229 1230 /// \brief Retrieve the receiver type to which this message is being directed. 1231 /// 1232 /// This routine cross-cuts all of the different kinds of message 1233 /// sends to determine what the underlying (statically known) type 1234 /// of the receiver will be; use \c getReceiverKind() to determine 1235 /// whether the message is a class or an instance method, whether it 1236 /// is a send to super or not, etc. 1237 /// 1238 /// \returns The type of the receiver. 1239 QualType getReceiverType() const; 1240 1241 /// \brief Retrieve the Objective-C interface to which this message 1242 /// is being directed, if known. 1243 /// 1244 /// This routine cross-cuts all of the different kinds of message 1245 /// sends to determine what the underlying (statically known) type 1246 /// of the receiver will be; use \c getReceiverKind() to determine 1247 /// whether the message is a class or an instance method, whether it 1248 /// is a send to super or not, etc. 1249 /// 1250 /// \returns The Objective-C interface if known, otherwise NULL. 1251 ObjCInterfaceDecl *getReceiverInterface() const; 1252 1253 /// \brief Retrieve the type referred to by 'super'. 1254 /// 1255 /// The returned type will either be an ObjCInterfaceType (for an 1256 /// class message to super) or an ObjCObjectPointerType that refers 1257 /// to a class (for an instance message to super); 1258 QualType getSuperType() const { 1259 if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass) 1260 return QualType::getFromOpaquePtr(getReceiverPointer()); 1261 1262 return QualType(); 1263 } 1264 1265 void setSuper(SourceLocation Loc, QualType T, bool IsInstanceSuper) { 1266 Kind = IsInstanceSuper? SuperInstance : SuperClass; 1267 SuperLoc = Loc; 1268 setReceiverPointer(T.getAsOpaquePtr()); 1269 } 1270 1271 Selector getSelector() const; 1272 1273 void setSelector(Selector S) { 1274 HasMethod = false; 1275 SelectorOrMethod = reinterpret_cast<uintptr_t>(S.getAsOpaquePtr()); 1276 } 1277 1278 const ObjCMethodDecl *getMethodDecl() const { 1279 if (HasMethod) 1280 return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod); 1281 1282 return nullptr; 1283 } 1284 1285 ObjCMethodDecl *getMethodDecl() { 1286 if (HasMethod) 1287 return reinterpret_cast<ObjCMethodDecl *>(SelectorOrMethod); 1288 1289 return nullptr; 1290 } 1291 1292 void setMethodDecl(ObjCMethodDecl *MD) { 1293 HasMethod = true; 1294 SelectorOrMethod = reinterpret_cast<uintptr_t>(MD); 1295 } 1296 1297 ObjCMethodFamily getMethodFamily() const { 1298 if (HasMethod) return getMethodDecl()->getMethodFamily(); 1299 return getSelector().getMethodFamily(); 1300 } 1301 1302 /// \brief Return the number of actual arguments in this message, 1303 /// not counting the receiver. 1304 unsigned getNumArgs() const { return NumArgs; } 1305 1306 /// \brief Retrieve the arguments to this message, not including the 1307 /// receiver. 1308 Expr **getArgs() { 1309 return reinterpret_cast<Expr **>(this + 1) + 1; 1310 } 1311 const Expr * const *getArgs() const { 1312 return reinterpret_cast<const Expr * const *>(this + 1) + 1; 1313 } 1314 1315 /// getArg - Return the specified argument. 1316 Expr *getArg(unsigned Arg) { 1317 assert(Arg < NumArgs && "Arg access out of range!"); 1318 return cast<Expr>(getArgs()[Arg]); 1319 } 1320 const Expr *getArg(unsigned Arg) const { 1321 assert(Arg < NumArgs && "Arg access out of range!"); 1322 return cast<Expr>(getArgs()[Arg]); 1323 } 1324 /// setArg - Set the specified argument. 1325 void setArg(unsigned Arg, Expr *ArgExpr) { 1326 assert(Arg < NumArgs && "Arg access out of range!"); 1327 getArgs()[Arg] = ArgExpr; 1328 } 1329 1330 /// isDelegateInitCall - Answers whether this message send has been 1331 /// tagged as a "delegate init call", i.e. a call to a method in the 1332 /// -init family on self from within an -init method implementation. 1333 bool isDelegateInitCall() const { return IsDelegateInitCall; } 1334 void setDelegateInitCall(bool isDelegate) { IsDelegateInitCall = isDelegate; } 1335 1336 SourceLocation getLeftLoc() const { return LBracLoc; } 1337 SourceLocation getRightLoc() const { return RBracLoc; } 1338 1339 SourceLocation getSelectorStartLoc() const { 1340 if (isImplicit()) 1341 return getLocStart(); 1342 return getSelectorLoc(0); 1343 } 1344 SourceLocation getSelectorLoc(unsigned Index) const { 1345 assert(Index < getNumSelectorLocs() && "Index out of range!"); 1346 if (hasStandardSelLocs()) 1347 return getStandardSelectorLoc(Index, getSelector(), 1348 getSelLocsKind() == SelLoc_StandardWithSpace, 1349 llvm::makeArrayRef(const_cast<Expr**>(getArgs()), 1350 getNumArgs()), 1351 RBracLoc); 1352 return getStoredSelLocs()[Index]; 1353 } 1354 1355 void getSelectorLocs(SmallVectorImpl<SourceLocation> &SelLocs) const; 1356 1357 unsigned getNumSelectorLocs() const { 1358 if (isImplicit()) 1359 return 0; 1360 Selector Sel = getSelector(); 1361 if (Sel.isUnarySelector()) 1362 return 1; 1363 return Sel.getNumArgs(); 1364 } 1365 1366 void setSourceRange(SourceRange R) { 1367 LBracLoc = R.getBegin(); 1368 RBracLoc = R.getEnd(); 1369 } 1370 SourceLocation getLocStart() const LLVM_READONLY { return LBracLoc; } 1371 SourceLocation getLocEnd() const LLVM_READONLY { return RBracLoc; } 1372 1373 static bool classof(const Stmt *T) { 1374 return T->getStmtClass() == ObjCMessageExprClass; 1375 } 1376 1377 // Iterators 1378 child_range children(); 1379 1380 typedef ExprIterator arg_iterator; 1381 typedef ConstExprIterator const_arg_iterator; 1382 1383 arg_iterator arg_begin() { return reinterpret_cast<Stmt **>(getArgs()); } 1384 arg_iterator arg_end() { 1385 return reinterpret_cast<Stmt **>(getArgs() + NumArgs); 1386 } 1387 const_arg_iterator arg_begin() const { 1388 return reinterpret_cast<Stmt const * const*>(getArgs()); 1389 } 1390 const_arg_iterator arg_end() const { 1391 return reinterpret_cast<Stmt const * const*>(getArgs() + NumArgs); 1392 } 1393 1394 friend class ASTStmtReader; 1395 friend class ASTStmtWriter; 1396 }; 1397 1398 /// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type. 1399 /// (similar in spirit to MemberExpr). 1400 class ObjCIsaExpr : public Expr { 1401 /// Base - the expression for the base object pointer. 1402 Stmt *Base; 1403 1404 /// IsaMemberLoc - This is the location of the 'isa'. 1405 SourceLocation IsaMemberLoc; 1406 1407 /// OpLoc - This is the location of '.' or '->' 1408 SourceLocation OpLoc; 1409 1410 /// IsArrow - True if this is "X->F", false if this is "X.F". 1411 bool IsArrow; 1412 public: 1413 ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, SourceLocation oploc, 1414 QualType ty) 1415 : Expr(ObjCIsaExprClass, ty, VK_LValue, OK_Ordinary, 1416 /*TypeDependent=*/false, base->isValueDependent(), 1417 base->isInstantiationDependent(), 1418 /*ContainsUnexpandedParameterPack=*/false), 1419 Base(base), IsaMemberLoc(l), OpLoc(oploc), IsArrow(isarrow) {} 1420 1421 /// \brief Build an empty expression. 1422 explicit ObjCIsaExpr(EmptyShell Empty) : Expr(ObjCIsaExprClass, Empty) { } 1423 1424 void setBase(Expr *E) { Base = E; } 1425 Expr *getBase() const { return cast<Expr>(Base); } 1426 1427 bool isArrow() const { return IsArrow; } 1428 void setArrow(bool A) { IsArrow = A; } 1429 1430 /// getMemberLoc - Return the location of the "member", in X->F, it is the 1431 /// location of 'F'. 1432 SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; } 1433 void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; } 1434 1435 SourceLocation getOpLoc() const { return OpLoc; } 1436 void setOpLoc(SourceLocation L) { OpLoc = L; } 1437 1438 SourceLocation getLocStart() const LLVM_READONLY { 1439 return getBase()->getLocStart(); 1440 } 1441 1442 SourceLocation getBaseLocEnd() const LLVM_READONLY { 1443 return getBase()->getLocEnd(); 1444 } 1445 1446 SourceLocation getLocEnd() const LLVM_READONLY { return IsaMemberLoc; } 1447 1448 SourceLocation getExprLoc() const LLVM_READONLY { return IsaMemberLoc; } 1449 1450 static bool classof(const Stmt *T) { 1451 return T->getStmtClass() == ObjCIsaExprClass; 1452 } 1453 1454 // Iterators 1455 child_range children() { return child_range(&Base, &Base+1); } 1456 }; 1457 1458 1459 /// ObjCIndirectCopyRestoreExpr - Represents the passing of a function 1460 /// argument by indirect copy-restore in ARC. This is used to support 1461 /// passing indirect arguments with the wrong lifetime, e.g. when 1462 /// passing the address of a __strong local variable to an 'out' 1463 /// parameter. This expression kind is only valid in an "argument" 1464 /// position to some sort of call expression. 1465 /// 1466 /// The parameter must have type 'pointer to T', and the argument must 1467 /// have type 'pointer to U', where T and U agree except possibly in 1468 /// qualification. If the argument value is null, then a null pointer 1469 /// is passed; otherwise it points to an object A, and: 1470 /// 1. A temporary object B of type T is initialized, either by 1471 /// zero-initialization (used when initializing an 'out' parameter) 1472 /// or copy-initialization (used when initializing an 'inout' 1473 /// parameter). 1474 /// 2. The address of the temporary is passed to the function. 1475 /// 3. If the call completes normally, A is move-assigned from B. 1476 /// 4. Finally, A is destroyed immediately. 1477 /// 1478 /// Currently 'T' must be a retainable object lifetime and must be 1479 /// __autoreleasing; this qualifier is ignored when initializing 1480 /// the value. 1481 class ObjCIndirectCopyRestoreExpr : public Expr { 1482 Stmt *Operand; 1483 1484 // unsigned ObjCIndirectCopyRestoreBits.ShouldCopy : 1; 1485 1486 friend class ASTReader; 1487 friend class ASTStmtReader; 1488 1489 void setShouldCopy(bool shouldCopy) { 1490 ObjCIndirectCopyRestoreExprBits.ShouldCopy = shouldCopy; 1491 } 1492 1493 explicit ObjCIndirectCopyRestoreExpr(EmptyShell Empty) 1494 : Expr(ObjCIndirectCopyRestoreExprClass, Empty) { } 1495 1496 public: 1497 ObjCIndirectCopyRestoreExpr(Expr *operand, QualType type, bool shouldCopy) 1498 : Expr(ObjCIndirectCopyRestoreExprClass, type, VK_LValue, OK_Ordinary, 1499 operand->isTypeDependent(), operand->isValueDependent(), 1500 operand->isInstantiationDependent(), 1501 operand->containsUnexpandedParameterPack()), 1502 Operand(operand) { 1503 setShouldCopy(shouldCopy); 1504 } 1505 1506 Expr *getSubExpr() { return cast<Expr>(Operand); } 1507 const Expr *getSubExpr() const { return cast<Expr>(Operand); } 1508 1509 /// shouldCopy - True if we should do the 'copy' part of the 1510 /// copy-restore. If false, the temporary will be zero-initialized. 1511 bool shouldCopy() const { return ObjCIndirectCopyRestoreExprBits.ShouldCopy; } 1512 1513 child_range children() { return child_range(&Operand, &Operand+1); } 1514 1515 // Source locations are determined by the subexpression. 1516 SourceLocation getLocStart() const LLVM_READONLY { 1517 return Operand->getLocStart(); 1518 } 1519 SourceLocation getLocEnd() const LLVM_READONLY { return Operand->getLocEnd();} 1520 1521 SourceLocation getExprLoc() const LLVM_READONLY { 1522 return getSubExpr()->getExprLoc(); 1523 } 1524 1525 static bool classof(const Stmt *s) { 1526 return s->getStmtClass() == ObjCIndirectCopyRestoreExprClass; 1527 } 1528 }; 1529 1530 /// \brief An Objective-C "bridged" cast expression, which casts between 1531 /// Objective-C pointers and C pointers, transferring ownership in the process. 1532 /// 1533 /// \code 1534 /// NSString *str = (__bridge_transfer NSString *)CFCreateString(); 1535 /// \endcode 1536 class ObjCBridgedCastExpr : public ExplicitCastExpr { 1537 SourceLocation LParenLoc; 1538 SourceLocation BridgeKeywordLoc; 1539 unsigned Kind : 2; 1540 1541 friend class ASTStmtReader; 1542 friend class ASTStmtWriter; 1543 1544 public: 1545 ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, 1546 CastKind CK, SourceLocation BridgeKeywordLoc, 1547 TypeSourceInfo *TSInfo, Expr *Operand) 1548 : ExplicitCastExpr(ObjCBridgedCastExprClass, TSInfo->getType(), VK_RValue, 1549 CK, Operand, 0, TSInfo), 1550 LParenLoc(LParenLoc), BridgeKeywordLoc(BridgeKeywordLoc), Kind(Kind) { } 1551 1552 /// \brief Construct an empty Objective-C bridged cast. 1553 explicit ObjCBridgedCastExpr(EmptyShell Shell) 1554 : ExplicitCastExpr(ObjCBridgedCastExprClass, Shell, 0) { } 1555 1556 SourceLocation getLParenLoc() const { return LParenLoc; } 1557 1558 /// \brief Determine which kind of bridge is being performed via this cast. 1559 ObjCBridgeCastKind getBridgeKind() const { 1560 return static_cast<ObjCBridgeCastKind>(Kind); 1561 } 1562 1563 /// \brief Retrieve the kind of bridge being performed as a string. 1564 StringRef getBridgeKindName() const; 1565 1566 /// \brief The location of the bridge keyword. 1567 SourceLocation getBridgeKeywordLoc() const { return BridgeKeywordLoc; } 1568 1569 SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; } 1570 SourceLocation getLocEnd() const LLVM_READONLY { 1571 return getSubExpr()->getLocEnd(); 1572 } 1573 1574 static bool classof(const Stmt *T) { 1575 return T->getStmtClass() == ObjCBridgedCastExprClass; 1576 } 1577 }; 1578 1579 } // end namespace clang 1580 1581 #endif 1582