DeclObjC.h revision d57f635d520e8cb5b93d3d770ff58db06c62de54
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
121d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  // Iterator access to formal parameters.
122d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  unsigned param_size() const {
123d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner    return NumMethodParams == -1 ? 0 : NumMethodParams;
124d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  }
125d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  typedef ParmVarDecl **param_iterator;
126d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  typedef ParmVarDecl * const *param_const_iterator;
127d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_iterator param_begin() { return ParamInfo; }
128d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_iterator param_end() { return ParamInfo+param_size(); }
129d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_const_iterator param_begin() const { return ParamInfo; }
130d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_const_iterator param_end() const { return ParamInfo+param_size(); }
131d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner
13258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  int getNumParams() const { return NumMethodParams; }
13358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *getParamDecl(int i) const {
13458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    assert(i < getNumParams() && "Illegal param #");
13558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ParamInfo[i];
13658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
13758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
13858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
13958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  AttributeList *getMethodAttrs() const {return MethodAttrs;}
14058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isInstance() const { return IsInstance; }
14158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isVariadic() const { return IsVariadic; }
14258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
14358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Related to protocols declared in  @protocol
14458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setDeclImplementation(ImplementationControl ic) {
14558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    DeclImplementation = ic;
14658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
14758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ImplementationControl getImplementationControl() const {
14858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return DeclImplementation;
14958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
15058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Stmt *const getBody() const { return Body; }
15158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setBody(Stmt *B) { Body = B; }
15258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
15358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *const getSelfDecl() const { return SelfDecl; }
15458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
15558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
15658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Implement isa/cast/dyncast/etc.
15758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
15858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  static bool classof(const ObjcMethodDecl *D) { return true; }
15958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff};
160b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
1610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcInterfaceDecl - Represents an ObjC class declaration. For example:
1620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   // MostPrimitive declares no super class (not particularly useful).
1640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface MostPrimitive
1650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     // no instance variables or methods.
1660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end
1670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
168fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner///   // NSResponder inherits from NSObject & implements NSCoding (a protocol).
1690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface NSResponder : NSObject <NSCoding>
1700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   { // instance variables are represented by ObjcIvarDecl.
1710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id nextResponder; // nextResponder instance variable.
1720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (NSResponder *)nextResponder; // return a pointer to NSResponder.
1740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer
1750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end                                    // to an NSEvent.
1760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, forward class declarations are accomplished with @class.
1780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, @class allows for a list of classes to be forward declared.
1790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
1800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   typically inherit from NSObject (an exception is NSProxy).
1810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
182980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcInterfaceDecl : public TypeDecl {
183980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
184980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Class's super class.
185980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
186980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
187980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Protocols referenced in interface header declaration
1887ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
1897ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
190980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
191980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
192980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not defined.
193980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
194980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
195980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance methods
1967ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
1977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
198980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
199980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// class methods
2007ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
2017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
202980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
203980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of categories defined for this class.
2043d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl *CategoryList;
20582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
20682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  /// class properties
20782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **PropertyDecl;  // Null if no property
20882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecl;  // -1 if no property
209980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2103a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ForwardDecl:1; // declared with @class.
2113a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool InternalInterface:1; // true - no @interface for @implementation
21260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
213f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation EndLoc; // marks the '>', '}', or identifier.
214f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
215980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
21660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
2173a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    IdentifierInfo *Id, bool FD = false,
2183a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    bool isInternal = false)
21960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff    : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0),
2207ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0),
2217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumIvars(-1),
2227ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
2237ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
22482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      CategoryList(0), PropertyDecl(0), NumPropertyDecl(-1),
22582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      ForwardDecl(FD), InternalInterface(isInternal) {
226980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocIntfRefProtocols(numRefProtos);
227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
228a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff
229a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff  // This is necessary when converting a forward declaration to a definition.
230980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocIntfRefProtocols(unsigned numRefProtos) {
231980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
2327ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
2337ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      memset(ReferencedProtocols, '\0',
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
2357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumReferencedProtocols = numRefProtos;
236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
237980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
238980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2397ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
2407ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
2417ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  }
2427ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumIntfRefProtocols() const { return NumReferencedProtocols; }
243980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2440330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  int getNumInstanceVariables() const { return NumIvars; }
245980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
246be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner  typedef ObjcIvarDecl * const *ivar_iterator;
2475564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner  unsigned ivar_size() const { return NumIvars == -1 ?0 : NumIvars; }
248be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
2495564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner  ivar_iterator ivar_end() const { return Ivars + ivar_size();}
250be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner
2517ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
2527ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
253980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2544c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  typedef ObjcMethodDecl * const * instmeth_iterator;
2554c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
2564c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_end() const {
25723c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
2584c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
2594c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
2604c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  typedef ObjcMethodDecl * const * classmeth_iterator;
2614c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods; }
2624c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_end() const {
26323c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
2644c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
2654c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
26660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars,
26760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                   SourceLocation RBracLoc);
268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
26960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
27060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
27160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEnd);
272980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
273768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return ForwardDecl; }
274768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { ForwardDecl = val; }
275980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setIntfRefProtocols(int idx, ObjcProtocolDecl *OID) {
2777ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
2787ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
279980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
280980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
281980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
282980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setSuperClass(ObjcInterfaceDecl * superCls) { SuperClass = superCls; }
283980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2843d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl* getCategoryList() const { return CategoryList; }
2853d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  void setCategoryList(ObjcCategoryDecl *category) {
2863d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff         CategoryList = category;
287980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
2880330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  ObjcIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName,
2890330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff                                       ObjcInterfaceDecl *&clsDeclared);
29058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
29158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
29294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getInstanceMethod(Selector &Sel) {
29358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
29458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
29558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
29658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
29758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
29858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
29958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
30058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
30194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getClassMethod(Selector &Sel) {
30258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
30358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
30458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
30558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
30658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
30758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
30858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
30994a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Lookup a method. First, we search locally. If a method isn't
31094a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // found, we search referenced protocols and class categories.
31194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector Sel);
31294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector Sel);
31360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
314f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
31560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
316f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
317f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
31860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
31960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
320f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
32182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
322ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  int getNumPropertyDecl() const { return NumPropertyDecl; }
32382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecl(int num) { NumPropertyDecl = num; }
32482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
32582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **const getPropertyDecl() const { return PropertyDecl; }
32682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **getPropertyDecl() { return PropertyDecl; }
32782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcPropertyDecl **properties) {
32882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyDecl = properties;
32982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
330f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
3314b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
3324b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
3334b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
3343a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ImplicitInterfaceDecl() const { return InternalInterface; }
3354b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
336aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; }
337980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcInterfaceDecl *D) { return true; }
338980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
339980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC
3410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
3420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
3430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
3450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
3460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
3470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
3480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
3490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
3500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
3510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
3520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
3530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
3540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
355980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl {
356980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
357980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
358980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    : FieldDecl(ObjcIvar, L, Id, T) {}
359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
360980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
361980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
362980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
363980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
364980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl getAccessControl() const { return DeclAccess; }
365980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
366980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
367980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; }
368980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcIvarDecl *D) { return true; }
369980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
370980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl DeclAccess : 3;
371980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
372980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
373980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols
3750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
3760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
3770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
3780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo
3800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
3810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
3820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
3850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and
3880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
3890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
3900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
3910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
3930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
39405672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl {
395980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
396980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
397980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumReferencedProtocols;  // -1 if none
398980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
399980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
4007ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
4017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
402980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
403980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
4047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
4057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
406980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
407980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
408423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
409423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
410423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
411980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
412980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos,
413980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                   IdentifierInfo *Id, bool FD = false)
41405672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian    : NamedDecl(ObjcProtocol, L, Id),
415980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols(0), NumReferencedProtocols(-1),
4167ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
4177ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
418980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      isForwardProtoDecl(FD) {
419980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocReferencedProtocols(numRefProtos);
420980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
421980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
422980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
423980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
424980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
425980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
426980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
427980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
428980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
42960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
43060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
43160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
432980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
433980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
434980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
435980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
436980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
437980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
438980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl** getReferencedProtocols() const {
439980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
440980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
441980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
4427ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
4437ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
44458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
44558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * instmeth_iterator;
44658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
44758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
44858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
44958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
45058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
45158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * classmeth_iterator;
45258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
45358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
45458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
45558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
45658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
45758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
45894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getInstanceMethod(Selector &Sel) {
45958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
46058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
46158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
46258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
46358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
46458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
46558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
46658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
46794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getClassMethod(Selector &Sel) {
46858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
46958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
47058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
47158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
47258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
47358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
47458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
475980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
47694a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Lookup a method. First, we search locally. If a method isn't
47794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // found, we search referenced protocols and class categories.
47894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector Sel);
47994a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector Sel);
4807dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian
481768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
482768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
483980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
484423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
485423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
486423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
487423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
488423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
489423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
490423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
491423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
492aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; }
493980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcProtocolDecl *D) { return true; }
494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
495980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
49606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example:
49706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
49806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
4990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
500ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl {
5017e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcInterfaceDecl **ForwardDecls;
5027e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
50306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
5047e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
505ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian    : Decl(ObjcClass, L) {
50606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
50706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff      ForwardDecls = new ObjcInterfaceDecl*[nElts];
5087e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
5097e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
5107e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
51106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
51206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
51306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5147e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
5157e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
51606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
51706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5187e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
5197e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
5207e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
521aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcClass; }
52206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcClassDecl *D) { return true; }
52306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
52406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
52506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations.
52606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
52706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
5280c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
5290c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5306d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl {
5319fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl **ReferencedProtocols;
5329fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
53306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
534b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner  ObjcForwardProtocolDecl(SourceLocation L,
535b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner                          ObjcProtocolDecl **Elts, unsigned nElts)
5366d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian  : Decl(ObjcForwardProtocol, L) {
537b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
53806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
5397ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[nElts];
540b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*));
5419fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
5429fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
543980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
54406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5459fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) {
5469fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5477ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
54806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
5499fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
5509fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
5519fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
5529fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) {
5539fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5549fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
5559fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
5569fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
5579fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
5589fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
5599fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
5609fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
56106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
56206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    return D->getKind() == ObjcForwardProtocol;
56306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
56406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcForwardProtocolDecl *D) { return true; }
565980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
566980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows
5680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
5690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
5700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
5710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
5720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
5740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
5750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
5760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
5780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
5790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
5810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java)
5820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
5830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
584fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl {
585980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
586980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *ClassInterface;
587980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
588980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols in this category
5897ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
5907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
591980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
592980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
5937ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
5947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
595980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
596980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
5977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
5987ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
599980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
600980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
601980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *NextClassCategory;
602ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
603423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
604423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
605980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
606fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner  ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
607fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner    : NamedDecl(ObjcCategory, L, Id),
608fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1),
6097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
6107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
611e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner      NextClassCategory(0) {
612980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        if (numRefProtocol) {
6137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol];
6147ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          memset(ReferencedProtocols, '\0',
615980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 numRefProtocol*sizeof(ObjcProtocolDecl*));
6167ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          NumReferencedProtocols = numRefProtocol;
617980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        }
618980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
619980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
620980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
621980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; }
622980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
623980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
6247ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
6257ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
626980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
627980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6287ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
6297ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
6308f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
6317ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
6327ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
6337ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
63458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
63558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * instmeth_iterator;
63658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
63758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
63858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
63958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
64058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
64158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  typedef ObjcMethodDecl * const * classmeth_iterator;
64258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
64358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
64458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
64558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
64658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
64758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
64894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getInstanceMethod(Selector &Sel) {
64958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
65058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
65158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
65258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
65358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
65458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
65558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
65658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
65794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getClassMethod(Selector &Sel) {
65858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
65958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	     I != E; ++I) {
66058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
66158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
66258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
66358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff	return 0;
66458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
6658f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
66660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
66760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
66860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
669980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
670980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
671980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
6723d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
6733d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
674980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
675423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
676423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
677423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
678423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
679423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
680423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
681423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
682ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
683aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; }
684980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcCategoryDecl *D) { return true; }
685980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
6860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
6878f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category
6888f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
6896a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl {
6908f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
6918f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
6928f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
693e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented instance methods
694e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
6958f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
696e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented class methods
697e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
698e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
699e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation EndLoc;
700e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroffpublic:
701ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
702ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner                       ObjcInterfaceDecl *classInterface)
703ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    : NamedDecl(ObjcCategoryImpl, L, Id), ClassInterface(classInterface) {}
7048f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
705e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
7068f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
707ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumInstanceMethods() const { return InstanceMethods.size(); }
708ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumClassMethods() const { return ClassMethods.size(); }
709e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
710e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
711e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    InstanceMethods.push_back(method);
712e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
713e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
714e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    ClassMethods.push_back(method);
715e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
71694a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the instance method definition for this implementation.
71794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getInstanceMethod(Selector Sel);
71894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff
71994a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the class method definition for this implementation.
72094a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getClassMethod(Selector Sel);
721e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
722ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
723ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    instmeth_iterator;
724ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
725ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
726ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
727ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
728ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    classmeth_iterator;
729ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
730ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
731ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
732ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
733e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // Location information, modeled after the Stmt API.
734e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
735e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
736e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
737e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
738aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
7398f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  static bool classof(const ObjcCategoryImplDecl *D) { return true; }
7408f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
7418f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
7420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where
7430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
7440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
7460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
7470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
7480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
7500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
7510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
7520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
7530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
7540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
7550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
7560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
7576d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl {
758f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  /// Class interface for this category implementation
759f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
760f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
761980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
762980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
763980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
764980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
765980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not specified
766980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
7670416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
768980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
7690416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
7700416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
771980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
7720416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
7730416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
7740416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation EndLoc;
7759fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic:
776980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id,
777f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *classInterface,
778f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *superDecl)
7796d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian    : NamedDecl(ObjcImplementation, L, Id),
7800416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      ClassInterface(classInterface), SuperClass(superDecl),
7810416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      Ivars(0), NumIvars(-1) {}
782980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
783980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars,
784980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
785980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
7860416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
7870416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    InstanceMethods.push_back(method);
7880416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
7890416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
7900416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    ClassMethods.push_back(method);
7910416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
7920416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // Location information, modeled after the Stmt API.
7930416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
7940416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
7950416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
7960416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
797f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
79893efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
799980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
80093efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  void setSuperClass(ObjcInterfaceDecl * superCls)
801980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { SuperClass = superCls; }
802980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
80349747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getNumInstanceMethods() const { return InstanceMethods.size(); }
80449747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getNumClassMethods() const { return ClassMethods.size(); }
805c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff
80649747fdd0a05dfc1f15910267d6f86dfe83e6fc8Steve Naroff  int getImplDeclNumIvars() const { return NumIvars; }
8070157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8080157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8090157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
8100157c5144513438bb74aebf50d18f95df4104acbChris Lattner       instmeth_iterator;
8110157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
8120157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
8130157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8140157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef llvm::SmallVector<ObjcMethodDecl*, 32>::const_iterator
8150157c5144513438bb74aebf50d18f95df4104acbChris Lattner    classmeth_iterator;
8160157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
8170157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
8180157c5144513438bb74aebf50d18f95df4104acbChris Lattner
81994a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the instance method definition for this implementation.
82094a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getInstanceMethod(Selector Sel);
8210157c5144513438bb74aebf50d18f95df4104acbChris Lattner
82294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the class method definition for this implementation.
82394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  ObjcMethodDecl *getClassMethod(Selector Sel);
8240157c5144513438bb74aebf50d18f95df4104acbChris Lattner
8250157c5144513438bb74aebf50d18f95df4104acbChris Lattner  typedef ObjcIvarDecl * const *ivar_iterator;
8260157c5144513438bb74aebf50d18f95df4104acbChris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
82723c3bb768fd3eb24ff1a7402856405129afac0e3Chris Lattner  ivar_iterator ivar_end() const {return Ivars+(NumIvars == -1 ? 0 : NumIvars);}
8280157c5144513438bb74aebf50d18f95df4104acbChris Lattner
829980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
830980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return D->getKind() == ObjcImplementation;
831980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
832980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcImplementationDecl *D) { return true; }
833980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
834243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
835243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is
836243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
837243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl {
838243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
839243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *AliasedClass;
840243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
841243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic:
842243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
843243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian                         ObjcInterfaceDecl* aliasedClass)
844243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  : ScopedDecl(CompatibleAlias, L, Id, 0),
845243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  AliasedClass(aliasedClass) {}
846243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
847243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; }
848980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
849243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
850243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian    return D->getKind() == CompatibleAlias;
851243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
852243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const ObjcCompatibleAliasDecl *D) { return true; }
853243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
854243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
85582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
85682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianclass ObjcPropertyDecl : public Decl {
85782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
858564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  enum PropertyAttributeKind { OBJC_PR_noattr = 0x0,
85982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readonly = 0x01,
86082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_getter = 0x02,
86182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_assign = 0x04,
86282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readwrite = 0x08,
86382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_retain = 0x10,
86482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_copy = 0x20,
86582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_nonatomic = 0x40,
86682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_setter = 0x80 };
86782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate:
86882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // List of property name declarations
86982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // FIXME: Property is not an ivar.
87082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **PropertyDecls;
87182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecls;
87282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
873564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  PropertyAttributeKind PropertyAttributes : 8;
87482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
87582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *GetterName;    // getter name of NULL if no getter
87682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *SetterName;    // setter name of NULL if no setter
87782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
87882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
87982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl(SourceLocation L)
88082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  : Decl(PropertyDecl, L),
88182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  PropertyDecls(0), NumPropertyDecls(-1), PropertyAttributes(OBJC_PR_noattr),
88282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  GetterName(0), SetterName(0) {}
88382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
88482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **const getPropertyDecls() const { return PropertyDecls; }
88582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcIvarDecl **property) { PropertyDecls = property; }
88682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
88782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecls() const { return NumPropertyDecls; }
88882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecls(int num) { NumPropertyDecls = num; }
88982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
890564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  const PropertyAttributeKind getPropertyAttributes() const
89182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    { return PropertyAttributes; }
892564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  void setPropertyAttributes(PropertyAttributeKind PRVal) {
89382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyAttributes =
894564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian    (PropertyAttributeKind) (PropertyAttributes | PRVal);
89582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
89682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
89782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getGetterName() const { return GetterName; }
89882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getGetterName() { return GetterName; }
89982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setGetterName(IdentifierInfo *Id) { GetterName = Id; }
90082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
90182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getSetterName() const { return SetterName; }
90282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getSetterName() { return SetterName; }
90382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
90482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
90582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const Decl *D) {
90682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    return D->getKind() == PropertyDecl;
90782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
90882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const ObjcPropertyDecl *D) { return true; }
90982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian};
910980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
911980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
912980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
913