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