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