DeclObjC.cpp revision b06fa3b86951b9f179c99c3768331536c32e902d
11e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===--- DeclObjC.cpp - ObjC Declaration AST Node Implementation ----------===// 21e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// 31e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// The LLVM Compiler Infrastructure 41e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// 51e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// This file is distributed under the University of Illinois Open Source 61e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// License. See LICENSE.TXT for details. 71e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// 81e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===// 91e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// 101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// This file implements the Objective-C related Decl classes. 111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// 121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===// 131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner#include "clang/AST/DeclObjC.h" 151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner#include "clang/AST/ASTContext.h" 161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnerusing namespace clang; 171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 186c4ae5de0c356777446f823b573821fb95560d91Chris Lattner//===----------------------------------------------------------------------===// 196c4ae5de0c356777446f823b573821fb95560d91Chris Lattner// ObjC Decl Allocation/Deallocation Method Implementations 206c4ae5de0c356777446f823b573821fb95560d91Chris Lattner//===----------------------------------------------------------------------===// 216c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 226c4ae5de0c356777446f823b573821fb95560d91Chris LattnerObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, 236c4ae5de0c356777446f823b573821fb95560d91Chris Lattner SourceLocation endLoc, 246c4ae5de0c356777446f823b573821fb95560d91Chris Lattner Selector SelInfo, QualType T, 256c4ae5de0c356777446f823b573821fb95560d91Chris Lattner Decl *contextDecl, 266c4ae5de0c356777446f823b573821fb95560d91Chris Lattner AttributeList *M, bool isInstance, 276c4ae5de0c356777446f823b573821fb95560d91Chris Lattner bool isVariadic, 28b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner ImplementationControl impControl) { 296c4ae5de0c356777446f823b573821fb95560d91Chris Lattner void *Mem = C.getAllocator().Allocate<ObjCMethodDecl>(); 306c4ae5de0c356777446f823b573821fb95560d91Chris Lattner return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, 31b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner M, isInstance, 32b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner isVariadic, impControl); 336c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 346c4ae5de0c356777446f823b573821fb95560d91Chris Lattner} 356c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===// 381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// Objective-C Decl Implementation 391e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===// 401e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 411e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCMethodDecl::setMethodParams(ParmVarDecl **NewParamInfo, 421e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned NumParams) { 431e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner assert(ParamInfo == 0 && "Already has param info!"); 441e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 451e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Zero params -> null pointer. 461e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (NumParams) { 471e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ParamInfo = new ParmVarDecl*[NumParams]; 481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 491e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumMethodParams = NumParams; 501e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 511e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 521e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl::~ObjCMethodDecl() { 541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner delete[] ParamInfo; 551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCAddInstanceVariablesToClass - Inserts instance variables 581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// into ObjCInterfaceDecl's fields. 591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 601e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCInterfaceDecl::addInstanceVariablesToClass(ObjCIvarDecl **ivars, 611e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numIvars, 621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner SourceLocation RBrac) { 631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumIvars = numIvars; 641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numIvars) { 651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner Ivars = new ObjCIvarDecl*[numIvars]; 661e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*)); 671e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 681e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner setLocEnd(RBrac); 691e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 701e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 711e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCAddInstanceVariablesToClassImpl - Checks for correctness of Instance 721e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// Variables (Ivars) relative to what declared in @implementation;s class. 731e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// Ivars into ObjCImplementationDecl's fields. 741e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 751e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl( 761e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCIvarDecl **ivars, unsigned numIvars) { 771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumIvars = numIvars; 781e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numIvars) { 791e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner Ivars = new ObjCIvarDecl*[numIvars]; 801e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*)); 811e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 821e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 831e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 841e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// addMethods - Insert instance and methods declarations into 851e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCInterfaceDecl's InsMethods and ClsMethods fields. 861e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 871e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCInterfaceDecl::addMethods(ObjCMethodDecl **insMethods, 881e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numInsMembers, 891e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl **clsMethods, 901e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numClsMembers, 911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner SourceLocation endLoc) { 921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumInstanceMethods = numInsMembers; 931e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numInsMembers) { 941e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 951e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 961e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 971e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumClassMethods = numClsMembers; 981e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numClsMembers) { 991e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassMethods = new ObjCMethodDecl*[numClsMembers]; 1001e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 1011e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1021e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner AtEndLoc = endLoc; 1031e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 1041e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1051e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// addMethods - Insert instance and methods declarations into 1061e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCProtocolDecl's ProtoInsMethods and ProtoClsMethods fields. 1071e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 1081e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCProtocolDecl::addMethods(ObjCMethodDecl **insMethods, 1091e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numInsMembers, 1101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl **clsMethods, 1111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numClsMembers, 1121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner SourceLocation endLoc) { 1131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumInstanceMethods = numInsMembers; 1141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numInsMembers) { 1151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 1161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 1171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumClassMethods = numClsMembers; 1191e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numClsMembers) { 1201e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassMethods = new ObjCMethodDecl*[numClsMembers]; 1211e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 1221e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1231e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner AtEndLoc = endLoc; 1241e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 1251e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1261e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// addMethods - Insert instance and methods declarations into 1271e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCCategoryDecl's CatInsMethods and CatClsMethods fields. 1281e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 1291e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCCategoryDecl::addMethods(ObjCMethodDecl **insMethods, 1301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numInsMembers, 1311e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl **clsMethods, 1321e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned numClsMembers, 1331e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner SourceLocation endLoc) { 1341e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumInstanceMethods = numInsMembers; 1351e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numInsMembers) { 1361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 1371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 1381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1391e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NumClassMethods = numClsMembers; 1401e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (numClsMembers) { 1411e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassMethods = new ObjCMethodDecl*[numClsMembers]; 1421e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 1431e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1441e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner AtEndLoc = endLoc; 1451e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 1461e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1471e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( 1481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { 1491e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 1501e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner while (ClassDecl != NULL) { 1511e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); 1521e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner I != E; ++I) { 1531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getIdentifier() == ID) { 1541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner clsDeclared = ClassDecl; 1551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 1561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 1591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1601e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 1611e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 1621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in 1641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// the class, its categories, and its super classes (using a linear search). 1651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { 1661e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 1671e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl *MethodDecl = 0; 1681e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1691e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner while (ClassDecl != NULL) { 1701e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) 1711e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 1721e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1731e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Didn't find one yet - look through protocols. 1741e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCProtocolDecl **protocols = ClassDecl->getReferencedProtocols(); 1751e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner int numProtocols = ClassDecl->getNumIntfRefProtocols(); 1761e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (int pIdx = 0; pIdx < numProtocols; pIdx++) { 1771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = protocols[pIdx]->getInstanceMethod(Sel))) 1781e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 1791e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1801e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Didn't find one yet - now look through categories. 1811e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 1821e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner while (CatDecl) { 1831e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) 1841e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 1851e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner CatDecl = CatDecl->getNextClassCategory(); 1861e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1871e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 1881e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 1891e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 1901e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 1911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupClassMethod - This method returns a class method by looking in the 1931e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// class, its categories, and its super classes (using a linear search). 1941e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { 1951e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 1961e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl *MethodDecl = 0; 1971e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 1981e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner while (ClassDecl != NULL) { 1991e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = ClassDecl->getClassMethod(Sel))) 2001e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2011e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2021e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Didn't find one yet - look through protocols. 2031e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCProtocolDecl **protocols = ClassDecl->getReferencedProtocols(); 2041e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner int numProtocols = ClassDecl->getNumIntfRefProtocols(); 2051e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (int pIdx = 0; pIdx < numProtocols; pIdx++) { 2061e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = protocols[pIdx]->getClassMethod(Sel))) 2071e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2081e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2091e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Didn't find one yet - now look through categories. 2101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 2111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner while (CatDecl) { 2121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = CatDecl->getClassMethod(Sel))) 2131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner CatDecl = CatDecl->getNextClassCategory(); 2151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 2171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2191e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2201e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2211e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in 2221e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// the class implementation. Unlike interfaces, we don't look outside the 2231e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// implementation. 2241e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCImplementationDecl::getInstanceMethod(Selector Sel) { 2251e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 2261e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 2271e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 2281e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2291e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2311e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// lookupClassMethod - This method returns a class method by looking in 2321e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// the class implementation. Unlike interfaces, we don't look outside the 2331e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// implementation. 2341e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCImplementationDecl::getClassMethod(Selector Sel) { 2351e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 2361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner I != E; ++I) 2371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 2381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 2391e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2401e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2411e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2421e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - This method returns an instance method by looking in 2431e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the 2441e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// implementation. 2451e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) { 2461e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 2471e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 2481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 2491e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2501e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2511e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2521e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupClassMethod - This method returns an instance method by looking in 2531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the 2541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// implementation. 2551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) { 2561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 2571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner I != E; ++I) 2581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 2591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 2601e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2611e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - Lookup a instance method in the protocol and protocols 2641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// it inherited. 2651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { 2661e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl *MethodDecl = NULL; 2671e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2681e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = getInstanceMethod(Sel))) 2691e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2701e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2711e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (getNumReferencedProtocols() > 0) { 2721e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCProtocolDecl **RefPDecl = getReferencedProtocols(); 2731e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2741e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (unsigned i = 0; i < getNumReferencedProtocols(); i++) { 2751e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = RefPDecl[i]->getInstanceMethod(Sel))) 2761e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2781e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2791e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2801e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 2811e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2821e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - Lookup a class method in the protocol and protocols 2831e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// it inherited. 2841e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { 2851e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCMethodDecl *MethodDecl = NULL; 2861e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2871e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = getClassMethod(Sel))) 2881e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2891e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2901e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (getNumReferencedProtocols() > 0) { 2911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner ObjCProtocolDecl **RefPDecl = getReferencedProtocols(); 2921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 2931e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for(unsigned i = 0; i < getNumReferencedProtocols(); i++) { 2941e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((MethodDecl = RefPDecl[i]->getClassMethod(Sel))) 2951e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return MethodDecl; 2961e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2971e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner } 2981e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 2991e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 3001e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 3011e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// getSynthesizedMethodSize - Compute size of synthesized method name 3021e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// as done be the rewrite. 3031e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// 3041e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnerunsigned ObjCMethodDecl::getSynthesizedMethodSize() const { 3051e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // syntesized method name is a concatenation of -/+[class-name selector] 3061e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner // Get length of this name. 3071e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner unsigned length = 3; // _I_ or _C_ 3081e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner length += strlen(getClassInterface()->getName()) +1; // extra for _ 3091e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner NamedDecl *MethodContext = getMethodContext(); 3101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (ObjCCategoryImplDecl *CID = 3111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner dyn_cast<ObjCCategoryImplDecl>(MethodContext)) 3121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner length += strlen(CID->getName()) +1; 3131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner length += getSelector().getName().size(); // selector name 3141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return length; 3151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 3161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 3171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCInterfaceDecl *const ObjCMethodDecl::getClassInterface() const { 3181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(MethodContext)) 3191e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return ID; 3201e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(MethodContext)) 3211e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return CD->getClassInterface(); 3221e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (ObjCImplementationDecl *IMD = 3231e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner dyn_cast<ObjCImplementationDecl>(MethodContext)) 3241e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return IMD->getClassInterface(); 3251e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if (ObjCCategoryImplDecl *CID = 3261e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner dyn_cast<ObjCCategoryImplDecl>(MethodContext)) 3271e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return CID->getClassInterface(); 3281e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner assert(false && "unknown method context"); 3291e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return 0; 3301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 331