DeclObjC.h revision b245a33e6f562377946dc9cb5694a2d3cb8a98a3
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;
30b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
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
1140330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  ObjcIvarDecl **getInstanceVariables() const { return Ivars; }
1150330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  int getNumInstanceVariables() 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  }
1450330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff  ObjcIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName,
1460330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff                                       ObjcInterfaceDecl *&clsDeclared);
1476a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
1486a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
14960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
150f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
15160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
152f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
153f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
15460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
15560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
156f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
15782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
15882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecl() const { return NumPropertyDecl; }
15982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int getNumPropertyDecl() { return NumPropertyDecl; }
16082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecl(int num) { NumPropertyDecl = num; }
16182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
16282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **const getPropertyDecl() const { return PropertyDecl; }
16382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl **getPropertyDecl() { return PropertyDecl; }
16482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcPropertyDecl **properties) {
16582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyDecl = properties;
16682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
167f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
1684b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
1694b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
1704b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
1713a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ImplicitInterfaceDecl() const { return InternalInterface; }
1724b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
173aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; }
174980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcInterfaceDecl *D) { return true; }
175980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
176980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC
1780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
1790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
1800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
1820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
1830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
1840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
1850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
1860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
1870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
1880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
1890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
1900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
192980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl {
193980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
194980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
195980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    : FieldDecl(ObjcIvar, L, Id, T) {}
196980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
197980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
198980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
199980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
200980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
201980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl getAccessControl() const { return DeclAccess; }
202980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
203980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
204980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; }
205980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcIvarDecl *D) { return true; }
206980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
207980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl DeclAccess : 3;
208980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
209980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
210980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols
2120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
2130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
2140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
2150c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo
2170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
2180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
2190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
2200c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2210c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
2220c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
2230c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2240c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and
2250c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
2260c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
2270c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
2280c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2290c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
2300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
23105672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl {
232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
233980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumReferencedProtocols;  // -1 if none
235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
2377ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
2387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
239980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
240980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
2417ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
2427ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
243980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
244980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
245423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
246423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
247423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
248980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
249980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos,
250980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                   IdentifierInfo *Id, bool FD = false)
25105672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian    : NamedDecl(ObjcProtocol, L, Id),
252980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols(0), NumReferencedProtocols(-1),
2537ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
2547ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
255980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      isForwardProtoDecl(FD) {
256980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocReferencedProtocols(numRefProtos);
257980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
258980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
259980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
260980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
261980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
262980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
263980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
264980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
265980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
26660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
26760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
26860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
271980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
272980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
273980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
274980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
275980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl** getReferencedProtocols() const {
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
277980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
278980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
279980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2807ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
2817ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
282980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2837ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
2847ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
285980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
286768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
287768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
288980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
289423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
290423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
291423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
292423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
293423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
294423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
295423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
296423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
297aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; }
298980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcProtocolDecl *D) { return true; }
299980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
300980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
30106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example:
30206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
30306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
3040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
305ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl {
3067e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcInterfaceDecl **ForwardDecls;
3077e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
30806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
3097e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
310ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian    : Decl(ObjcClass, L) {
31106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
31206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff      ForwardDecls = new ObjcInterfaceDecl*[nElts];
3137e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
3147e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
3157e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
31606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
31706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
31806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3197e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
3207e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
32106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
32206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3237e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
3247e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
3257e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
326aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcClass; }
32706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcClassDecl *D) { return true; }
32806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
32906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
33006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations.
33106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
33206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
3330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
3340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3356d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl {
3369fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl **ReferencedProtocols;
3379fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
33806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
339b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner  ObjcForwardProtocolDecl(SourceLocation L,
340b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner                          ObjcProtocolDecl **Elts, unsigned nElts)
3416d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian  : Decl(ObjcForwardProtocol, L) {
342b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
34306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
3447ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[nElts];
345b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*));
3469fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
3479fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
348980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
34906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3509fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) {
3519fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
3527ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
35306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3549fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
3559fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
3569fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
3579fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) {
3589fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
3599fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
3609fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
3619fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
3629fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
3639fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
3649fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
3659fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
36606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
36706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    return D->getKind() == ObjcForwardProtocol;
36806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
36906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcForwardProtocolDecl *D) { return true; }
370980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
371980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows
3730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
3740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
3750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
3760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
3770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
3790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
3800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
3810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
3830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
3840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
3860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java)
3870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
3880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
389fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl {
390980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
391980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *ClassInterface;
392980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
393980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols in this category
3947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
3957ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
396980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
397980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
3987ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
3997ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
400980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
401980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
4027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
4037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
404980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
405980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
406980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *NextClassCategory;
407ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
408423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
409423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
410980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
411fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner  ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
412fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner    : NamedDecl(ObjcCategory, L, Id),
413fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1),
4147ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
4157ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
416e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner      NextClassCategory(0) {
417980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        if (numRefProtocol) {
4187ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol];
4197ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          memset(ReferencedProtocols, '\0',
420980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 numRefProtocol*sizeof(ObjcProtocolDecl*));
4217ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          NumReferencedProtocols = numRefProtocol;
422980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        }
423980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
424980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
425980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
426980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; }
427980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
428980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
4297ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
4307ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
431980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
432980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
4337ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
4347ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
4358f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
4367ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
4378f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
4387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
4397ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
4408f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
4417ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
4427ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
4438f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
44460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
44560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
44660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
447980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
448980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
449980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
4503d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
4513d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
452980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
453423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
454423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
455423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
456423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
457423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
458423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
459423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
460ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
461aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; }
462980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcCategoryDecl *D) { return true; }
463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
4640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
4658f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category
4668f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
4676a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl {
4688f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
4698f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
4708f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
471e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented instance methods
472e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
4738f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
474e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented class methods
475e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
476e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
477e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation EndLoc;
478e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroffpublic:
4798f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
4806a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner                         ObjcInterfaceDecl *classInterface)
4816a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner    : NamedDecl(ObjcCategoryImpl, L, Id),
482e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    ClassInterface(classInterface) {}
4838f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
484e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
4858f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
486e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // FIXME: Figure out how to remove the const pointer below.
487e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *const*getInstanceMethods() const {
488e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    return &InstanceMethods[0];
489e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
490e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  int getNumInstanceMethods() const { return InstanceMethods.size(); }
4918f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
492e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // FIXME: Figure out how to remove the const pointer below.
493e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *const*getClassMethods() const {
494e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    return &ClassMethods[0];
495e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
496e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  int getNumClassMethods() const { return ClassMethods.size(); }
497e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
498e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
499e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    InstanceMethods.push_back(method);
500e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
501e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
502e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    ClassMethods.push_back(method);
503e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
504e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
505e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
506e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
507e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // Location information, modeled after the Stmt API.
508e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
509e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
510e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
511e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
512aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
5138f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  static bool classof(const ObjcCategoryImplDecl *D) { return true; }
5148f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
5158f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where
5170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
5180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
5200c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
5210c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
5220c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5230c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
5240c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
5250c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
5260c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
5270c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
5280c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
5290c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
5300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5316d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl {
532f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  /// Class interface for this category implementation
533f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
534f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
535980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
536980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
537980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
538980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
539980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not specified
540980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
5410416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
542980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
5430416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> InstanceMethods;
5440416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
545980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
5460416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  llvm::SmallVector<ObjcMethodDecl*, 32> ClassMethods;
5470416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
5480416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation EndLoc;
5499fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic:
550980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id,
551f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *classInterface,
552f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *superDecl)
5536d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian    : NamedDecl(ObjcImplementation, L, Id),
5540416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      ClassInterface(classInterface), SuperClass(superDecl),
5550416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      Ivars(0), NumIvars(-1) {}
556980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
557980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars,
558980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
559980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5600416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addInstanceMethod(ObjcMethodDecl *method) {
5610416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    InstanceMethods.push_back(method);
5620416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
5630416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void addClassMethod(ObjcMethodDecl *method) {
5640416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    ClassMethods.push_back(method);
5650416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
5660416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // Location information, modeled after the Stmt API.
5670416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
5680416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
5690416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
5700416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
571f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
57293efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
573980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
57493efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  void setSuperClass(ObjcInterfaceDecl * superCls)
575980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { SuperClass = superCls; }
576980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5770416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // FIXME: Figure out how to remove the const pointer below.
5780416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  ObjcMethodDecl *const*getInstanceMethods() const {
5790416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    return &InstanceMethods[0];
5800416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
5810416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  int getNumInstanceMethods() const { return InstanceMethods.size(); }
582980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5830416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // FIXME: Figure out how to remove the const pointer below.
5840416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  ObjcMethodDecl *const*getClassMethods() const {
5850416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    return &ClassMethods[0];
5860416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
5870416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  int getNumClassMethods() const { return ClassMethods.size(); }
588c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff
589c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
590c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
591f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
592f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcIvarDecl **getImplDeclIVars() const { return Ivars; }
593f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  int getImplDeclNumIvars() const { return NumIvars; }
594980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
595980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
596980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return D->getKind() == ObjcImplementation;
597980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
598980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcImplementationDecl *D) { return true; }
599980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
600243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
601b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// ObjcMethodDecl - Represents an instance or class method declaration.
602b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// ObjC methods can be declared within 4 contexts: class interfaces,
603b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// categories, protocols, and class implementations. While C++ member
604b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// functions leverage C syntax, Objective-C method syntax is modeled after
605b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// Smalltalk (using colons to specify argument types/expressions).
606b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// Here are some brief examples:
607b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian///
608b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// Setter/getter instance methods:
609b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// - (void)setMenu:(NSMenu *)menu;
610b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// - (NSMenu *)menu;
611b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian///
612b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// Instance method that takes 2 NSView arguments:
613b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
614b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian///
615b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// Getter class method:
616b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// + (NSMenu *)defaultMenu;
617b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian///
618b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// A selector represents a unique name for a method. The selector names for
619b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
620b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian///
621b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanianclass ObjcMethodDecl : public Decl {
622b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian  public:
623b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    enum ImplementationControl { None, Required, Optional };
624b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian  private:
625b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// Bitfields must be first fields in this class so they pack with those
626b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// declared in class Decl.
627b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// instance (true) or class (false) method.
628b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    bool IsInstance : 1;
629b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// @required/@optional
630b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ImplementationControl DeclImplementation : 2;
631b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
632b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// in, inout, etc.
633b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ObjcDeclQualifier objcDeclQualifier : 6;
634b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
635b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // Context this method is declared in.
636b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    NamedDecl *MethodContext;
637b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
638b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // A unigue name for this method.
639b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    Selector SelName;
640b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
641b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // Type of this method.
642b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    QualType MethodDeclType;
643b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
644b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// parameters of this Method.  This is null if there are no formals.
645b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ParmVarDecl **ParamInfo;
646b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    int NumMethodParams;  // -1 if no parameters
647b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
648b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    /// List of attributes for this method declaration.
649b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    AttributeList *MethodAttrs;
650b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
651b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    Stmt *Body;  // Null if a prototype.
652b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
653b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    SourceLocation EndLoc; // the location of the ';' or '{'.
654b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian  public:
655b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
656b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   Selector SelInfo, QualType T,
657b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   Decl *contextDecl,
658b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   ParmVarDecl **paramInfo = 0, int numParams=-1,
659b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   AttributeList *M = 0, bool isInstance = true,
660b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   ImplementationControl impControl = None,
661b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian                   Decl *PrevDecl = 0)
662b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    : Decl(ObjcMethod, beginLoc),
663b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    IsInstance(isInstance), DeclImplementation(impControl),
664b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    objcDeclQualifier(OBJC_TQ_None),
665b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    MethodContext(static_cast<NamedDecl*>(contextDecl)),
666b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    SelName(SelInfo), MethodDeclType(T),
667b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ParamInfo(paramInfo), NumMethodParams(numParams),
668b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    MethodAttrs(M), EndLoc(endLoc) {}
669b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    virtual ~ObjcMethodDecl();
670b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
671b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
672b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
673b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
674b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // Location information, modeled after the Stmt API.
675b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    SourceLocation getLocStart() const { return getLocation(); }
676b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    SourceLocation getLocEnd() const { return EndLoc; }
677b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
678b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    NamedDecl *getMethodContext() const { return MethodContext; }
679b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
680b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ObjcInterfaceDecl *const getClassInterface() const {
681b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      if (isa<ObjcInterfaceDecl>(MethodContext))
682b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian        return dyn_cast<ObjcInterfaceDecl>(MethodContext);
683b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      else if (isa<ObjcCategoryDecl>(MethodContext))
684b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian        return dyn_cast<ObjcCategoryDecl>(MethodContext)->getClassInterface();
685b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      else if (isa<ObjcImplementationDecl>(MethodContext))
686b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian        return dyn_cast<ObjcImplementationDecl>(MethodContext)
687b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian        ->getClassInterface();
688b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      else if (isa<ObjcCategoryImplDecl>(MethodContext))
689b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian        return dyn_cast<ObjcCategoryImplDecl>(MethodContext)->getClassInterface();
690b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      assert(false && "unknown method context");
691b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      return 0;
692b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    }
693b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
694b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    Selector getSelector() const { return SelName; }
695b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    QualType getResultType() const { return MethodDeclType; }
696b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
697b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    int getNumParams() const { return NumMethodParams; }
698b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ParmVarDecl *getParamDecl(int i) const {
699b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      assert(i < getNumParams() && "Illegal param #");
700b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian      return ParamInfo[i];
701b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    }
702b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
703b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
704b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    AttributeList *getMethodAttrs() const {return MethodAttrs;}
705b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    bool isInstance() const { return IsInstance; }
706b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // Related to protocols declared in  @protocol
707b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    void setDeclImplementation(ImplementationControl ic)
708b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    { DeclImplementation = ic; }
709b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    ImplementationControl  getImplementationControl() const
710b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    { return DeclImplementation; }
711b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
712b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    Stmt *const getBody() const { return Body; }
713b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    void setBody(Stmt *B) { Body = B; }
714b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
715b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    // Implement isa/cast/dyncast/etc.
716b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
717b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian    static bool classof(const ObjcMethodDecl *D) { return true; }
718b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian};
719b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
720243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is
721243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
722243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl {
723243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
724243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *AliasedClass;
725243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
726243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic:
727243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
728243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian                         ObjcInterfaceDecl* aliasedClass)
729243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  : ScopedDecl(CompatibleAlias, L, Id, 0),
730243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  AliasedClass(aliasedClass) {}
731243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
732243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; }
733980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
734243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
735243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian    return D->getKind() == CompatibleAlias;
736243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
737243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const ObjcCompatibleAliasDecl *D) { return true; }
738243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
739243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
74082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
74182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianclass ObjcPropertyDecl : public Decl {
74282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
743564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  enum PropertyAttributeKind { OBJC_PR_noattr = 0x0,
74482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readonly = 0x01,
74582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_getter = 0x02,
74682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_assign = 0x04,
74782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_readwrite = 0x08,
74882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_retain = 0x10,
74982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_copy = 0x20,
75082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_nonatomic = 0x40,
75182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian                       OBJC_PR_setter = 0x80 };
75282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate:
75382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // List of property name declarations
75482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  // FIXME: Property is not an ivar.
75582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **PropertyDecls;
75682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  int NumPropertyDecls;
75782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
758564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  PropertyAttributeKind PropertyAttributes : 8;
75982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
76082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *GetterName;    // getter name of NULL if no getter
76182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *SetterName;    // setter name of NULL if no setter
76282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
76382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
76482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcPropertyDecl(SourceLocation L)
76582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  : Decl(PropertyDecl, L),
76682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  PropertyDecls(0), NumPropertyDecls(-1), PropertyAttributes(OBJC_PR_noattr),
76782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  GetterName(0), SetterName(0) {}
76882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
76982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  ObjcIvarDecl **const getPropertyDecls() const { return PropertyDecls; }
77082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setPropertyDecls(ObjcIvarDecl **property) { PropertyDecls = property; }
77182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
77282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const int getNumPropertyDecls() const { return NumPropertyDecls; }
77382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setNumPropertyDecls(int num) { NumPropertyDecls = num; }
77482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
775564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  const PropertyAttributeKind getPropertyAttributes() const
77682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    { return PropertyAttributes; }
777564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  void setPropertyAttributes(PropertyAttributeKind PRVal) {
77882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    PropertyAttributes =
779564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian    (PropertyAttributeKind) (PropertyAttributes | PRVal);
78082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
78182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
78282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getGetterName() const { return GetterName; }
78382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getGetterName() { return GetterName; }
78482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setGetterName(IdentifierInfo *Id) { GetterName = Id; }
78582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
78682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  const IdentifierInfo *getSetterName() const { return SetterName; }
78782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *getSetterName() { return SetterName; }
78882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
78982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
79082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const Decl *D) {
79182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian    return D->getKind() == PropertyDecl;
79282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
79382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const ObjcPropertyDecl *D) { return true; }
79482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian};
795980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
796980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
797980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
798