ExprObjC.h revision 81d3466d037dc5844234c7a93dab21a6ad986e7d
1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===--- ExprObjC.h - Classes for representing ObjC expressions -*- C++ -*-===// 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// The LLVM Compiler Infrastructure 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file is distributed under the University of Illinois Open Source 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// License. See LICENSE.TXT for details. 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file defines the ExprObjC interface and subclasses. 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifndef LLVM_CLANG_AST_EXPROBJC_H 156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define LLVM_CLANG_AST_EXPROBJC_H 166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Expr.h" 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/IdentifierTable.h" 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace clang { 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class IdentifierInfo; 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class ASTContext; 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class ObjCMethodDecl; 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class ObjCPropertyDecl; 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// ObjCStringLiteral, used for Objective-C string literals 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// i.e. @"foo". 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass ObjCStringLiteral : public Expr { 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stmt *String; 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation AtLoc; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L) 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : Expr(ObjCStringLiteralClass, T, false, false), String(SL), AtLoc(L) {} 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines explicit ObjCStringLiteral(EmptyShell Empty) 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCStringLiteralClass, Empty) {} 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringLiteral *getString() { return cast<StringLiteral>(String); } 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const StringLiteral *getString() const { return cast<StringLiteral>(String); } 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setString(StringLiteral *S) { String = S; } 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getAtLoc() const { return AtLoc; } 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setAtLoc(SourceLocation L) { AtLoc = L; } 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual SourceRange getSourceRange() const { 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return SourceRange(AtLoc, String->getLocEnd()); 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static bool classof(const Stmt *T) { 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return T->getStmtClass() == ObjCStringLiteralClass; 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static bool classof(const ObjCStringLiteral *) { return true; } 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Iterators 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual child_iterator child_begin(); 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual child_iterator child_end(); 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// ObjCEncodeExpr, used for @encode in Objective-C. @encode has the same type 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// and behavior as StringLiteral except that the string initializer is obtained 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// from ASTContext with the encoding type as an argument. 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass ObjCEncodeExpr : public Expr { 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypeSourceInfo *EncodedType; 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation AtLoc, RParenLoc; 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCEncodeExpr(QualType T, TypeSourceInfo *EncodedType, 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation at, SourceLocation rp) 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : Expr(ObjCEncodeExprClass, T, EncodedType->getType()->isDependentType(), 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EncodedType->getType()->isDependentType()), 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {} 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){} 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getAtLoc() const { return AtLoc; } 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setAtLoc(SourceLocation L) { AtLoc = L; } 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getRParenLoc() const { return RParenLoc; } 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setRParenLoc(SourceLocation L) { RParenLoc = L; } 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType getEncodedType() const { return EncodedType->getType(); } 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypeSourceInfo *getEncodedTypeSourceInfo() const { return EncodedType; } 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setEncodedTypeSourceInfo(TypeSourceInfo *EncType) { 836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines EncodedType = EncType; 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual SourceRange getSourceRange() const { 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(AtLoc, RParenLoc); 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static bool classof(const Stmt *T) { 91ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return T->getStmtClass() == ObjCEncodeExprClass; 92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static bool classof(const ObjCEncodeExpr *) { return true; } 94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Iterators 96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual child_iterator child_begin(); 97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual child_iterator child_end(); 98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// ObjCSelectorExpr used for @selector in Objective-C. 101ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass ObjCSelectorExpr : public Expr { 102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Selector SelName; 103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation AtLoc, RParenLoc; 104ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 105ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCSelectorExpr(QualType T, Selector selInfo, 106ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation at, SourceLocation rp) 107ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : Expr(ObjCSelectorExprClass, T, false, false), SelName(selInfo), AtLoc(at), 108ef8225444452a1486bd721f3285301fe84643b00Stephen Hines RParenLoc(rp){} 109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines explicit ObjCSelectorExpr(EmptyShell Empty) 110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : Expr(ObjCSelectorExprClass, Empty) {} 111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Selector getSelector() const { return SelName; } 113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setSelector(Selector S) { SelName = S; } 114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation getAtLoc() const { return AtLoc; } 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getRParenLoc() const { return RParenLoc; } 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setAtLoc(SourceLocation L) { AtLoc = L; } 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setRParenLoc(SourceLocation L) { RParenLoc = L; } 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual SourceRange getSourceRange() const { 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(AtLoc, RParenLoc); 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// getNumArgs - Return the number of actual arguments to this call. 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const { return SelName.getNumArgs(); } 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static bool classof(const Stmt *T) { 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return T->getStmtClass() == ObjCSelectorExprClass; 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static bool classof(const ObjCSelectorExpr *) { return true; } 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Iterators 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual child_iterator child_begin(); 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual child_iterator child_end(); 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// ObjCProtocolExpr used for protocol expression in Objective-C. This is used 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// as: @protocol(foo), as in: 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// obj conformsToProtocol:@protocol(foo)] 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// The return type is "Protocol*". 141ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass ObjCProtocolExpr : public Expr { 142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCProtocolDecl *TheProtocol; 143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation AtLoc, RParenLoc; 144ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol, 146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation at, SourceLocation rp) 147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : Expr(ObjCProtocolExprClass, T, false, false), TheProtocol(protocol), 148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines AtLoc(at), RParenLoc(rp) {} 149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines explicit ObjCProtocolExpr(EmptyShell Empty) 150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : Expr(ObjCProtocolExprClass, Empty) {} 151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCProtocolDecl *getProtocol() const { return TheProtocol; } 1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setProtocol(ObjCProtocolDecl *P) { TheProtocol = P; } 1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation getAtLoc() const { return AtLoc; } 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation getRParenLoc() const { return RParenLoc; } 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setAtLoc(SourceLocation L) { AtLoc = L; } 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual SourceRange getSourceRange() const { 1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(AtLoc, RParenLoc); 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static bool classof(const Stmt *T) { 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return T->getStmtClass() == ObjCProtocolExprClass; 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static bool classof(const ObjCProtocolExpr *) { return true; } 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Iterators 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual child_iterator child_begin(); 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual child_iterator child_end(); 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// ObjCIvarRefExpr - A reference to an ObjC instance variable. 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass ObjCIvarRefExpr : public Expr { 176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines class ObjCIvarDecl *D; 177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation Loc; 178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Stmt *Base; 179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool IsArrow:1; // True if this is "X->F", false if this is "X.F". 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool IsFreeIvar:1; // True if ivar reference has no base (self assumed). 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCIvarRefExpr(ObjCIvarDecl *d, 1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType t, SourceLocation l, Expr *base=0, 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool arrow = false, bool freeIvar = false) : 1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr(ObjCIvarRefExprClass, t, false, false), D(d), 1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Loc(l), Base(base), IsArrow(arrow), 1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsFreeIvar(freeIvar) {} 1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines explicit ObjCIvarRefExpr(EmptyShell Empty) 191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : Expr(ObjCIvarRefExprClass, Empty) {} 192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCIvarDecl *getDecl() { return D; } 194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const ObjCIvarDecl *getDecl() const { return D; } 195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setDecl(ObjCIvarDecl *d) { D = d; } 196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const Expr *getBase() const { return cast<Expr>(Base); } 198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Expr *getBase() { return cast<Expr>(Base); } 199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setBase(Expr * base) { Base = base; } 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool isArrow() const { return IsArrow; } 202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool isFreeIvar() const { return IsFreeIvar; } 203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setIsArrow(bool A) { IsArrow = A; } 204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setIsFreeIvar(bool A) { IsFreeIvar = A; } 205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation getLocation() const { return Loc; } 207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setLocation(SourceLocation L) { Loc = L; } 208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual SourceRange getSourceRange() const { 210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return isFreeIvar() ? SourceRange(Loc) 211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : SourceRange(getBase()->getLocStart(), Loc); 212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static bool classof(const Stmt *T) { 215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return T->getStmtClass() == ObjCIvarRefExprClass; 216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static bool classof(const ObjCIvarRefExpr *) { return true; } 218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Iterators 220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual child_iterator child_begin(); 221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual child_iterator child_end(); 222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC 225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// property. 226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// 227ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass ObjCPropertyRefExpr : public Expr { 228ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesprivate: 229ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ObjCPropertyDecl *AsProperty; 230ef8225444452a1486bd721f3285301fe84643b00Stephen Hines SourceLocation IdLoc; 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *Base; 2326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic: 2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t, 2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation l, Expr *base) 2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCPropertyRefExprClass, t, false, false), AsProperty(PD), 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdLoc(l), Base(base) { 2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines explicit ObjCPropertyRefExpr(EmptyShell Empty) 2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCPropertyRefExprClass, Empty) {} 2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCPropertyDecl *getProperty() const { return AsProperty; } 2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setProperty(ObjCPropertyDecl *D) { AsProperty = D; } 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Expr *getBase() const { return cast<Expr>(Base); } 2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *getBase() { return cast<Expr>(Base); } 2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setBase(Expr *base) { Base = base; } 2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation getLocation() const { return IdLoc; } 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setLocation(SourceLocation L) { IdLoc = L; } 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual SourceRange getSourceRange() const { 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(getBase()->getLocStart(), IdLoc); 2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static bool classof(const Stmt *T) { 2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return T->getStmtClass() == ObjCPropertyRefExprClass; 2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static bool classof(const ObjCPropertyRefExpr *) { return true; } 2606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Iterators 2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual child_iterator child_begin(); 2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual child_iterator child_end(); 2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// ObjCImplicitSetterGetterRefExpr - A dot-syntax expression to access two 2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// methods; one to set a value to an 'ivar' (Setter) and the other to access 2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// an 'ivar' (Setter). 2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// An example for use of this AST is: 2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// @code 2716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// @interface Test { } 2726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// - (Test *)crash; 2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// - (void)setCrash: (Test*)value; 2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// @end 2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// void foo(Test *p1, Test *p2) 2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// { 2776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// p2.crash = p1.crash; // Uses ObjCImplicitSetterGetterRefExpr AST 2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// } 2796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// @endcode 2806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass ObjCImplicitSetterGetterRefExpr : public Expr { 2816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Setter - Setter method user declared for setting its 'ivar' to a value 2826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *Setter; 2836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Getter - Getter method user declared for accessing 'ivar' it controls. 2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *Getter; 2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Location of the member in the dot syntax notation. This is location 2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// of the getter method. 2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation MemberLoc; 2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: Swizzle these into a single pointer. 2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *Base; 2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *InterfaceDecl; 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Location of the receiver class in the dot syntax notation 2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// used to call a class method setter/getter. 2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation ClassLoc; 2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic: 2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCImplicitSetterGetterRefExpr(ObjCMethodDecl *getter, 2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType t, 2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *setter, 2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation l, Expr *base) 3006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCImplicitSetterGetterRefExprClass, t, false, false), 3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Setter(setter), Getter(getter), MemberLoc(l), Base(base), 3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InterfaceDecl(0), ClassLoc(SourceLocation()) { 3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCImplicitSetterGetterRefExpr(ObjCMethodDecl *getter, 3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType t, 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *setter, 3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation l, ObjCInterfaceDecl *C, SourceLocation CL) 3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCImplicitSetterGetterRefExprClass, t, false, false), 3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Setter(setter), Getter(getter), MemberLoc(l), Base(0), InterfaceDecl(C), 3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ClassLoc(CL) { 3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines explicit ObjCImplicitSetterGetterRefExpr(EmptyShell Empty) 3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(ObjCImplicitSetterGetterRefExprClass, Empty){} 3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *getGetterMethod() const { return Getter; } 3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCMethodDecl *getSetterMethod() const { return Setter; } 3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *getInterfaceDecl() const { return InterfaceDecl; } 3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setGetterMethod(ObjCMethodDecl *D) { Getter = D; } 3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setSetterMethod(ObjCMethodDecl *D) { Setter = D; } 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setInterfaceDecl(ObjCInterfaceDecl *D) { InterfaceDecl = D; } 3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual SourceRange getSourceRange() const { 3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Base) 3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(getBase()->getLocStart(), MemberLoc); 3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceRange(ClassLoc, MemberLoc); 3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Expr *getBase() const { return cast_or_null<Expr>(Base); } 3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *getBase() { return cast_or_null<Expr>(Base); } 3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setBase(Expr *base) { Base = base; } 3306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getLocation() const { return MemberLoc; } 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setLocation(SourceLocation L) { MemberLoc = L; } 333 SourceLocation getClassLoc() const { return ClassLoc; } 334 void setClassLoc(SourceLocation L) { ClassLoc = L; } 335 336 static bool classof(const Stmt *T) { 337 return T->getStmtClass() == ObjCImplicitSetterGetterRefExprClass; 338 } 339 static bool classof(const ObjCImplicitSetterGetterRefExpr *) { return true; } 340 341 // Iterators 342 virtual child_iterator child_begin(); 343 virtual child_iterator child_end(); 344}; 345 346class ObjCMessageExpr : public Expr { 347 // SubExprs - The receiver and arguments of the message expression. 348 Stmt **SubExprs; 349 350 // NumArgs - The number of arguments (not including the receiver) to the 351 // message expression. 352 unsigned NumArgs; 353 354 /// \brief The location of the class name in a class message. 355 SourceLocation ClassNameLoc; 356 357 // A unigue name for this message. 358 Selector SelName; 359 360 // A method prototype for this message (optional). 361 // FIXME: Since method decls contain the selector, and most messages have a 362 // prototype, consider devising a scheme for unifying SelName/MethodProto. 363 ObjCMethodDecl *MethodProto; 364 365 SourceLocation LBracloc, RBracloc; 366 367 // Constants for indexing into SubExprs. 368 enum { RECEIVER=0, ARGS_START=1 }; 369 370 // Bit-swizzling flags. 371 enum { IsInstMeth=0, IsClsMethDeclUnknown, IsClsMethDeclKnown, Flags=0x3 }; 372 unsigned getFlag() const { return (uintptr_t) SubExprs[RECEIVER] & Flags; } 373 374public: 375 /// This constructor is used to represent class messages where the 376 /// ObjCInterfaceDecl* of the receiver is not known. 377 ObjCMessageExpr(ASTContext &C, IdentifierInfo *clsName, 378 SourceLocation clsNameLoc, Selector selInfo, 379 QualType retType, ObjCMethodDecl *methDecl, 380 SourceLocation LBrac, SourceLocation RBrac, 381 Expr **ArgExprs, unsigned NumArgs); 382 383 /// This constructor is used to represent class messages where the 384 /// ObjCInterfaceDecl* of the receiver is known. 385 // FIXME: clsName should be typed to ObjCInterfaceType 386 ObjCMessageExpr(ASTContext &C, ObjCInterfaceDecl *cls, 387 SourceLocation clsNameLoc, Selector selInfo, 388 QualType retType, ObjCMethodDecl *methDecl, 389 SourceLocation LBrac, SourceLocation RBrac, 390 Expr **ArgExprs, unsigned NumArgs); 391 392 // constructor for instance messages. 393 ObjCMessageExpr(ASTContext &C, Expr *receiver, Selector selInfo, 394 QualType retType, ObjCMethodDecl *methDecl, 395 SourceLocation LBrac, SourceLocation RBrac, 396 Expr **ArgExprs, unsigned NumArgs); 397 398 explicit ObjCMessageExpr(EmptyShell Empty) 399 : Expr(ObjCMessageExprClass, Empty), SubExprs(0), NumArgs(0) {} 400 401 virtual void DoDestroy(ASTContext &C); 402 403 /// getReceiver - Returns the receiver of the message expression. 404 /// This can be NULL if the message is for class methods. For 405 /// class methods, use getClassName. 406 /// FIXME: need to handle/detect 'super' usage within a class method. 407 Expr *getReceiver() { 408 uintptr_t x = (uintptr_t) SubExprs[RECEIVER]; 409 return (x & Flags) == IsInstMeth ? (Expr*) x : 0; 410 } 411 const Expr *getReceiver() const { 412 return const_cast<ObjCMessageExpr*>(this)->getReceiver(); 413 } 414 // FIXME: need setters for different receiver types. 415 void setReceiver(Expr *rec) { SubExprs[RECEIVER] = rec; } 416 Selector getSelector() const { return SelName; } 417 void setSelector(Selector S) { SelName = S; } 418 419 const ObjCMethodDecl *getMethodDecl() const { return MethodProto; } 420 ObjCMethodDecl *getMethodDecl() { return MethodProto; } 421 void setMethodDecl(ObjCMethodDecl *MD) { MethodProto = MD; } 422 423 /// \brief Describes the class receiver of a message send. 424 struct ClassInfo { 425 /// \brief The interface declaration for the class that is 426 /// receiving the message. May be NULL. 427 ObjCInterfaceDecl *Decl; 428 429 /// \brief The name of the class that is receiving the 430 /// message. This will never be NULL. 431 IdentifierInfo *Name; 432 433 /// \brief The source location of the class name. 434 SourceLocation Loc; 435 436 ClassInfo() : Decl(0), Name(0), Loc() { } 437 438 ClassInfo(ObjCInterfaceDecl *Decl, IdentifierInfo *Name, SourceLocation Loc) 439 : Decl(Decl), Name(Name), Loc(Loc) { } 440 }; 441 442 /// getClassInfo - For class methods, this returns both the ObjCInterfaceDecl* 443 /// and IdentifierInfo* of the invoked class. Both can be NULL if this 444 /// is an instance message, and the ObjCInterfaceDecl* can be NULL if none 445 /// was available when this ObjCMessageExpr object was constructed. 446 ClassInfo getClassInfo() const; 447 void setClassInfo(const ClassInfo &C); 448 449 /// getClassName - For class methods, this returns the invoked class, 450 /// and returns NULL otherwise. For instance methods, use getReceiver. 451 IdentifierInfo *getClassName() const { 452 return getClassInfo().Name; 453 } 454 455 /// getNumArgs - Return the number of actual arguments to this call. 456 unsigned getNumArgs() const { return NumArgs; } 457 void setNumArgs(unsigned nArgs) { 458 NumArgs = nArgs; 459 // FIXME: should always allocate SubExprs via the ASTContext's 460 // allocator. 461 if (!SubExprs) 462 SubExprs = new Stmt* [NumArgs + 1]; 463 } 464 465 /// getArg - Return the specified argument. 466 Expr *getArg(unsigned Arg) { 467 assert(Arg < NumArgs && "Arg access out of range!"); 468 return cast<Expr>(SubExprs[Arg+ARGS_START]); 469 } 470 const Expr *getArg(unsigned Arg) const { 471 assert(Arg < NumArgs && "Arg access out of range!"); 472 return cast<Expr>(SubExprs[Arg+ARGS_START]); 473 } 474 /// setArg - Set the specified argument. 475 void setArg(unsigned Arg, Expr *ArgExpr) { 476 assert(Arg < NumArgs && "Arg access out of range!"); 477 SubExprs[Arg+ARGS_START] = ArgExpr; 478 } 479 480 SourceLocation getLeftLoc() const { return LBracloc; } 481 SourceLocation getRightLoc() const { return RBracloc; } 482 483 void setLeftLoc(SourceLocation L) { LBracloc = L; } 484 void setRightLoc(SourceLocation L) { RBracloc = L; } 485 486 void setSourceRange(SourceRange R) { 487 LBracloc = R.getBegin(); 488 RBracloc = R.getEnd(); 489 } 490 virtual SourceRange getSourceRange() const { 491 return SourceRange(LBracloc, RBracloc); 492 } 493 494 static bool classof(const Stmt *T) { 495 return T->getStmtClass() == ObjCMessageExprClass; 496 } 497 static bool classof(const ObjCMessageExpr *) { return true; } 498 499 // Iterators 500 virtual child_iterator child_begin(); 501 virtual child_iterator child_end(); 502 503 typedef ExprIterator arg_iterator; 504 typedef ConstExprIterator const_arg_iterator; 505 506 arg_iterator arg_begin() { return &SubExprs[ARGS_START]; } 507 arg_iterator arg_end() { return &SubExprs[ARGS_START] + NumArgs; } 508 const_arg_iterator arg_begin() const { return &SubExprs[ARGS_START]; } 509 const_arg_iterator arg_end() const { return &SubExprs[ARGS_START] + NumArgs; } 510}; 511 512/// ObjCSuperExpr - Represents the "super" expression in Objective-C, 513/// which refers to the object on which the current method is executing. 514class ObjCSuperExpr : public Expr { 515 SourceLocation Loc; 516public: 517 ObjCSuperExpr(SourceLocation L, QualType Type) 518 : Expr(ObjCSuperExprClass, Type, false, false), Loc(L) { } 519 explicit ObjCSuperExpr(EmptyShell Empty) : Expr(ObjCSuperExprClass, Empty) {} 520 521 SourceLocation getLoc() const { return Loc; } 522 void setLoc(SourceLocation L) { Loc = L; } 523 524 virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 525 526 static bool classof(const Stmt *T) { 527 return T->getStmtClass() == ObjCSuperExprClass; 528 } 529 static bool classof(const ObjCSuperExpr *) { return true; } 530 531 // Iterators 532 virtual child_iterator child_begin(); 533 virtual child_iterator child_end(); 534}; 535 536/// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type. 537/// (similiar in spirit to MemberExpr). 538class ObjCIsaExpr : public Expr { 539 /// Base - the expression for the base object pointer. 540 Stmt *Base; 541 542 /// IsaMemberLoc - This is the location of the 'isa'. 543 SourceLocation IsaMemberLoc; 544 545 /// IsArrow - True if this is "X->F", false if this is "X.F". 546 bool IsArrow; 547public: 548 ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, QualType ty) 549 : Expr(ObjCIsaExprClass, ty, false, false), 550 Base(base), IsaMemberLoc(l), IsArrow(isarrow) {} 551 552 /// \brief Build an empty expression. 553 explicit ObjCIsaExpr(EmptyShell Empty) : Expr(ObjCIsaExprClass, Empty) { } 554 555 void setBase(Expr *E) { Base = E; } 556 Expr *getBase() const { return cast<Expr>(Base); } 557 558 bool isArrow() const { return IsArrow; } 559 void setArrow(bool A) { IsArrow = A; } 560 561 /// getMemberLoc - Return the location of the "member", in X->F, it is the 562 /// location of 'F'. 563 SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; } 564 void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; } 565 566 virtual SourceRange getSourceRange() const { 567 return SourceRange(getBase()->getLocStart(), IsaMemberLoc); 568 } 569 570 virtual SourceLocation getExprLoc() const { return IsaMemberLoc; } 571 572 static bool classof(const Stmt *T) { 573 return T->getStmtClass() == ObjCIsaExprClass; 574 } 575 static bool classof(const ObjCIsaExpr *) { return true; } 576 577 // Iterators 578 virtual child_iterator child_begin(); 579 virtual child_iterator child_end(); 580}; 581 582} // end namespace clang 583 584#endif 585