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