DeclObjC.h revision 49747fdd0a05dfc1f15910267d6f86dfe83e6fc8
1980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===--- DeclObjC.h - Classes for representing declarations -----*- C++ -*-===//
2980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
3980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//                     The LLVM Compiler Infrastructure
4980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
5980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// This file was developed by Steve Naroff and is distributed under
6980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// the University of Illinois Open Source License. See LICENSE.TXT for details.
7980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
8980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===----------------------------------------------------------------------===//
9980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
10980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//  This file defines the DeclObjC interface and subclasses.
11980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
12980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===----------------------------------------------------------------------===//
13980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
14980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#ifndef LLVM_CLANG_AST_DECLOBJC_H
15980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#define LLVM_CLANG_AST_DECLOBJC_H
16980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
17980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/Decl.h"
18c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h"
19980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
20980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffnamespace clang {
21980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass Expr;
22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass Stmt;
23980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass FunctionDecl;
24980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass AttributeList;
25980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl;
26980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcMethodDecl;
27980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcProtocolDecl;
28980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcCategoryDecl;
2982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianclass ObjcPropertyDecl;
3058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
3158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// ObjcMethodDecl - Represents an instance or class method declaration.
3258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces,
3358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// categories, protocols, and class implementations. While C++ member
3458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after
3558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Smalltalk (using colons to specify argument types/expressions).
3658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Here are some brief examples:
3758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
3858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Setter/getter instance methods:
3958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)setMenu:(NSMenu *)menu;
4058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (NSMenu *)menu;
4158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Instance method that takes 2 NSView arguments:
4358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
4458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Getter class method:
4658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// + (NSMenu *)defaultMenu;
4758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// A selector represents a unique name for a method. The selector names for
4958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
5058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
5158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffclass ObjcMethodDecl : public Decl {
5258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffpublic:
5358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  enum ImplementationControl { None, Required, Optional };
5458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffprivate:
5558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// Bitfields must be first fields in this class so they pack with those
5658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// declared in class Decl.
5758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// instance (true) or class (false) method.
5858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool IsInstance : 1;
5958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool IsVariadic : 1;
6058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
6158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// @required/@optional
6258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ImplementationControl DeclImplementation : 2;
6358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
6458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// in, inout, etc.
6558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcDeclQualifier objcDeclQualifier : 6;
6658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
6758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Context this method is declared in.
6858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  NamedDecl *MethodContext;
6958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
7058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // A unigue name for this method.
7158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Selector SelName;
7258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
7358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Type of this method.
7458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  QualType MethodDeclType;
7558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
7658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// parameters of this Method.  This is null if there are no formals.
7758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl **ParamInfo;
7858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  int NumMethodParams;  // -1 if no parameters
7958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// List of attributes for this method declaration.
8158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  AttributeList *MethodAttrs;
8258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation EndLoc; // the location of the ';' or '{'.
8458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // The following are only used for method definitions, null otherwise.
8658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // FIXME: space savings opportunity, consider a sub-class.
8758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Stmt *Body;
8858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *SelfDecl;
8958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffpublic:
9058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
9158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 Selector SelInfo, QualType T,
9258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 Decl *contextDecl,
9358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 ParmVarDecl **paramInfo = 0, int numParams=-1,
9458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 AttributeList *M = 0, bool isInstance = true,
9558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 bool isVariadic = false,
9658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 ImplementationControl impControl = None,
9758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 Decl *PrevDecl = 0)
9858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  : Decl(ObjcMethod, beginLoc),
9958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    IsInstance(isInstance), IsVariadic(isVariadic),
10058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
10158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    MethodContext(static_cast<NamedDecl*>(contextDecl)),
10258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    SelName(SelInfo), MethodDeclType(T),
10358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    ParamInfo(paramInfo), NumMethodParams(numParams),
10458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
10558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  virtual ~ObjcMethodDecl();
10658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
10758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
10858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
10958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
11058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Location information, modeled after the Stmt API.
11158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
11258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
11358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
11458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  NamedDecl *getMethodContext() const { return MethodContext; }
11558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
11658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcInterfaceDecl *const getClassInterface() const;
11758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
11858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Selector getSelector() const { return SelName; }
11958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  QualType getResultType() const { return MethodDeclType; }
12058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
12158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  int getNumParams() const { return NumMethodParams; }
12258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *getParamDecl(int i) const {
12358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    assert(i < getNumParams() && "Illegal param #");
12458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ParamInfo[i];
12558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
12658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
12758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
12858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  AttributeList *getMethodAttrs() const {return MethodAttrs;}
12958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isInstance() const { return IsInstance; }
13058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isVariadic() const { return IsVariadic; }
13158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
13258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Related to protocols declared in  @protocol
13358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setDeclImplementation(ImplementationControl ic) {
13458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    DeclImplementation = ic;
13558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
13658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ImplementationControl getImplementationControl() const {
13758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return DeclImplementation;
13858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
13958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Stmt *const getBody() const { return Body; }
14058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setBody(Stmt *B) { Body = B; }
14158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
14258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *const getSelfDecl() const { return SelfDecl; }
14358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
14458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
14558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Implement isa/cast/dyncast/etc.
14658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
14758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  static bool classof(const ObjcMethodDecl *D) { return true; }
14858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff};
149b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
1500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcInterfaceDecl - Represents an ObjC class declaration. For example:
1510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   // MostPrimitive declares no super class (not particularly useful).
1530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface MostPrimitive
1540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     // no instance variables or methods.
1550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end
1560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
157fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner///   // NSResponder inherits from NSObject & implements NSCoding (a protocol).
1580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface NSResponder : NSObject <NSCoding>
1590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   { // instance variables are represented by ObjcIvarDecl.
1600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id nextResponder; // nextResponder instance variable.
1610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (NSResponder *)nextResponder; // return a pointer to NSResponder.
1630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer
1640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end                                    // to an NSEvent.
1650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, forward class declarations are accomplished with @class.
1670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, @class allows for a list of classes to be forward declared.
1680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
1690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   typically inherit from NSObject (an exception is NSProxy).
1700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
171980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcInterfaceDecl : public TypeDecl {
172980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
173980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Class's super class.
174980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
175980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
176980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Protocols referenced in interface header declaration
1777ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
1787ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
179980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
180980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
181980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not defined.
182980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
183980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
184980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance methods
1857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
1867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
187980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
188980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// class methods
1897ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
1907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
191980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
192980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of categories defined for this class.
1933d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl *CategoryList;
19482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
19582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  /// class properties
19682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **PropertyDecl;  // Null if no property
19782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecl;  // -1 if no property
198980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1993a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ForwardDecl:1; // declared with @class.
2003a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool InternalInterface:1; // true - no @interface for @implementation
20160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
202f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation EndLoc; // marks the '>', '}', or identifier.
203f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
204980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
20560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
2063a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    IdentifierInfo *Id, bool FD = false,
2073a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    bool isInternal = false)
20860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff    : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0),
2097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0),
2107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumIvars(-1),
2117ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
2127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
21382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      CategoryList(0), PropertyDecl(0), NumPropertyDecl(-1),
21482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      ForwardDecl(FD), InternalInterface(isInternal) {
215980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocIntfRefProtocols(numRefProtos);
216980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
217a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff
218a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff  // This is necessary when converting a forward declaration to a definition.
219980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocIntfRefProtocols(unsigned numRefProtos) {
220980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
2217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
2227ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      memset(ReferencedProtocols, '\0',
223980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
2247ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumReferencedProtocols = numRefProtos;
225980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
226980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2287ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
2297ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
2307ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  }
2317ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumIntfRefProtocols() const { return NumReferencedProtocols; }
232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2330330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  int getNumInstanceVariables() const { return NumIvars; }
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
235be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner  typedef ObjcIvarDecl * const *ivar_iterator;
2365564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner  unsigned ivar_size() const { return NumIvars == -1 ?0 : NumIvars; }
237be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
2385564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner  ivar_iterator ivar_end() const { return Ivars + ivar_size();}
239be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner
2407ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
2417ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
242980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2434c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  typedef ObjcMethodDecl * const * instmeth_iterator;
2444c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
2454c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_end() const {
24623c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
2474c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
2484c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
2494c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  typedef ObjcMethodDecl * const * classmeth_iterator;
2504c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods; }
2514c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_end() const {
25223c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
2534c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
2544c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
25560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars,
25660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                   SourceLocation RBracLoc);
257980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
25860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
25960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
26060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEnd);
261980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
262768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return ForwardDecl; }
263768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { ForwardDecl = val; }
264980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
265980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setIntfRefProtocols(int idx, ObjcProtocolDecl *OID) {
2667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
2677ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
271980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setSuperClass(ObjcInterfaceDecl * superCls) { SuperClass = superCls; }
272980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2733d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl* getCategoryList() const { return CategoryList; }
2743d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  void setCategoryList(ObjcCategoryDecl *category) {
2753d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff         CategoryList = category;
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
2770330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  ObjcIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName,
2780330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff                                       ObjcInterfaceDecl *&clsDeclared);
27958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
28058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
28158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
28258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
28358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
28458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
28558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
28658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
28758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
28858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
28958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
29058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
29158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
29258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
29358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
29458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
29558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
29658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
29758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
29858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Lookup the instance method. First, we search locally. If a method isn't
29958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // found, we look through the reference protocols. Lastly, we look categories
30058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // defined for this class.
3016a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
3026a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
30360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
304f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
30560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
306f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
307f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
30860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
30960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
310f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
31182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
312ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  int getNumPropertyDecl() const { return NumPropertyDecl; }
31382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecl(int num) { NumPropertyDecl = num; }
31482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
31582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **const getPropertyDecl() const { return PropertyDecl; }
31682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **getPropertyDecl() { return PropertyDecl; }
31782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcPropertyDecl **properties) {
31882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyDecl = properties;
31982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
320f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
3214b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
3224b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
3234b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
3243a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ImplicitInterfaceDecl() const { return InternalInterface; }
3254b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
326aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; }
327980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcInterfaceDecl *D) { return true; }
328980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
329980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC
3310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
3320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
3330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
3350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
3360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
3370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
3380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
3390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
3400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
3410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
3420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
3430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
3440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
345980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl {
346980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
347980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
348980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    : FieldDecl(ObjcIvar, L, Id, T) {}
349980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
350980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
351980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
352980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
353980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
354980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl getAccessControl() const { return DeclAccess; }
355980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
356980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
357980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; }
358980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcIvarDecl *D) { return true; }
359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
360980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl DeclAccess : 3;
361980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
362980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
363980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols
3650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
3660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
3670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
3680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo
3700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
3710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
3720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
3750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and
3780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
3790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
3800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
3810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
3830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
38405672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl {
385980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
386980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
387980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumReferencedProtocols;  // -1 if none
388980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
389980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
3907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
3917ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
392980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
393980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
3947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
3957ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
396980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
397980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
398423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
399423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
400423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
401980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
402980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos,
403980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                   IdentifierInfo *Id, bool FD = false)
40405672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian    : NamedDecl(ObjcProtocol, L, Id),
405980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols(0), NumReferencedProtocols(-1),
4067ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
4077ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
408980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      isForwardProtoDecl(FD) {
409980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocReferencedProtocols(numRefProtos);
410980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
411980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
412980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
413980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
414980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
415980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
416980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
417980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
418980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
41960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
42060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
42160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
422980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
423980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
424980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
425980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
426980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
427980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
428980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl** getReferencedProtocols() const {
429980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
430980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
431980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
4327ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
4337ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
43458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
43558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * instmeth_iterator;
43658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
43758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
43858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
43958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
44058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
44158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * classmeth_iterator;
44258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
44358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
44458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
44558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
44658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
44758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
44858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
44958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
45058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
45158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
45258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
45358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
45458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
45558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
45658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
45758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
45858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
45958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
46058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
46158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
46258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
46358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
46458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
465980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
4667dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
4677dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
4687dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian
469768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
470768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
471980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
472423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
473423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
474423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
475423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
476423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
477423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
478423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
479423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
480aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; }
481980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcProtocolDecl *D) { return true; }
482980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
483980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
48406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example:
48506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
48606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
4870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
488ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl {
4897e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcInterfaceDecl **ForwardDecls;
4907e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
49106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
4927e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
493ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian    : Decl(ObjcClass, L) {
49406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
49506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff      ForwardDecls = new ObjcInterfaceDecl*[nElts];
4967e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
4977e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
4987e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
49906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
50006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
50106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5027e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
5037e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
50406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
50506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5067e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
5077e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
5087e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
509aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcClass; }
51006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcClassDecl *D) { return true; }
51106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
51206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
51306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations.
51406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
51506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
5160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
5170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5186d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl {
5199fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl **ReferencedProtocols;
5209fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
52106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
522b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner  ObjcForwardProtocolDecl(SourceLocation L,
523b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner                          ObjcProtocolDecl **Elts, unsigned nElts)
5246d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian  : Decl(ObjcForwardProtocol, L) {
525b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
52606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
5277ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[nElts];
528b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*));
5299fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
5309fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
531980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
53206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5339fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) {
5349fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
53606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5379fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
5389fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
5399fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
5409fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) {
5419fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5429fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
5439fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
5449fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
5459fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5469fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
5479fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
5489fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
54906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
55006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    return D->getKind() == ObjcForwardProtocol;
55106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
55206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcForwardProtocolDecl *D) { return true; }
553980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
554980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows
5560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
5570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
5580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
5590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
5600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
5620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
5630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
5640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
5660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
5670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
5690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java)
5700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
5710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
572fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl {
573980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
574980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *ClassInterface;
575980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
576980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols in this category
5777ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
5787ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
579980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
580980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
5817ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
5827ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
583980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
584980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
5857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
5867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
587980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
588980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
589980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *NextClassCategory;
590ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
591423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
592423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
593980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
594fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner  ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
595fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner    : NamedDecl(ObjcCategory, L, Id),
596fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1),
5977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
5987ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
599e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner      NextClassCategory(0) {
600980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        if (numRefProtocol) {
6017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol];
6027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          memset(ReferencedProtocols, '\0',
603980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 numRefProtocol*sizeof(ObjcProtocolDecl*));
6047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          NumReferencedProtocols = numRefProtocol;
605980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        }
606980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
607980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
608980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
609980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; }
610980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
611980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
6127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
6137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
614980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
615980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6167ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
6177ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
6188f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
6197ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
6207ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
6217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
62258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
62358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * instmeth_iterator;
62458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
62558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
62658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
62758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
62858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
62958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * classmeth_iterator;
63058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
63158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
63258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
63358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
63458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
63558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
63658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
63758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
63858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
63958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
64058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
64158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
64258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
64358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
64458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
64558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
64658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
64758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
64858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
64958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
65058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
65158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
65258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
6538f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
65460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
65560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
65660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
657980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
658980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
659980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
6603d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
6613d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
662980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
663423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
664423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
665423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
666423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
667423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
668423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
669423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
670ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
671aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; }
672980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcCategoryDecl *D) { return true; }
673980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
6740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
6758f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category
6768f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
6776a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl {
6788f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
6798f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
6808f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
681e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented instance methods
682e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
6838f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
684e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented class methods
685e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
686e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
687e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation EndLoc;
688e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroffpublic:
689ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
690ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner                       ObjcInterfaceDecl *classInterface)
691ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    : NamedDecl(ObjcCategoryImpl, L, Id), ClassInterface(classInterface) {}
6928f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
693e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
6948f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
695ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumInstanceMethods() const { return InstanceMethods.size(); }
696ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumClassMethods() const { return ClassMethods.size(); }
697e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
698e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
699e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    InstanceMethods.push_back(method);
700e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
701e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
702e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    ClassMethods.push_back(method);
703e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
704e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
705e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
706e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
707ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
708ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    instmeth_iterator;
709ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
710ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
711ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
712ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
713ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    classmeth_iterator;
714ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
715ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
716ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
717ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
718e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // Location information, modeled after the Stmt API.
719e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
720e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
721e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
722e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
723aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
7248f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  static bool classof(const ObjcCategoryImplDecl *D) { return true; }
7258f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
7268f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
7270c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where
7280c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
7290c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
7310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
7320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
7330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
7350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
7360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
7370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
7380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
7390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
7400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
7410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7426d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl {
743f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  /// Class interface for this category implementation
744f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
745f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
746980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
747980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
748980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
749980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
750980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not specified
751980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
7520416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
753980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
7540416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
7550416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
756980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
7570416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
7580416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
7590416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation EndLoc;
7609fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic:
761980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id,
762f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *classInterface,
763f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *superDecl)
7646d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian    : NamedDecl(ObjcImplementation, L, Id),
7650416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      ClassInterface(classInterface), SuperClass(superDecl),
7660416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      Ivars(0), NumIvars(-1) {}
767980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
768980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars,
769980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
770980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
7710416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
7720416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    InstanceMethods.push_back(method);
7730416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
7740416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
7750416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    ClassMethods.push_back(method);
7760416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
7770416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // Location information, modeled after the Stmt API.
7780416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
7790416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
7800416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
7810416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
782f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
78393efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
784980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
78593efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  void setSuperClass(ObjcInterfaceDecl * superCls)
786980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { SuperClass = superCls; }
787980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
78849747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getNumInstanceMethods() const { return InstanceMethods.size(); }
78949747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getNumClassMethods() const { return ClassMethods.size(); }
790c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff
79149747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getImplDeclNumIvars() const { return NumIvars; }
7920157c5144513438bb74aebf50d18f95df4104acbChris Lattner
7930157c5144513438bb74aebf50d18f95df4104acbChris Lattner
7940157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
7950157c5144513438bb74aebf50d18f95df4104acbChris Lattner       instmeth_iterator;
7960157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
7970157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
7980157c5144513438bb74aebf50d18f95df4104acbChris Lattner
7990157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
8000157c5144513438bb74aebf50d18f95df4104acbChris Lattner    classmeth_iterator;
8010157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
8020157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
8030157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8040157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// lookupInstanceMethod - This method returns an instance method by looking
8050157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// in the class implementation. Unlike interfaces, we don't look outside the
8060157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// implementation.
8070157c5144513438bb74aebf50d18f95df4104acbChris Lattner  ObjcMethodDecl *lookupInstanceMethod(Selector Sel);
8080157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8090157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// lookupClassMethod - This method returns a class method by looking in
8100157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// the class implementation. Unlike interfaces, we don't look outside the
8110157c5144513438bb74aebf50d18f95df4104acbChris Lattner  /// implementation.
8120157c5144513438bb74aebf50d18f95df4104acbChris Lattner  ObjcMethodDecl *lookupClassMethod(Selector Sel);
8130157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8140157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef ObjcIvarDecl * const *ivar_iterator;
8150157c5144513438bb74aebf50d18f95df4104acbChris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
81623c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner  ivar_iterator ivar_end() const {return Ivars+(NumIvars == -1 ? 0 : NumIvars);}
8170157c5144513438bb74aebf50d18f95df4104acbChris Lattner
818980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
819980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return D->getKind() == ObjcImplementation;
820980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
821980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcImplementationDecl *D) { return true; }
822980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
823243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
824243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is
825243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
826243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl {
827243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
828243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *AliasedClass;
829243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
830243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic:
831243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
832243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian                         ObjcInterfaceDecl* aliasedClass)
833243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  : ScopedDecl(CompatibleAlias, L, Id, 0),
834243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  AliasedClass(aliasedClass) {}
835243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
836243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; }
837980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
838243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
839243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian    return D->getKind() == CompatibleAlias;
840243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
841243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const ObjcCompatibleAliasDecl *D) { return true; }
842243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
843243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
84482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
84582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianclass ObjcPropertyDecl : public Decl {
84682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
847564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  enum PropertyAttributeKind { OBJC_PR_noattr = 0x0,
84882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readonly = 0x01,
84982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_getter = 0x02,
85082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_assign = 0x04,
85182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readwrite = 0x08,
85282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_retain = 0x10,
85382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_copy = 0x20,
85482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_nonatomic = 0x40,
85582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_setter = 0x80 };
85682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate:
85782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // List of property name declarations
85882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // FIXME: Property is not an ivar.
85982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **PropertyDecls;
86082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecls;
86182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
862564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  PropertyAttributeKind PropertyAttributes : 8;
86382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
86482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *GetterName;    // getter name of NULL if no getter
86582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *SetterName;    // setter name of NULL if no setter
86682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
86782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
86882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl(SourceLocation L)
86982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  : Decl(PropertyDecl, L),
87082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  PropertyDecls(0), NumPropertyDecls(-1), PropertyAttributes(OBJC_PR_noattr),
87182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  GetterName(0), SetterName(0) {}
87282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
87382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **const getPropertyDecls() const { return PropertyDecls; }
87482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcIvarDecl **property) { PropertyDecls = property; }
87582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
87682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecls() const { return NumPropertyDecls; }
87782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecls(int num) { NumPropertyDecls = num; }
87882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
879564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  const PropertyAttributeKind getPropertyAttributes() const
88082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    { return PropertyAttributes; }
881564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  void setPropertyAttributes(PropertyAttributeKind PRVal) {
88282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyAttributes =
883564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian    (PropertyAttributeKind) (PropertyAttributes | PRVal);
88482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
88582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
88682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getGetterName() const { return GetterName; }
88782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getGetterName() { return GetterName; }
88882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setGetterName(IdentifierInfo *Id) { GetterName = Id; }
88982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
89082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getSetterName() const { return SetterName; }
89182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getSetterName() { return SetterName; }
89282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
89382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
89482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const Decl *D) {
89582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    return D->getKind() == PropertyDecl;
89682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
89782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const ObjcPropertyDecl *D) { return true; }
89882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian};
899980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
900980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
901980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
902