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