DeclObjC.h revision c43d868355374d48296ad3be2c9c536698a5e9a8
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;
30980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcInterfaceDecl - Represents an ObjC class declaration. For example:
320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   // MostPrimitive declares no super class (not particularly useful).
340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface MostPrimitive
350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     // no instance variables or methods.
360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end
370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
38fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner///   // NSResponder inherits from NSObject & implements NSCoding (a protocol).
390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface NSResponder : NSObject <NSCoding>
400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   { // instance variables are represented by ObjcIvarDecl.
410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id nextResponder; // nextResponder instance variable.
420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (NSResponder *)nextResponder; // return a pointer to NSResponder.
440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer
450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end                                    // to an NSEvent.
460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, forward class declarations are accomplished with @class.
480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, @class allows for a list of classes to be forward declared.
490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   typically inherit from NSObject (an exception is NSProxy).
510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
52980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcInterfaceDecl : public TypeDecl {
53980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
54980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Class's super class.
55980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
56980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
57980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Protocols referenced in interface header declaration
587ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
597ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
60980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
61980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
62980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not defined.
63980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
64980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
65980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance methods
667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
677ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
68980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
69980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// class methods
707ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
717ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
72980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
73980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of categories defined for this class.
743d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl *CategoryList;
7582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
7682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  /// class properties
7782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **PropertyDecl;  // Null if no property
7882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecl;  // -1 if no property
79980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
803a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ForwardDecl:1; // declared with @class.
813a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool InternalInterface:1; // true - no @interface for @implementation
8260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
83f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation EndLoc; // marks the '>', '}', or identifier.
84f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
85980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
8660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
873a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    IdentifierInfo *Id, bool FD = false,
883a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian                    bool isInternal = false)
8960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff    : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0),
907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0),
917ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumIvars(-1),
927ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
937ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
9482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      CategoryList(0), PropertyDecl(0), NumPropertyDecl(-1),
9582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian      ForwardDecl(FD), InternalInterface(isInternal) {
96980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocIntfRefProtocols(numRefProtos);
97980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
98a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff
99a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff  // This is necessary when converting a forward declaration to a definition.
100980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocIntfRefProtocols(unsigned numRefProtos) {
101980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
1027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
1037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      memset(ReferencedProtocols, '\0',
104980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
1057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumReferencedProtocols = numRefProtos;
106980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
107980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
108980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
1107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
1117ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  }
1127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumIntfRefProtocols() const { return NumReferencedProtocols; }
113980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
114980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **getIntfDeclIvars() const { return Ivars; }
115980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getIntfDeclNumIvars() const { return NumIvars; }
116980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1177ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
1187ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
119980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1207ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
1217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
122980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
12360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars,
12460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                   SourceLocation RBracLoc);
125980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
12660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
12760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
12860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEnd);
129980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
130768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return ForwardDecl; }
131768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { ForwardDecl = val; }
132980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
133980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setIntfRefProtocols(int idx, ObjcProtocolDecl *OID) {
1347ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
1357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
136980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
137980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
138980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
139980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setSuperClass(ObjcInterfaceDecl * superCls) { SuperClass = superCls; }
140980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1413d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl* getCategoryList() const { return CategoryList; }
1423d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  void setCategoryList(ObjcCategoryDecl *category) {
1433d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff         CategoryList = category;
144980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
1456a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
1466a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
14760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
148f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
14960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
150f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
151f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
15260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
15360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
154f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
15582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
15682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecl() const { return NumPropertyDecl; }
15782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int getNumPropertyDecl() { return NumPropertyDecl; }
15882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecl(int num) { NumPropertyDecl = num; }
15982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
16082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **const getPropertyDecl() const { return PropertyDecl; }
16182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **getPropertyDecl() { return PropertyDecl; }
16282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcPropertyDecl **properties) {
16382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyDecl = properties;
16482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
165f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
1664b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
1674b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
1684b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
1693a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ImplicitInterfaceDecl() const { return InternalInterface; }
1704b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
171aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; }
172980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcInterfaceDecl *D) { return true; }
173980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
174980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC
1760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
1770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
1780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
1800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
1810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
1820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
1830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
1840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
1850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
1860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
1870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
1880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
190980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl {
191980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
192980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
193980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    : FieldDecl(ObjcIvar, L, Id, T) {}
194980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
195980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
196980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
197980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
198980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
199980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl getAccessControl() const { return DeclAccess; }
200980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
201980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
202980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; }
203980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcIvarDecl *D) { return true; }
204980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
205980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl DeclAccess : 3;
206980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
207980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcMethodDecl - Represents an instance or class method declaration.
2090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces,
2100c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// categories, protocols, and class implementations. While C++ member
2110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after
2120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Smalltalk (using colons to specify argument types/expressions).
2130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Here are some brief examples:
2140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2150c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Setter/getter instance methods:
2160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)setMenu:(NSMenu *)menu;
2170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSMenu *)menu;
2180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Instance method that takes 2 NSView arguments:
2200c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
2210c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2220c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Getter class method:
2230c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// + (NSMenu *)defaultMenu;
2240c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2250c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// A selector represents a unique name for a method. The selector names for
2260c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
2270c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcMethodDecl : public Decl {
229980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
230980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum ImplementationControl { None, Required, Optional };
231980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Bitfields must be first fields in this class so they pack with those
233980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// declared in class Decl.
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance (true) or class (false) method.
235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool IsInstance : 1;
236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// @required/@optional
237980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ImplementationControl DeclImplementation : 2;
238980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2398be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  /// in, inout, etc.
2408be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  ObjcDeclQualifier objcDeclQualifier : 6;
2418be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian
2421f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian  // @interface decl this Method belongs to.
2431f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
2441f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian
245980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // A unigue name for this method.
246980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  Selector SelName;
247980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
248980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Type of this method.
249980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  QualType MethodDeclType;
250980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
251980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// parameters of this Method.  This is null if there are no formals.
252980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ParmVarDecl **ParamInfo;
253980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumMethodParams;  // -1 if no parameters
254980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
255980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of attributes for this method declaration.
256980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AttributeList *MethodAttrs;
257980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
25860fbca0b027ff5a6579f16cb6e3abab826e0d967Fariborz Jahanian  Stmt *Body;  // Null if a prototype.
25960fbca0b027ff5a6579f16cb6e3abab826e0d967Fariborz Jahanian
260bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation EndLoc; // the location of the ';' or '{'.
261980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
262bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
263bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff                 Selector SelInfo, QualType T,
2641f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian                 ObjcInterfaceDecl *interfaceDecl,
265980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 ParmVarDecl **paramInfo = 0, int numParams=-1,
266980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 AttributeList *M = 0, bool isInstance = true,
267980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 ImplementationControl impControl = None,
268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 Decl *PrevDecl = 0)
269bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff    : Decl(ObjcMethod, beginLoc),
270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      IsInstance(isInstance), DeclImplementation(impControl),
2718be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian      objcDeclQualifier(OBJC_TQ_None),
2721f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian      ClassInterface(interfaceDecl),
273980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      SelName(SelInfo), MethodDeclType(T),
274980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ParamInfo(paramInfo), NumMethodParams(numParams),
275bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff      MethodAttrs(M), EndLoc(endLoc) {}
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  virtual ~ObjcMethodDecl();
27785ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian
2788be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
279ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
2808be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian
281bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  // Location information, modeled after the Stmt API.
282bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation getLocStart() const { return getLocation(); }
283bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
284bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff
2851f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian  ObjcInterfaceDecl *const getClassInterface() const { return ClassInterface; }
2861f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian
2873bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff  Selector getSelector() const { return SelName; }
2883bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff  QualType getResultType() const { return MethodDeclType; }
2893bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff
29085ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  int getNumParams() const { return NumMethodParams; }
29185ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  ParmVarDecl *getParamDecl(int i) const {
29285ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian    assert(i < getNumParams() && "Illegal param #");
29385ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian    return ParamInfo[i];
29485ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  }
295980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
296980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
297980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AttributeList *getMethodAttrs() const {return MethodAttrs;}
298980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isInstance() const { return IsInstance; }
299980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Related to protocols declared in  @protocol
300980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setDeclImplementation(ImplementationControl ic)
301980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { DeclImplementation = ic; }
302980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ImplementationControl  getImplementationControl() const
303980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                           { return DeclImplementation; }
304980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
30560fbca0b027ff5a6579f16cb6e3abab826e0d967Fariborz Jahanian  Stmt *const getBody() const { return Body; }
30660fbca0b027ff5a6579f16cb6e3abab826e0d967Fariborz Jahanian  void setBody(Stmt *B) { Body = B; }
30760fbca0b027ff5a6579f16cb6e3abab826e0d967Fariborz Jahanian
308980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
309aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
310980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcMethodDecl *D) { return true; }
311980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
312980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols
3140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
3150c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
3160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
3170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo
3190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
3200c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
3210c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3220c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3230c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
3240c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3250c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3260c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and
3270c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
3280c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
3290c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
3300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
3320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
33305672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl {
334980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
335980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
336980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumReferencedProtocols;  // -1 if none
337980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
338980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
3397ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
3407ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
341980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
342980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
3437ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
3447ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
345980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
346980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
347423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
348423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
349423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
350980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
351980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos,
352980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                   IdentifierInfo *Id, bool FD = false)
35305672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian    : NamedDecl(ObjcProtocol, L, Id),
354980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols(0), NumReferencedProtocols(-1),
3557ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
3567ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
357980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      isForwardProtoDecl(FD) {
358980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocReferencedProtocols(numRefProtos);
359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
360980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
361980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
362980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
363980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
364980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
365980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
366980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
367980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
36860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
36960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
37060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
371980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
372980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
373980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
374980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
375980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
376980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
377980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl** getReferencedProtocols() const {
378980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
379980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
380980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
381980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3827ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
3837ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
384980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
3867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
387980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
388768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
389768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
390980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
391423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
392423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
393423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
394423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
395423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
396423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
397423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
398423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
399aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; }
400980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcProtocolDecl *D) { return true; }
401980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
402980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
40306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example:
40406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
40506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
4060c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
407ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl {
4087e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcInterfaceDecl **ForwardDecls;
4097e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
41006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
4117e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
412ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian    : Decl(ObjcClass, L) {
41306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
41406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff      ForwardDecls = new ObjcInterfaceDecl*[nElts];
4157e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
4167e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
4177e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
41806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
41906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
42006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4217e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
4227e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
42306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
42406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4257e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
4267e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
4277e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
428aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcClass; }
42906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcClassDecl *D) { return true; }
43006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
43106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
43206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations.
43306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
43406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
4350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
4360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4376d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl {
4389fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl **ReferencedProtocols;
4399fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
44006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
441b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner  ObjcForwardProtocolDecl(SourceLocation L,
442b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner                          ObjcProtocolDecl **Elts, unsigned nElts)
4436d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian  : Decl(ObjcForwardProtocol, L) {
444b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
44506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
4467ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[nElts];
447b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*));
4489fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
4499fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
450980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
45106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4529fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) {
4539fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4547ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
45506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4569fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
4579fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
4589fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
4599fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) {
4609fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4619fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
4629fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
4639fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
4649fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4659fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
4669fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
4679fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
46806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
46906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    return D->getKind() == ObjcForwardProtocol;
47006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
47106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcForwardProtocolDecl *D) { return true; }
472980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
473980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
4740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows
4750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
4760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
4770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
4780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
4790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
4810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
4820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
4830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
4850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
4860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
4880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java)
4890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
4900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
491fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl {
492980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
493980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *ClassInterface;
494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
495980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols in this category
4967ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
4977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
498980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
499980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
5007ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
5017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
502980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
503980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
5047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
5057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
506980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
507980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
508980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *NextClassCategory;
509ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
510423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
511423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
512980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
513fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner  ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
514fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner    : NamedDecl(ObjcCategory, L, Id),
515fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1),
5167ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
5177ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
518e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner      NextClassCategory(0) {
519980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        if (numRefProtocol) {
5207ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol];
5217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          memset(ReferencedProtocols, '\0',
522980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 numRefProtocol*sizeof(ObjcProtocolDecl*));
5237ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          NumReferencedProtocols = numRefProtocol;
524980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        }
525980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
526980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
527980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
528980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; }
529980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
530980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
5317ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
5327ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
533980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
534980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
5367ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
5378f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
5387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
5398f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5407ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
5417ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
5428f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5437ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
5447ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
5458f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
54660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
54760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
54860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
549980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
550980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
551980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
5523d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
5533d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
554980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
555423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
556423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
557423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
558423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
559423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
560423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
561423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
562ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
563aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; }
564980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcCategoryDecl *D) { return true; }
565980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
5660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
5678f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category
5688f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
5696a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl {
5708f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
5718f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
5728f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5738f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// category instance methods being implemented
5747ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods; // Null if category is not implementing any
5757ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;           // -1 if category is not implementing any
5768f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5778f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// category class methods being implemented
5787ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods; // Null if category is not implementing any
5797ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if category is not implementing any
5808f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5818f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  public:
5828f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
5836a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner                         ObjcInterfaceDecl *classInterface)
5846a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner    : NamedDecl(ObjcCategoryImpl, L, Id),
5858f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ClassInterface(classInterface),
5867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    InstanceMethods(0), NumInstanceMethods(-1),
587e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner    ClassMethods(0), NumClassMethods(-1) {}
5888f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5898f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ObjcInterfaceDecl *getClassInterface() const {
5908f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian      return ClassInterface;
5918f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    }
5928f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5937ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
5947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
5958f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5967ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
5977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
5988f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
59960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
60060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
60160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
6028f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
603aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
6048f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  static bool classof(const ObjcCategoryImplDecl *D) { return true; }
6058f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
6068f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
6070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where
6080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
6090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6100c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
6110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
6120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
6130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
6150c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
6160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
6170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
6180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
6190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
6200c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
6210c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6226d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl {
623f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  /// Class interface for this category implementation
624f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
625f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
626980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
627980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
628980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
629980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
630980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not specified
631980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
632980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
633980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
6347ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
6357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
636980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
637980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
6387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
6397ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
640980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6419fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic:
642980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id,
643f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *classInterface,
644f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *superDecl)
6456d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian    : NamedDecl(ObjcImplementation, L, Id),
646f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian      ClassInterface(classInterface),
647980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      SuperClass(superDecl),
648980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      Ivars(0), NumIvars(-1),
6497ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
6507ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1) {}
651980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
652980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars,
653980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
654980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
65560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
65660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
65760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
658980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
659f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
66093efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
661980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
66293efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  void setSuperClass(ObjcInterfaceDecl * superCls)
663980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { SuperClass = superCls; }
664980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
6667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
667980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6687ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
6697ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
670c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff
671c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
672c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
673f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
674f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcIvarDecl **getImplDeclIVars() const { return Ivars; }
675f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  int getImplDeclNumIvars() const { return NumIvars; }
676980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
677980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
678980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return D->getKind() == ObjcImplementation;
679980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
680980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcImplementationDecl *D) { return true; }
681980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
682243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
683243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is
684243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
685243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl {
686243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
687243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *AliasedClass;
688243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
689243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic:
690243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
691243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian                         ObjcInterfaceDecl* aliasedClass)
692243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  : ScopedDecl(CompatibleAlias, L, Id, 0),
693243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  AliasedClass(aliasedClass) {}
694243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
695243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; }
696980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
697243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
698243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian    return D->getKind() == CompatibleAlias;
699243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
700243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const ObjcCompatibleAliasDecl *D) { return true; }
701243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
702243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
70382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
70482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianclass ObjcPropertyDecl : public Decl {
70582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
706564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  enum PropertyAttributeKind { OBJC_PR_noattr = 0x0,
70782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readonly = 0x01,
70882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_getter = 0x02,
70982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_assign = 0x04,
71082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readwrite = 0x08,
71182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_retain = 0x10,
71282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_copy = 0x20,
71382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_nonatomic = 0x40,
71482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_setter = 0x80 };
71582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate:
71682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // List of property name declarations
71782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // FIXME: Property is not an ivar.
71882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **PropertyDecls;
71982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecls;
72082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
721564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  PropertyAttributeKind PropertyAttributes : 8;
72282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
72382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *GetterName;    // getter name of NULL if no getter
72482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *SetterName;    // setter name of NULL if no setter
72582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
72682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
72782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl(SourceLocation L)
72882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  : Decl(PropertyDecl, L),
72982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  PropertyDecls(0), NumPropertyDecls(-1), PropertyAttributes(OBJC_PR_noattr),
73082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  GetterName(0), SetterName(0) {}
73182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
73282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **const getPropertyDecls() const { return PropertyDecls; }
73382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcIvarDecl **property) { PropertyDecls = property; }
73482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
73582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecls() const { return NumPropertyDecls; }
73682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecls(int num) { NumPropertyDecls = num; }
73782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
738564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  const PropertyAttributeKind getPropertyAttributes() const
73982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    { return PropertyAttributes; }
740564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  void setPropertyAttributes(PropertyAttributeKind PRVal) {
74182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyAttributes =
742564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian    (PropertyAttributeKind) (PropertyAttributes | PRVal);
74382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
74482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
74582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getGetterName() const { return GetterName; }
74682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getGetterName() { return GetterName; }
74782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setGetterName(IdentifierInfo *Id) { GetterName = Id; }
74882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
74982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getSetterName() const { return SetterName; }
75082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getSetterName() { return SetterName; }
75182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
75282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
75382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const Decl *D) {
75482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    return D->getKind() == PropertyDecl;
75582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
75682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const ObjcPropertyDecl *D) { return true; }
75782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian};
758980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
759980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
760980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
761