ExprObjC.h revision fc0f021b492cf28ee7b3a6bd4445ae569e6f15de
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===--- ExprObjC.h - Classes for representing ObjC expressions -*- C++ -*-===// 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The LLVM Compiler Infrastructure 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This file is distributed under the University of Illinois Open Source 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// License. See LICENSE.TXT for details. 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//===----------------------------------------------------------------------===// 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This file defines the ExprObjC interface and subclasses. 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//===----------------------------------------------------------------------===// 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef LLVM_CLANG_AST_EXPROBJC_H 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define LLVM_CLANG_AST_EXPROBJC_H 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "clang/AST/Expr.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "clang/Basic/IdentifierTable.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace clang { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class IdentifierInfo; 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch class ASTContext; 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch class ObjCMethodDecl; 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch class ObjCPropertyDecl; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// ObjCStringLiteral, used for Objective-C string literals 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// i.e. @"foo". 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ObjCStringLiteral : public Expr { 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Stmt *String; 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation AtLoc; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public: 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L) 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCStringLiteralClass, T), String(SL), AtLoc(L) {} 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit ObjCStringLiteral(EmptyShell Empty) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : Expr(ObjCStringLiteralClass, Empty) {} 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StringLiteral *getString() { return cast<StringLiteral>(String); } 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const StringLiteral *getString() const { return cast<StringLiteral>(String); } 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void setString(StringLiteral *S) { String = S; } 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation getAtLoc() const { return AtLoc; } 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void setAtLoc(SourceLocation L) { AtLoc = L; } 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual SourceRange getSourceRange() const { 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return SourceRange(AtLoc, String->getLocEnd()); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const Stmt *T) { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return T->getStmtClass() == ObjCStringLiteralClass; 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const ObjCStringLiteral *) { return true; } 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Iterators 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_begin(); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_end(); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// ObjCEncodeExpr, used for @encode in Objective-C. @encode has the same type 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// and behavior as StringLiteral except that the string initializer is obtained 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// from ASTContext with the encoding type as an argument. 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ObjCEncodeExpr : public Expr { 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QualType EncType; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation AtLoc, RParenLoc; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public: 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCEncodeExpr(QualType T, QualType ET, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation at, SourceLocation rp) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : Expr(ObjCEncodeExprClass, T, ET->isDependentType(), 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ET->isDependentType()), EncType(ET), AtLoc(at), RParenLoc(rp) {} 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){} 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation getAtLoc() const { return AtLoc; } 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void setAtLoc(SourceLocation L) { AtLoc = L; } 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation getRParenLoc() const { return RParenLoc; } 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void setRParenLoc(SourceLocation L) { RParenLoc = L; } 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QualType getEncodedType() const { return EncType; } 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void setEncodedType(QualType T) { EncType = T; } 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual SourceRange getSourceRange() const { 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return SourceRange(AtLoc, RParenLoc); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const Stmt *T) { 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return T->getStmtClass() == ObjCEncodeExprClass; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const ObjCEncodeExpr *) { return true; } 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Iterators 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_begin(); 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_end(); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// ObjCSelectorExpr used for @selector in Objective-C. 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ObjCSelectorExpr : public Expr { 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Selector SelName; 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation AtLoc, RParenLoc; 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liupublic: 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObjCSelectorExpr(QualType T, Selector selInfo, 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation at, SourceLocation rp) 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : Expr(ObjCSelectorExprClass, T), SelName(selInfo), AtLoc(at), RParenLoc(rp){} 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit ObjCSelectorExpr(EmptyShell Empty) 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : Expr(ObjCSelectorExprClass, Empty) {} 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Selector getSelector() const { return SelName; } 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void setSelector(Selector S) { SelName = S; } 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation getAtLoc() const { return AtLoc; } 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation getRParenLoc() const { return RParenLoc; } 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void setAtLoc(SourceLocation L) { AtLoc = L; } 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual SourceRange getSourceRange() const { 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return SourceRange(AtLoc, RParenLoc); 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch /// getNumArgs - Return the number of actual arguments to this call. 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch unsigned getNumArgs() const { return SelName.getNumArgs(); } 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const Stmt *T) { 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return T->getStmtClass() == ObjCSelectorExprClass; 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const ObjCSelectorExpr *) { return true; } 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Iterators 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_begin(); 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_end(); 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// ObjCProtocolExpr used for protocol expression in Objective-C. This is used 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// as: @protocol(foo), as in: 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// obj conformsToProtocol:@protocol(foo)] 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// The return type is "Protocol*". 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ObjCProtocolExpr : public Expr { 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCProtocolDecl *Protocol; 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation AtLoc, RParenLoc; 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochpublic: 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol, 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation at, SourceLocation rp) 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCProtocolExprClass, T), Protocol(protocol), 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AtLoc(at), RParenLoc(rp) {} 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit ObjCProtocolExpr(EmptyShell Empty) 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCProtocolExprClass, Empty) {} 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCProtocolDecl *getProtocol() const { return Protocol; } 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setProtocol(ObjCProtocolDecl *P) { Protocol = P; } 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getAtLoc() const { return AtLoc; } 151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getRParenLoc() const { return RParenLoc; } 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setAtLoc(SourceLocation L) { AtLoc = L; } 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setRParenLoc(SourceLocation L) { RParenLoc = L; } 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual SourceRange getSourceRange() const { 156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return SourceRange(AtLoc, RParenLoc); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const Stmt *T) { 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return T->getStmtClass() == ObjCProtocolExprClass; 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool classof(const ObjCProtocolExpr *) { return true; } 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Iterators 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_begin(); 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_end(); 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// ObjCIvarRefExpr - A reference to an ObjC instance variable. 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ObjCIvarRefExpr : public Expr { 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch class ObjCIvarDecl *D; 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation Loc; 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Stmt *Base; 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool IsArrow:1; // True if this is "X->F", false if this is "X.F". 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool IsFreeIvar:1; // True if ivar reference has no base (self assumed). 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochpublic: 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCIvarRefExpr(ObjCIvarDecl *d, 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QualType t, SourceLocation l, Expr *base=0, 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool arrow = false, bool freeIvar = false) : 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Expr(ObjCIvarRefExprClass, t), D(d), 182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Loc(l), Base(base), IsArrow(arrow), 183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IsFreeIvar(freeIvar) {} 184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit ObjCIvarRefExpr(EmptyShell Empty) 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCIvarRefExprClass, Empty) {} 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCIvarDecl *getDecl() { return D; } 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const ObjCIvarDecl *getDecl() const { return D; } 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setDecl(ObjCIvarDecl *d) { D = d; } 191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const Expr *getBase() const { return cast<Expr>(Base); } 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Expr *getBase() { return cast<Expr>(Base); } 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setBase(Expr * base) { Base = base; } 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool isArrow() const { return IsArrow; } 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool isFreeIvar() const { return IsFreeIvar; } 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setIsArrow(bool A) { IsArrow = A; } 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setIsFreeIvar(bool A) { IsFreeIvar = A; } 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getLocation() const { return Loc; } 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setLocation(SourceLocation L) { Loc = L; } 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual SourceRange getSourceRange() const { 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return isFreeIvar() ? SourceRange(Loc) 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : SourceRange(getBase()->getLocStart(), Loc); 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const Stmt *T) { 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return T->getStmtClass() == ObjCIvarRefExprClass; 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const ObjCIvarRefExpr *) { return true; } 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Iterators 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_begin(); 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_end(); 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// property. 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ObjCPropertyRefExpr : public Expr { 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochprivate: 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCPropertyDecl *AsProperty; 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation IdLoc; 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Stmt *Base; 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochpublic: 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t, 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation l, Expr *base) 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCPropertyRefExprClass, t), AsProperty(PD), IdLoc(l), Base(base) { 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit ObjCPropertyRefExpr(EmptyShell Empty) 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : Expr(ObjCPropertyRefExprClass, Empty) {} 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCPropertyDecl *getProperty() const { return AsProperty; } 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setProperty(ObjCPropertyDecl *D) { AsProperty = D; } 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const Expr *getBase() const { return cast<Expr>(Base); } 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Expr *getBase() { return cast<Expr>(Base); } 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setBase(Expr *base) { Base = base; } 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getLocation() const { return IdLoc; } 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setLocation(SourceLocation L) { IdLoc = L; } 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual SourceRange getSourceRange() const { 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return SourceRange(getBase()->getLocStart(), IdLoc); 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const Stmt *T) { 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return T->getStmtClass() == ObjCPropertyRefExprClass; 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const ObjCPropertyRefExpr *) { return true; } 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Iterators 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_begin(); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual child_iterator child_end(); 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/// ObjCKVCRefExpr - A dot-syntax expression to access "implicit" properties 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// (i.e. methods following the property naming convention). KVC stands for 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// Key Value Encoding, a generic concept for accessing or setting a 'Key' 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// value for an object. 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ObjCKVCRefExpr : public Expr { 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCMethodDecl *Setter; 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCMethodDecl *Getter; 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation Loc; 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // FIXME: Swizzle these into a single pointer. 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Stmt *Base; 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCInterfaceDecl *ClassProp; 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation ClassLoc; 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public: 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCKVCRefExpr(ObjCMethodDecl *getter, 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QualType t, 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCMethodDecl *setter, 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation l, Expr *base) 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : Expr(ObjCKVCRefExprClass, t), Setter(setter), 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Getter(getter), Loc(l), Base(base), ClassProp(0), 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClassLoc(SourceLocation()) { 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCKVCRefExpr(ObjCMethodDecl *getter, 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QualType t, 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCMethodDecl *setter, 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SourceLocation l, ObjCInterfaceDecl *C, SourceLocation CL) 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : Expr(ObjCKVCRefExprClass, t), Setter(setter), 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Getter(getter), Loc(l), Base(0), ClassProp(C), ClassLoc(CL) { 289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit ObjCKVCRefExpr(EmptyShell Empty) : Expr(ObjCKVCRefExprClass, Empty){} 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ObjCMethodDecl *getGetterMethod() const { return Getter; } 293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCMethodDecl *getSetterMethod() const { return Setter; } 294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObjCInterfaceDecl *getClassProp() const { return ClassProp; } 295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setGetterMethod(ObjCMethodDecl *D) { Getter = D; } 296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setSetterMethod(ObjCMethodDecl *D) { Setter = D; } 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setClassProp(ObjCInterfaceDecl *D) { ClassProp = D; } 298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual SourceRange getSourceRange() const { 300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (Base) 301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return SourceRange(getBase()->getLocStart(), Loc); 302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return SourceRange(ClassLoc, Loc); 303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const Expr *getBase() const { return cast_or_null<Expr>(Base); } 305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Expr *getBase() { return cast_or_null<Expr>(Base); } 306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setBase(Expr *base) { Base = base; } 307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getLocation() const { return Loc; } 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setLocation(SourceLocation L) { Loc = L; } 310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SourceLocation getClassLoc() const { return ClassLoc; } 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void setClassLoc(SourceLocation L) { ClassLoc = L; } 312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const Stmt *T) { 314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return T->getStmtClass() == ObjCKVCRefExprClass; 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static bool classof(const ObjCKVCRefExpr *) { return true; } 317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Iterators 319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_begin(); 320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual child_iterator child_end(); 321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ObjCMessageExpr : public Expr { 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // SubExprs - The receiver and arguments of the message expression. 325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Stmt **SubExprs; 326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // NumArgs - The number of arguments (not including the receiver) to the 328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // message expression. 329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch unsigned NumArgs; 330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // A unigue name for this message. 332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Selector SelName; 333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // A method prototype for this message (optional). 335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // FIXME: Since method decls contain the selector, and most messages have a 336e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // prototype, consider devising a scheme for unifying SelName/MethodProto. 337e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ObjCMethodDecl *MethodProto; 338e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 339e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SourceLocation LBracloc, RBracloc; 340e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 341e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Constants for indexing into SubExprs. 342e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch enum { RECEIVER=0, ARGS_START=1 }; 343e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Bit-swizzling flags. 3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu enum { IsInstMeth=0, IsClsMethDeclUnknown, IsClsMethDeclKnown, Flags=0x3 }; 3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu unsigned getFlag() const { return (uintptr_t) SubExprs[RECEIVER] & Flags; } 3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liupublic: 3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /// This constructor is used to represent class messages where the 3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /// ObjCInterfaceDecl* of the receiver is not known. 3515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo, 3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu QualType retType, ObjCMethodDecl *methDecl, 3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation LBrac, SourceLocation RBrac, 3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Expr **ArgExprs, unsigned NumArgs); 3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /// This constructor is used to represent class messages where the 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /// ObjCInterfaceDecl* of the receiver is known. 3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // FIXME: clsName should be typed to ObjCInterfaceType 3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObjCMessageExpr(ObjCInterfaceDecl *cls, Selector selInfo, 3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu QualType retType, ObjCMethodDecl *methDecl, 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation LBrac, SourceLocation RBrac, 3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Expr **ArgExprs, unsigned NumArgs); 3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // constructor for instance messages. 3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObjCMessageExpr(Expr *receiver, Selector selInfo, 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu QualType retType, ObjCMethodDecl *methDecl, 3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SourceLocation LBrac, SourceLocation RBrac, 3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Expr **ArgExprs, unsigned NumArgs); 3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit ObjCMessageExpr(EmptyShell Empty) 3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : Expr(ObjCMessageExprClass, Empty), SubExprs(0), NumArgs(0) {} 3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ~ObjCMessageExpr() { 3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete [] SubExprs; 3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// getReceiver - Returns the receiver of the message expression. 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// This can be NULL if the message is for class methods. For 379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// class methods, use getClassName. 380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// FIXME: need to handle/detect 'super' usage within a class method. 381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Expr *getReceiver() { 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uintptr_t x = (uintptr_t) SubExprs[RECEIVER]; 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (x & Flags) == IsInstMeth ? (Expr*) x : 0; 384 } 385 const Expr *getReceiver() const { 386 return const_cast<ObjCMessageExpr*>(this)->getReceiver(); 387 } 388 // FIXME: need setters for different receiver types. 389 void setReceiver(Expr *rec) { SubExprs[RECEIVER] = rec; } 390 Selector getSelector() const { return SelName; } 391 void setSelector(Selector S) { SelName = S; } 392 393 const ObjCMethodDecl *getMethodDecl() const { return MethodProto; } 394 ObjCMethodDecl *getMethodDecl() { return MethodProto; } 395 void setMethodDecl(ObjCMethodDecl *MD) { MethodProto = MD; } 396 397 typedef std::pair<ObjCInterfaceDecl*, IdentifierInfo*> ClassInfo; 398 399 /// getClassInfo - For class methods, this returns both the ObjCInterfaceDecl* 400 /// and IdentifierInfo* of the invoked class. Both can be NULL if this 401 /// is an instance message, and the ObjCInterfaceDecl* can be NULL if none 402 /// was available when this ObjCMessageExpr object was constructed. 403 ClassInfo getClassInfo() const; 404 void setClassInfo(const ClassInfo &C); 405 406 /// getClassName - For class methods, this returns the invoked class, 407 /// and returns NULL otherwise. For instance methods, use getReceiver. 408 IdentifierInfo *getClassName() const { 409 return getClassInfo().second; 410 } 411 412 /// getNumArgs - Return the number of actual arguments to this call. 413 unsigned getNumArgs() const { return NumArgs; } 414 void setNumArgs(unsigned nArgs) { 415 NumArgs = nArgs; 416 // FIXME: should always allocate SubExprs via the ASTContext's 417 // allocator. 418 if (!SubExprs) 419 SubExprs = new Stmt* [NumArgs + 1]; 420 } 421 422 /// getArg - Return the specified argument. 423 Expr *getArg(unsigned Arg) { 424 assert(Arg < NumArgs && "Arg access out of range!"); 425 return cast<Expr>(SubExprs[Arg+ARGS_START]); 426 } 427 const Expr *getArg(unsigned Arg) const { 428 assert(Arg < NumArgs && "Arg access out of range!"); 429 return cast<Expr>(SubExprs[Arg+ARGS_START]); 430 } 431 /// setArg - Set the specified argument. 432 void setArg(unsigned Arg, Expr *ArgExpr) { 433 assert(Arg < NumArgs && "Arg access out of range!"); 434 SubExprs[Arg+ARGS_START] = ArgExpr; 435 } 436 437 SourceLocation getLeftLoc() const { return LBracloc; } 438 SourceLocation getRightLoc() const { return RBracloc; } 439 440 void setLeftLoc(SourceLocation L) { LBracloc = L; } 441 void setRightLoc(SourceLocation L) { RBracloc = L; } 442 443 void setSourceRange(SourceRange R) { 444 LBracloc = R.getBegin(); 445 RBracloc = R.getEnd(); 446 } 447 virtual SourceRange getSourceRange() const { 448 return SourceRange(LBracloc, RBracloc); 449 } 450 451 static bool classof(const Stmt *T) { 452 return T->getStmtClass() == ObjCMessageExprClass; 453 } 454 static bool classof(const ObjCMessageExpr *) { return true; } 455 456 // Iterators 457 virtual child_iterator child_begin(); 458 virtual child_iterator child_end(); 459 460 typedef ExprIterator arg_iterator; 461 typedef ConstExprIterator const_arg_iterator; 462 463 arg_iterator arg_begin() { return &SubExprs[ARGS_START]; } 464 arg_iterator arg_end() { return &SubExprs[ARGS_START] + NumArgs; } 465 const_arg_iterator arg_begin() const { return &SubExprs[ARGS_START]; } 466 const_arg_iterator arg_end() const { return &SubExprs[ARGS_START] + NumArgs; } 467}; 468 469/// ObjCSuperExpr - Represents the "super" expression in Objective-C, 470/// which refers to the object on which the current method is executing. 471class ObjCSuperExpr : public Expr { 472 SourceLocation Loc; 473public: 474 ObjCSuperExpr(SourceLocation L, QualType Type) 475 : Expr(ObjCSuperExprClass, Type), Loc(L) { } 476 explicit ObjCSuperExpr(EmptyShell Empty) : Expr(ObjCSuperExprClass, Empty) {} 477 478 SourceLocation getLoc() const { return Loc; } 479 void setLoc(SourceLocation L) { Loc = L; } 480 481 virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 482 483 static bool classof(const Stmt *T) { 484 return T->getStmtClass() == ObjCSuperExprClass; 485 } 486 static bool classof(const ObjCSuperExpr *) { return true; } 487 488 // Iterators 489 virtual child_iterator child_begin(); 490 virtual child_iterator child_end(); 491}; 492 493} // end namespace clang 494 495#endif 496