DeclObjC.h revision 8be9d0a9cdce8baa53844e54f6045c4600274269
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; 29980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcInterfaceDecl - Represents an ObjC class declaration. For example: 310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // MostPrimitive declares no super class (not particularly useful). 330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface MostPrimitive 340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // no instance variables or methods. 350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 37fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner/// // NSResponder inherits from NSObject & implements NSCoding (a protocol). 380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSResponder : NSObject <NSCoding> 390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// { // instance variables are represented by ObjcIvarDecl. 400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id nextResponder; // nextResponder instance variable. 410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSResponder *)nextResponder; // return a pointer to NSResponder. 430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer 440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end // to an NSEvent. 450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, forward class declarations are accomplished with @class. 470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, @class allows for a list of classes to be forward declared. 480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes 490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// typically inherit from NSObject (an exception is NSProxy). 500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 51980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcInterfaceDecl : public TypeDecl { 52980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 53980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Class's super class. 54980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcInterfaceDecl *SuperClass; 55980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 56980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Protocols referenced in interface header declaration 577ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcProtocolDecl **ReferencedProtocols; // Null if none 587ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumReferencedProtocols; // -1 if none 59980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 60980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 61980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcIvarDecl **Ivars; // Null if not defined. 62980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int NumIvars; // -1 if not defined. 63980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 64980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// instance methods 657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **InstanceMethods; // Null if not defined 667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumInstanceMethods; // -1 if not defined 67980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 68980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// class methods 697ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **ClassMethods; // Null if not defined 707ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumClassMethods; // -1 if not defined 71980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 72980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// List of categories defined for this class. 733d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff ObjcCategoryDecl *CategoryList; 74980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 75768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool ForwardDecl; // declared with @class. 7660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 77f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation EndLoc; // marks the '>', '}', or identifier. 78f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 79980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 8060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos, 81980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff IdentifierInfo *Id, bool FD = false) 8260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0), 837ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0), 847ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumIvars(-1), 857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian InstanceMethods(0), NumInstanceMethods(-1), 867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ClassMethods(0), NumClassMethods(-1), 873d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff CategoryList(0), ForwardDecl(FD) { 88980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AllocIntfRefProtocols(numRefProtos); 89980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 90a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff 91a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff // This is necessary when converting a forward declaration to a definition. 92980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocIntfRefProtocols(unsigned numRefProtos) { 93980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos]; 957ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian memset(ReferencedProtocols, '\0', 96980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff numRefProtos*sizeof(ObjcProtocolDecl*)); 977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumReferencedProtocols = numRefProtos; 98980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 99980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 100980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcProtocolDecl **getReferencedProtocols() const { 1027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 1037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian } 1047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumIntfRefProtocols() const { return NumReferencedProtocols; } 105980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 106980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcIvarDecl **getIntfDeclIvars() const { return Ivars; } 107980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int getIntfDeclNumIvars() const { return NumIvars; } 108980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; } 1107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumInstanceMethods() const { return NumInstanceMethods; } 111980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl** getClassMethods() const { return ClassMethods; } 1137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumClassMethods() const { return NumClassMethods; } 114980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 11560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars, 11660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation RBracLoc); 117980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 11860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers, 11960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcMethodDecl **clsMethods, unsigned numClsMembers, 12060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEnd); 121980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 122768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return ForwardDecl; } 123768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { ForwardDecl = val; } 124980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 125980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setIntfRefProtocols(int idx, ObjcProtocolDecl *OID) { 1267ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 1277ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 128980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 129980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 130980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcInterfaceDecl *getSuperClass() const { return SuperClass; } 131980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setSuperClass(ObjcInterfaceDecl * superCls) { SuperClass = superCls; } 132980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1333d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff ObjcCategoryDecl* getCategoryList() const { return CategoryList; } 1343d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff void setCategoryList(ObjcCategoryDecl *category) { 1353d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff CategoryList = category; 136980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 1376a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff ObjcMethodDecl *lookupInstanceMethod(Selector &Sel); 1386a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff ObjcMethodDecl *lookupClassMethod(Selector &Sel); 13960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 140f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff // Location information, modeled after the Stmt API. 14160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 142f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 143f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 14460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 14560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff // We also need to record the @end location. 146f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 147f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff 1484b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// ImplicitInterfaceDecl - check that this is an implicitely declared 1494b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation 1504b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// declaration without an @interface declaration. 1514b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian bool ImplicitInterfaceDecl() const { return getLocation().isInvalid(); } 1524b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian 153aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; } 154980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcInterfaceDecl *D) { return true; } 155980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 156980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC 1580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C 1590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example: 1600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 1610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface IvarExample : NSObject 1620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// { 1630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id defaultToPrivate; // same as C++. 1640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @public: 1650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePublic; // same as C++. 1660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protected: 1670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBeProtected; // same as C++. 1680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @package: 1690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePackage; // framework visibility (not available in C++). 1700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 1710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 172980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl { 173980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 174980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T) 175980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff : FieldDecl(ObjcIvar, L, Id, T) {} 176980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 177980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff enum AccessControl { 178980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff None, Private, Protected, Public, Package 179980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff }; 180980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setAccessControl(AccessControl ac) { DeclAccess = ac; } 181980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AccessControl getAccessControl() const { return DeclAccess; } 182980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 183980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Implement isa/cast/dyncast/etc. 184980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; } 185980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcIvarDecl *D) { return true; } 186980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate: 187980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AccessControl DeclAccess : 3; 188980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 189980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcMethodDecl - Represents an instance or class method declaration. 1910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces, 1920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// categories, protocols, and class implementations. While C++ member 1930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after 1940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Smalltalk (using colons to specify argument types/expressions). 1950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Here are some brief examples: 1960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 1970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Setter/getter instance methods: 1980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)setMenu:(NSMenu *)menu; 1990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSMenu *)menu; 2000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Instance method that takes 2 NSView arguments: 2020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView; 2030c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Getter class method: 2050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// + (NSMenu *)defaultMenu; 2060c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// A selector represents a unique name for a method. The selector names for 2080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu. 2090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 210980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcMethodDecl : public Decl { 211980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 212980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff enum ImplementationControl { None, Required, Optional }; 213980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate: 214980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Bitfields must be first fields in this class so they pack with those 215980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// declared in class Decl. 216980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// instance (true) or class (false) method. 217980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff bool IsInstance : 1; 218980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// @required/@optional 219980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ImplementationControl DeclImplementation : 2; 220980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 2218be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian /// in, inout, etc. 2228be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian ObjcDeclQualifier objcDeclQualifier : 6; 2238be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian 224980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // A unigue name for this method. 225980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff Selector SelName; 226980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Type of this method. 228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff QualType MethodDeclType; 229980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// ParamInfo - new[]'d array of pointers to VarDecls for the formal 230980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// parameters of this Method. This is null if there are no formals. 231980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ParmVarDecl **ParamInfo; 232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int NumMethodParams; // -1 if no parameters 233980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// List of attributes for this method declaration. 235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AttributeList *MethodAttrs; 236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 237bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff SourceLocation EndLoc; // the location of the ';' or '{'. 238980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 239bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc, 240bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff Selector SelInfo, QualType T, 241980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ParmVarDecl **paramInfo = 0, int numParams=-1, 242980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AttributeList *M = 0, bool isInstance = true, 243980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ImplementationControl impControl = None, 244980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff Decl *PrevDecl = 0) 245bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff : Decl(ObjcMethod, beginLoc), 246980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff IsInstance(isInstance), DeclImplementation(impControl), 2478be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian objcDeclQualifier(OBJC_TQ_None), 248980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff SelName(SelInfo), MethodDeclType(T), 249980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ParamInfo(paramInfo), NumMethodParams(numParams), 250bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff MethodAttrs(M), EndLoc(endLoc) {} 251980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff virtual ~ObjcMethodDecl(); 25285ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian 2538be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; } 2548be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian 255bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff // Location information, modeled after the Stmt API. 256bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff SourceLocation getLocStart() const { return getLocation(); } 257bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 258bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff 2593bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff Selector getSelector() const { return SelName; } 2603bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff QualType getResultType() const { return MethodDeclType; } 2613bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff 26285ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian int getNumParams() const { return NumMethodParams; } 26385ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian ParmVarDecl *getParamDecl(int i) const { 26485ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian assert(i < getNumParams() && "Illegal param #"); 26585ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian return ParamInfo[i]; 26685ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian } 267980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams); 268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AttributeList *getMethodAttrs() const {return MethodAttrs;} 270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff bool isInstance() const { return IsInstance; } 271980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Related to protocols declared in @protocol 272980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setDeclImplementation(ImplementationControl ic) 273980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff { DeclImplementation = ic; } 274980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ImplementationControl getImplementationControl() const 275980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff { return DeclImplementation; } 276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 277980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Implement isa/cast/dyncast/etc. 278aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; } 279980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcMethodDecl *D) { return true; } 280980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 281980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 2820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols 2830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted). 2840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++ 2850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example: 2860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo 2880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow; 2890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage; 2900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 2910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo> 2930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 2940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and 2960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both 2970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result, 2980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows: 2990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 3000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo; 3010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 30205672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl { 303980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// referenced protocols 304980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcProtocolDecl **ReferencedProtocols; // Null if none 305980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int NumReferencedProtocols; // -1 if none 306980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 307980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol instance methods 3087ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **InstanceMethods; // Null if not defined 3097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumInstanceMethods; // -1 if not defined 310980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 311980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol class methods 3127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **ClassMethods; // Null if not defined 3137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumClassMethods; // -1 if not defined 314980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 315980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff bool isForwardProtoDecl; // declared with @protocol. 316423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 317423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 318423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 319980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 320980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos, 321980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff IdentifierInfo *Id, bool FD = false) 32205672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian : NamedDecl(ObjcProtocol, L, Id), 323980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ReferencedProtocols(0), NumReferencedProtocols(-1), 3247ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian InstanceMethods(0), NumInstanceMethods(-1), 3257ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ClassMethods(0), NumClassMethods(-1), 326980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff isForwardProtoDecl(FD) { 327980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AllocReferencedProtocols(numRefProtos); 328980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 329980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocReferencedProtocols(unsigned numRefProtos) { 330980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 331980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos]; 332980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff memset(ReferencedProtocols, '\0', 333980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff numRefProtos*sizeof(ObjcProtocolDecl*)); 334980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff NumReferencedProtocols = numRefProtos; 335980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 336980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 33760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers, 33860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcMethodDecl **clsMethods, unsigned numClsMembers, 33960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 340980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 341980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) { 342980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff assert((idx < NumReferencedProtocols) && "index out of range"); 343980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ReferencedProtocols[idx] = OID; 344980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 345980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 346980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcProtocolDecl** getReferencedProtocols() const { 347980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff return ReferencedProtocols; 348980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 349980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int getNumReferencedProtocols() const { return NumReferencedProtocols; } 350980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 3517ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; } 3527ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumInstanceMethods() const { return NumInstanceMethods; } 353980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 3547ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl** getClassMethods() const { return ClassMethods; } 3557ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumClassMethods() const { return NumClassMethods; } 356980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 357768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return isForwardProtoDecl; } 358768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { isForwardProtoDecl = val; } 359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 360423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 361423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'protocol 362423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 363423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 364423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 365423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 366423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 367423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 368aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; } 369980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcProtocolDecl *D) { return true; } 370980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 371980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 37206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example: 37306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 37406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow; 3750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 376ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl { 3777e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner ObjcInterfaceDecl **ForwardDecls; 3787e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner unsigned NumForwardDecls; 37906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic: 3807e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts) 381ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian : Decl(ObjcClass, L) { 38206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 38306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff ForwardDecls = new ObjcInterfaceDecl*[nElts]; 3847e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*)); 3857e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner } else { 3867e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner ForwardDecls = 0; 38706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 38806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff NumForwardDecls = nElts; 38906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 3907e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) { 3917e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner assert(idx < NumForwardDecls && "index out of range"); 39206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff ForwardDecls[idx] = OID; 39306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 3947e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; } 3957e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff int getNumForwardDecls() const { return NumForwardDecls; } 3967e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff 397aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcClass; } 39806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff static bool classof(const ObjcClassDecl *D) { return true; } 39906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff}; 40006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff 40106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations. 40206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example: 40306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 4040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo; 4050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4066d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl { 4079fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner ObjcProtocolDecl **ReferencedProtocols; 4089fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned NumReferencedProtocols; 40906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic: 410b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner ObjcForwardProtocolDecl(SourceLocation L, 411b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner ObjcProtocolDecl **Elts, unsigned nElts) 4126d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian : Decl(ObjcForwardProtocol, L) { 413b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner NumReferencedProtocols = nElts; 41406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 4157ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols = new ObjcProtocolDecl*[nElts]; 416b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*)); 4179fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } else { 4189fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner ReferencedProtocols = 0; 419980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 42006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 4219fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) { 4229fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 4237ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 42406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 4259fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 4269fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned getNumForwardDecls() const { return NumReferencedProtocols; } 4279fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 4289fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) { 4299fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 4309fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 4319fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 4329fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const { 4339fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 4349fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 4359fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 4369fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 43706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff static bool classof(const Decl *D) { 43806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff return D->getKind() == ObjcForwardProtocol; 43906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 44006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff static bool classof(const ObjcForwardProtocolDecl *D) { return true; } 441980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 442980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 4430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows 4440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying 4450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow 4460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all 4470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process: 4480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods) 4500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod; 4510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 4520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across 4540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++). 4550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common 4570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java) 4580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous. 4590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 460fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl { 461980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Interface belonging to this category 462980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcInterfaceDecl *ClassInterface; 463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 464980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// referenced protocols in this category 4657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcProtocolDecl **ReferencedProtocols; // Null if none 4667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumReferencedProtocols; // -1 if none 467980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 468980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category instance methods 4697ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **InstanceMethods; // Null if not defined 4707ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumInstanceMethods; // -1 if not defined 471980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 472980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category class methods 4737ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **ClassMethods; // Null if not defined 4747ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumClassMethods; // -1 if not defined 475980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 476980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Next category belonging to this class 477980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcCategoryDecl *NextClassCategory; 478ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 479423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 480423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 481980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic: 482fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id) 483fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner : NamedDecl(ObjcCategory, L, Id), 484fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1), 4857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian InstanceMethods(0), NumInstanceMethods(-1), 4867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ClassMethods(0), NumClassMethods(-1), 487e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner NextClassCategory(0) { 488980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtocol) { 4897ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol]; 4907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian memset(ReferencedProtocols, '\0', 491980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff numRefProtocol*sizeof(ObjcProtocolDecl*)); 4927ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumReferencedProtocols = numRefProtocol; 493980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 495980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 496980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; } 497980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; } 498980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 499980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) { 5007ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 5017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 502980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 503980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 5047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcProtocolDecl **getReferencedProtocols() const { 5057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 5068f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 5077ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumReferencedProtocols() const { return NumReferencedProtocols; } 5088f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; } 5107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumInstanceMethods() const { return NumInstanceMethods; } 5118f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getClassMethods() const { return ClassMethods; } 5137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumClassMethods() const { return NumClassMethods; } 5148f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 51560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers, 51660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcMethodDecl **clsMethods, unsigned numClsMembers, 51760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 518980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 519980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; } 520980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void insertNextClassCategory() { 5213d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff NextClassCategory = ClassInterface->getCategoryList(); 5223d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff ClassInterface->setCategoryList(this); 523980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 524423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 525423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 526423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 527423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 528423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 529423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 530423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 531ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 532aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; } 533980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcCategoryDecl *D) { return true; } 534980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 5350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff 5368f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category 5378f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration. 5386a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl { 5398f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian /// Class interface for this category implementation 5408f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian ObjcInterfaceDecl *ClassInterface; 5418f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5428f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian /// category instance methods being implemented 5437ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **InstanceMethods; // Null if category is not implementing any 5447ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumInstanceMethods; // -1 if category is not implementing any 5458f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5468f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian /// category class methods being implemented 5477ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **ClassMethods; // Null if category is not implementing any 5487ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumClassMethods; // -1 if category is not implementing any 5498f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5508f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian public: 5518f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id, 5526a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner ObjcInterfaceDecl *classInterface) 5536a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner : NamedDecl(ObjcCategoryImpl, L, Id), 5548f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian ClassInterface(classInterface), 5557ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian InstanceMethods(0), NumInstanceMethods(-1), 556e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner ClassMethods(0), NumClassMethods(-1) {} 5578f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5588f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian ObjcInterfaceDecl *getClassInterface() const { 5598f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian return ClassInterface; 5608f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 5618f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5627ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; } 5637ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumInstanceMethods() const { return NumInstanceMethods; } 5648f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getClassMethods() const { return ClassMethods; } 5667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumClassMethods() const { return NumClassMethods; } 5678f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 56860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers, 56960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcMethodDecl **clsMethods, unsigned numClsMembers, 57060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 5718f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 572aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;} 5738f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian static bool classof(const ObjcCategoryImplDecl *D) { return true; } 5748f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian}; 5758f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 5760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where 5770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example: 5780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 5790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass 5800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ } 5810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 5820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 5830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface, 5840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we 5850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When 5860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we 5870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing 5880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations 5890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-) 5900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 5916d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl { 592f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian /// Class interface for this category implementation 593f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ObjcInterfaceDecl *ClassInterface; 594f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian 595980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Implementation Class's super class. 596980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcInterfaceDecl *SuperClass; 597980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 598980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 599980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcIvarDecl **Ivars; // Null if not specified 600980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff int NumIvars; // -1 if not defined. 601980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 602980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented instance methods 6037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **InstanceMethods; // Null if not defined 6047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumInstanceMethods; // -1 if not defined 605980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 606980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented class methods 6077ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **ClassMethods; // Null if not defined 6087ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int NumClassMethods; // -1 if not defined 609980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 6109fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic: 611980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id, 612f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ObjcInterfaceDecl *classInterface, 613f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ObjcInterfaceDecl *superDecl) 6146d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian : NamedDecl(ObjcImplementation, L, Id), 615f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ClassInterface(classInterface), 616980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff SuperClass(superDecl), 617980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff Ivars(0), NumIvars(-1), 6187ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian InstanceMethods(0), NumInstanceMethods(-1), 6197ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ClassMethods(0), NumClassMethods(-1) {} 620980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 621980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars, 622980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff unsigned numIvars); 623980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 62460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers, 62560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff ObjcMethodDecl **clsMethods, unsigned numClsMembers, 62660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 627980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 628f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; } 62993efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian ObjcInterfaceDecl *getSuperClass() const { return SuperClass; } 630980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 63193efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian void setSuperClass(ObjcInterfaceDecl * superCls) 632980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff { SuperClass = superCls; } 633980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 6347ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; } 6357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumInstanceMethods() const { return NumInstanceMethods; } 636980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 6377ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ObjcMethodDecl **getClassMethods() const { return ClassMethods; } 6387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian int getNumClassMethods() const { return NumClassMethods; } 639f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian 640f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian ObjcIvarDecl **getImplDeclIVars() const { return Ivars; } 641f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian int getImplDeclNumIvars() const { return NumIvars; } 642980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 643980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const Decl *D) { 644980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff return D->getKind() == ObjcImplementation; 645980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 646980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const ObjcImplementationDecl *D) { return true; } 647980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 648243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 649243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is 650243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class. 651243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl { 652243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian /// Class that this is an alias of. 653243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian ObjcInterfaceDecl *AliasedClass; 654243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 655243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic: 656243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id, 657243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian ObjcInterfaceDecl* aliasedClass) 658243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian : ScopedDecl(CompatibleAlias, L, Id, 0), 659243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian AliasedClass(aliasedClass) {} 660243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 661243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; } 662980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 663243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian static bool classof(const Decl *D) { 664243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian return D->getKind() == CompatibleAlias; 665243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian } 666243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian static bool classof(const ObjcCompatibleAliasDecl *D) { return true; } 667243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 668243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian}; 669980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 670980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff} // end namespace clang 671980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif 672