Decl.cpp revision 8e25d8681822d8094bfeb97b2239363552548171
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Decl.cpp - Declaration AST Node Implementation -------------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the Decl class and subclasses. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h" 15980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h" 166c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h" 17f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson#include "clang/AST/Attr.h" 18c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h" 19b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson#include "llvm/ADT/DenseMap.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 23d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner// Statistics 24d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 25d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// temporary statistics gathering 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nFuncs = 0; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nBlockVars = 0; 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nFileVars = 0; 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nParmVars = 0; 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nSUC = 0; 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nEnumConst = 0; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nEnumDecls = 0; 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nTypedef = 0; 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic unsigned nFieldDecls = 0; 363536b443bc50d58a79f14fca9b6842541a434854Steve Naroffstatic unsigned nInterfaceDecls = 0; 373f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroffstatic unsigned nClassDecls = 0; 383f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroffstatic unsigned nMethodDecls = 0; 393f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroffstatic unsigned nProtocolDecls = 0; 40894c57f565869b26a65436d250a9ca7a04d2abe0Fariborz Jahanianstatic unsigned nForwardProtocolDecls = 0; 41fd225cc227143553898f2d3902242d25db9a4902Fariborz Jahanianstatic unsigned nCategoryDecls = 0; 423f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroffstatic unsigned nIvarDecls = 0; 43a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekstatic unsigned nObjCImplementationDecls = 0; 44a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekstatic unsigned nObjCCategoryImpl = 0; 45a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekstatic unsigned nObjCCompatibleAlias = 0; 46a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekstatic unsigned nObjCPropertyDecl = 0; 47c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattnerstatic unsigned nLinkageSpecDecl = 0; 48dfab6cb59a703f2ce4d58371652ce879f4c85a09Anders Carlssonstatic unsigned nFileScopeAsmDecl = 0; 493f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic bool StatSwitch = false; 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 52b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson// This keeps track of all decl attributes. Since so few decls have attrs, we 53b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson// keep them in a hash map instead of wasting space in the Decl class. 54b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssontypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy; 55b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 56b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonstatic DeclAttrMapTy *DeclAttrs = 0; 57b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 58e5ea380858f3d0a168c44ba42684e821997933d7Steve Naroffconst char *Decl::getDeclKindName() const { 598c9f13e494109426f358ef73bf873f77b1221564Steve Naroff switch (DeclKind) { 608c9f13e494109426f358ef73bf873f77b1221564Steve Naroff default: assert(0 && "Unknown decl kind!"); 61d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Typedef: return "Typedef"; 62d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Function: return "Function"; 63d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case BlockVar: return "BlockVar"; 64d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case FileVar: return "FileVar"; 65d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ParmVar: return "ParmVar"; 66d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case EnumConstant: return "EnumConstant"; 67d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCInterface: return "ObjCInterface"; 68d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCClass: return "ObjCClass"; 69d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCMethod: return "ObjCMethod"; 70d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCProtocol: return "ObjCProtocol"; 71d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCForwardProtocol: return "ObjCForwardProtocol"; 72d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Struct: return "Struct"; 73d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Union: return "Union"; 74d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Class: return "Class"; 75d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Enum: return "Enum"; 768c9f13e494109426f358ef73bf873f77b1221564Steve Naroff } 778c9f13e494109426f358ef73bf873f77b1221564Steve Naroff} 788c9f13e494109426f358ef73bf873f77b1221564Steve Naroff 79d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattnerbool Decl::CollectingStats(bool Enable) { 80d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner if (Enable) 81d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner StatSwitch = true; 82d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return StatSwitch; 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Decl::PrintStats() { 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, "*** Decl Stats:\n"); 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d decls total.\n", 88c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nFuncs+nBlockVars+nFileVars+nParmVars+nFieldDecls+nSUC+ 89c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nEnumDecls+nEnumConst+nTypedef+nInterfaceDecls+nClassDecls+ 90c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nMethodDecls+nProtocolDecls+nCategoryDecls+nIvarDecls)); 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d function decls, %d each (%d bytes)\n", 92c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nFuncs, (int)sizeof(FunctionDecl), int(nFuncs*sizeof(FunctionDecl))); 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d block variable decls, %d each (%d bytes)\n", 94c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nBlockVars, (int)sizeof(BlockVarDecl), 95c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nBlockVars*sizeof(BlockVarDecl))); 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d file variable decls, %d each (%d bytes)\n", 97c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nFileVars, (int)sizeof(FileVarDecl), 98c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nFileVars*sizeof(FileVarDecl))); 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d parameter variable decls, %d each (%d bytes)\n", 100c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nParmVars, (int)sizeof(ParmVarDecl), 101c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nParmVars*sizeof(ParmVarDecl))); 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d field decls, %d each (%d bytes)\n", 103c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nFieldDecls, (int)sizeof(FieldDecl), 104c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nFieldDecls*sizeof(FieldDecl))); 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d struct/union/class decls, %d each (%d bytes)\n", 106c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nSUC, (int)sizeof(RecordDecl), 107c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nSUC*sizeof(RecordDecl))); 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d enum decls, %d each (%d bytes)\n", 109c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nEnumDecls, (int)sizeof(EnumDecl), 110c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nEnumDecls*sizeof(EnumDecl))); 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d enum constant decls, %d each (%d bytes)\n", 112c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nEnumConst, (int)sizeof(EnumConstantDecl), 113c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nEnumConst*sizeof(EnumConstantDecl))); 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, " %d typedef decls, %d each (%d bytes)\n", 115c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nTypedef, (int)sizeof(TypedefDecl),int(nTypedef*sizeof(TypedefDecl))); 1163f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff // Objective-C decls... 1173f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff fprintf(stderr, " %d interface decls, %d each (%d bytes)\n", 118c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nInterfaceDecls, (int)sizeof(ObjCInterfaceDecl), 119c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nInterfaceDecls*sizeof(ObjCInterfaceDecl))); 1203f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff fprintf(stderr, " %d instance variable decls, %d each (%d bytes)\n", 121c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nIvarDecls, (int)sizeof(ObjCIvarDecl), 122c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nIvarDecls*sizeof(ObjCIvarDecl))); 1233f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff fprintf(stderr, " %d class decls, %d each (%d bytes)\n", 124c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nClassDecls, (int)sizeof(ObjCClassDecl), 125c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nClassDecls*sizeof(ObjCClassDecl))); 1263f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff fprintf(stderr, " %d method decls, %d each (%d bytes)\n", 127c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nMethodDecls, (int)sizeof(ObjCMethodDecl), 128c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nMethodDecls*sizeof(ObjCMethodDecl))); 1293f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff fprintf(stderr, " %d protocol decls, %d each (%d bytes)\n", 130c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nProtocolDecls, (int)sizeof(ObjCProtocolDecl), 131c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nProtocolDecls*sizeof(ObjCProtocolDecl))); 132894c57f565869b26a65436d250a9ca7a04d2abe0Fariborz Jahanian fprintf(stderr, " %d forward protocol decls, %d each (%d bytes)\n", 133c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nForwardProtocolDecls, (int)sizeof(ObjCForwardProtocolDecl), 134c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl))); 135fd225cc227143553898f2d3902242d25db9a4902Fariborz Jahanian fprintf(stderr, " %d category decls, %d each (%d bytes)\n", 136c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nCategoryDecls, (int)sizeof(ObjCCategoryDecl), 137c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nCategoryDecls*sizeof(ObjCCategoryDecl))); 1383f128ad2691d299b96663da85a9e069c4081ea7cSteve Naroff 139ccb4f314248fb2202637d3290f2b17af5646da08Fariborz Jahanian fprintf(stderr, " %d class implementation decls, %d each (%d bytes)\n", 140c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nObjCImplementationDecls, (int)sizeof(ObjCImplementationDecl), 141c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nObjCImplementationDecls*sizeof(ObjCImplementationDecl))); 142ccb4f314248fb2202637d3290f2b17af5646da08Fariborz Jahanian 1438f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian fprintf(stderr, " %d class implementation decls, %d each (%d bytes)\n", 144c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nObjCCategoryImpl, (int)sizeof(ObjCCategoryImplDecl), 145c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl))); 1468f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 147243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian fprintf(stderr, " %d compatibility alias decls, %d each (%d bytes)\n", 148c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nObjCCompatibleAlias, (int)sizeof(ObjCCompatibleAliasDecl), 149c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl))); 150243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 15182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian fprintf(stderr, " %d property decls, %d each (%d bytes)\n", 152c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nObjCPropertyDecl, (int)sizeof(ObjCPropertyDecl), 153c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nObjCPropertyDecl*sizeof(ObjCPropertyDecl))); 15482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer fprintf(stderr, "Total bytes = %d\n", 156c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner int(nFuncs*sizeof(FunctionDecl)+nBlockVars*sizeof(BlockVarDecl)+ 157c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nFileVars*sizeof(FileVarDecl)+nParmVars*sizeof(ParmVarDecl)+ 158c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nFieldDecls*sizeof(FieldDecl)+nSUC*sizeof(RecordDecl)+ 159c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nEnumDecls*sizeof(EnumDecl)+nEnumConst*sizeof(EnumConstantDecl)+ 160c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner nTypedef*sizeof(TypedefDecl)+ 161269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nInterfaceDecls*sizeof(ObjCInterfaceDecl)+ 162269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nIvarDecls*sizeof(ObjCIvarDecl)+ 163269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nClassDecls*sizeof(ObjCClassDecl)+ 164269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nMethodDecls*sizeof(ObjCMethodDecl)+ 165269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nProtocolDecls*sizeof(ObjCProtocolDecl)+ 166269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)+ 167269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nCategoryDecls*sizeof(ObjCCategoryDecl)+ 168269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nObjCImplementationDecls*sizeof(ObjCImplementationDecl)+ 169269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)+ 170269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)+ 171269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian nObjCPropertyDecl*sizeof(ObjCPropertyDecl)+ 172dfab6cb59a703f2ce4d58371652ce879f4c85a09Anders Carlsson nLinkageSpecDecl*sizeof(LinkageSpecDecl)+ 173dfab6cb59a703f2ce4d58371652ce879f4c85a09Anders Carlsson nFileScopeAsmDecl*sizeof(FileScopeAsmDecl))); 174269b10d493d5a78b7870f814b50bc4a87e0256f3Fariborz Jahanian 1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 177d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattnervoid Decl::addDeclKind(Kind k) { 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (k) { 179d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Typedef: nTypedef++; break; 180d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Function: nFuncs++; break; 181d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case BlockVar: nBlockVars++; break; 182d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case FileVar: nFileVars++; break; 183d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ParmVar: nParmVars++; break; 184d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case EnumConstant: nEnumConst++; break; 185d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Field: nFieldDecls++; break; 186d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Struct: case Union: case Class: nSUC++; break; 187d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case Enum: nEnumDecls++; break; 188d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCInterface: nInterfaceDecls++; break; 189d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCClass: nClassDecls++; break; 190d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCMethod: nMethodDecls++; break; 191d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCProtocol: nProtocolDecls++; break; 192d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCForwardProtocol: nForwardProtocolDecls++; break; 193d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCCategory: nCategoryDecls++; break; 194d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCIvar: nIvarDecls++; break; 195d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCImplementation: nObjCImplementationDecls++; break; 196d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case ObjCCategoryImpl: nObjCCategoryImpl++; break; 197d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case CompatibleAlias: nObjCCompatibleAlias++; break; 198d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case PropertyDecl: nObjCPropertyDecl++; break; 199d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case LinkageSpec: nLinkageSpecDecl++; break; 200d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner case FileScopeAsm: nFileScopeAsmDecl++; break; 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 204d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 2056c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 2066c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 2076c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 208c63e660882ff93841fa234d70ef6757038302b92Chris LattnerBlockVarDecl *BlockVarDecl::Create(ASTContext &C, SourceLocation L, 209c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 210c63e660882ff93841fa234d70ef6757038302b92Chris Lattner StorageClass S, ScopedDecl *PrevDecl) { 2119e151e154780e9cd443336143af1e996d1f387e5Chris Lattner void *Mem = C.getAllocator().Allocate<BlockVarDecl>(); 2129e151e154780e9cd443336143af1e996d1f387e5Chris Lattner return new (Mem) BlockVarDecl(L, Id, T, S, PrevDecl); 2139e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 2149e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 2159e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 216c63e660882ff93841fa234d70ef6757038302b92Chris LattnerFileVarDecl *FileVarDecl::Create(ASTContext &C, SourceLocation L, 217c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, StorageClass S, 218c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PrevDecl) { 2199e151e154780e9cd443336143af1e996d1f387e5Chris Lattner void *Mem = C.getAllocator().Allocate<FileVarDecl>(); 2209e151e154780e9cd443336143af1e996d1f387e5Chris Lattner return new (Mem) FileVarDecl(L, Id, T, S, PrevDecl); 2219e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 2229e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 223c63e660882ff93841fa234d70ef6757038302b92Chris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, SourceLocation L, 224c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, StorageClass S, 225c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PrevDecl) { 2269e151e154780e9cd443336143af1e996d1f387e5Chris Lattner void *Mem = C.getAllocator().Allocate<ParmVarDecl>(); 2279e151e154780e9cd443336143af1e996d1f387e5Chris Lattner return new (Mem) ParmVarDecl(L, Id, T, S, PrevDecl); 2289e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 2299e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 230a98e58ddb4696a0020fe97439d5295413f9e90b1Chris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, SourceLocation L, 231a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner IdentifierInfo *Id, QualType T, 232a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner StorageClass S, bool isInline, 233a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner ScopedDecl *PrevDecl) { 234a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner void *Mem = C.getAllocator().Allocate<FunctionDecl>(); 235a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner return new (Mem) FunctionDecl(L, Id, T, S, isInline, PrevDecl); 236a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 237a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 2388e25d8681822d8094bfeb97b2239363552548171Chris LattnerFieldDecl *FieldDecl::Create(ASTContext &C, SourceLocation L, 2398e25d8681822d8094bfeb97b2239363552548171Chris Lattner IdentifierInfo *Id, QualType T, Expr *BW) { 2408e25d8681822d8094bfeb97b2239363552548171Chris Lattner void *Mem = C.getAllocator().Allocate<FieldDecl>(); 2418e25d8681822d8094bfeb97b2239363552548171Chris Lattner return new (Mem) FieldDecl(L, Id, T, BW); 2428e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2438e25d8681822d8094bfeb97b2239363552548171Chris Lattner 244a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 245c63e660882ff93841fa234d70ef6757038302b92Chris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, SourceLocation L, 246c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 247c63e660882ff93841fa234d70ef6757038302b92Chris Lattner Expr *E, const llvm::APSInt &V, 248c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PrevDecl){ 2496c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<EnumConstantDecl>(); 2506c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner return new (Mem) EnumConstantDecl(L, Id, T, E, V, PrevDecl); 2516c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2526c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 253c63e660882ff93841fa234d70ef6757038302b92Chris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, SourceLocation L, 254c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 255c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PD) { 2566c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<TypedefDecl>(); 2576c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner return new (Mem) TypedefDecl(L, Id, T, PD); 2586c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2596c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 260c63e660882ff93841fa234d70ef6757038302b92Chris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, SourceLocation L, IdentifierInfo *Id, 261c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PrevDecl) { 2626c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<EnumDecl>(); 2636c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner return new (Mem) EnumDecl(L, Id, PrevDecl); 2646c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2656c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 266c63e660882ff93841fa234d70ef6757038302b92Chris LattnerRecordDecl *RecordDecl::Create(ASTContext &C, Kind DK, SourceLocation L, 267c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, ScopedDecl *PrevDecl) { 2686c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<RecordDecl>(); 2696c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner return new (Mem) RecordDecl(DK, L, Id, PrevDecl); 2706c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2716c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 2728e25d8681822d8094bfeb97b2239363552548171Chris LattnerFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, SourceLocation L, 2738e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 2748e25d8681822d8094bfeb97b2239363552548171Chris Lattner void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>(); 2758e25d8681822d8094bfeb97b2239363552548171Chris Lattner return new (Mem) FileScopeAsmDecl(L, Str); 2768e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2778e25d8681822d8094bfeb97b2239363552548171Chris Lattner 2788e25d8681822d8094bfeb97b2239363552548171Chris LattnerLinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, SourceLocation L, 2798e25d8681822d8094bfeb97b2239363552548171Chris Lattner LanguageIDs Lang, Decl *D) { 2808e25d8681822d8094bfeb97b2239363552548171Chris Lattner void *Mem = C.getAllocator().Allocate<LinkageSpecDecl>(); 2818e25d8681822d8094bfeb97b2239363552548171Chris Lattner return new (Mem) LinkageSpecDecl(L, Lang, D); 2828e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2836c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 2846c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 285d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner// Decl Implementation 286d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 287d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner 2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Out-of-line virtual method providing a home for Decl. 2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerDecl::~Decl() { 290eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson if (!HasAttrs) 291b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson return; 292b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 293b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson DeclAttrMapTy::iterator it = DeclAttrs->find(this); 294eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!"); 295eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson 296eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson delete it->second; 297eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson DeclAttrs->erase(it); 298eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson if (DeclAttrs->empty()) { 299eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson delete DeclAttrs; 300eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson DeclAttrs = 0; 301eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson } 302b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson} 303b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 304d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattnervoid Decl::addAttr(Attr *NewAttr) { 305b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson if (!DeclAttrs) 306d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner DeclAttrs = new llvm::DenseMap<const Decl*, Attr*>(); 307b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 308d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner Attr *&ExistingAttr = (*DeclAttrs)[this]; 309b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 310d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner NewAttr->setNext(ExistingAttr); 311d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner ExistingAttr = NewAttr; 312b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 313b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson HasAttrs = true; 314b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson} 315b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 316d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattnerconst Attr *Decl::getAttrs() const { 317eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson if (!HasAttrs) 318b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson return 0; 319b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 320eb7adf3fe6a928a8006c9a9a8d757d5c2daabdc5Anders Carlsson return (*DeclAttrs)[this]; 3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 323fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerconst char *NamedDecl::getName() const { 3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const IdentifierInfo *II = getIdentifier()) 3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return II->getName(); 3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ""; 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerFunctionDecl::~FunctionDecl() { 3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer delete[] ParamInfo; 3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerunsigned FunctionDecl::getNumParams() const { 334d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner if (isa<FunctionTypeNoProto>(getCanonicalType())) 335d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 336ec584d6f64f1f40a57fafc94ddf161a6735c30a9Chris Lattner return cast<FunctionTypeProto>(getCanonicalType())->getNumArgs(); 3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionDecl::setParams(ParmVarDecl **NewParamInfo, unsigned NumParams) { 3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(NumParams == getNumParams() && "Parameter count mismatch!"); 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ParamInfo = new ParmVarDecl*[NumParams]; 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// defineBody - When created, RecordDecl's correspond to a forward declared 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// record. This method is used to mark the decl as being defined, with the 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified contents. 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid RecordDecl::defineBody(FieldDecl **members, unsigned numMembers) { 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer setDefinition(true); 3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumMembers = numMembers; 3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (numMembers) { 3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Members = new FieldDecl*[numMembers]; 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(Members, members, numMembers*sizeof(Decl*)); 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerFieldDecl* RecordDecl::getMember(IdentifierInfo *name) { 3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Members == 0 || NumMembers < 0) 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return 0; 3673f5faf7c28a51d920b043fa69e268c6fad78caf8Fariborz Jahanian 3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // linear search. When C++ classes come along, will likely need to revisit. 3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (int i = 0; i < NumMembers; ++i) { 3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Members[i]->getIdentifier() == name) 3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return Members[i]; 3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return 0; 3746fa5f0943a84233b2e1ec9716eae55643225bfd4Chris Lattner} 375e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian 376d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 377d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner// Objective-C Decl Implementation 378d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 379d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner 380a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCMethodDecl::setMethodParams(ParmVarDecl **NewParamInfo, 3815951965a39c01764e4777e16b7089874512ebc5aFariborz Jahanian unsigned NumParams) { 382e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian assert(ParamInfo == 0 && "Already has param info!"); 383e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian 384e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian // Zero params -> null pointer. 385e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian if (NumParams) { 386e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian ParamInfo = new ParmVarDecl*[NumParams]; 387e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 388e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian NumMethodParams = NumParams; 389e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian } 390e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian} 391e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian 392a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl::~ObjCMethodDecl() { 393e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian delete[] ParamInfo; 394e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian} 395e55cd00d23f0951c29b3b93e6034b2c4b3933a23Fariborz Jahanian 396a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCAddInstanceVariablesToClass - Inserts instance variables 397a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// into ObjCInterfaceDecl's fields. 398b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian/// 399a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCInterfaceDecl::addInstanceVariablesToClass(ObjCIvarDecl **ivars, 40060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numIvars, 401f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation RBrac) { 402b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian NumIvars = numIvars; 403b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian if (numIvars) { 404a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek Ivars = new ObjCIvarDecl*[numIvars]; 405a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*)); 406b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian } 407f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff setLocEnd(RBrac); 408b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian} 409b04a02184c5ec8745ea8a639fbdff2293fe0ae96Fariborz Jahanian 410a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCAddInstanceVariablesToClassImpl - Checks for correctness of Instance 411d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian/// Variables (Ivars) relative to what declared in @implementation;s class. 412a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// Ivars into ObjCImplementationDecl's fields. 413d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian/// 414a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl( 415a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl **ivars, unsigned numIvars) { 416d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian NumIvars = numIvars; 417d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian if (numIvars) { 418a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek Ivars = new ObjCIvarDecl*[numIvars]; 419a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*)); 420d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian } 421d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian} 422d0b90bff98bafb72ea9809f509bf37c93c60e74eFariborz Jahanian 42360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff/// addMethods - Insert instance and methods declarations into 424a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCInterfaceDecl's InsMethods and ClsMethods fields. 425e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian/// 426a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCInterfaceDecl::addMethods(ObjCMethodDecl **insMethods, 42760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numInsMembers, 428a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, 42960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numClsMembers, 43060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation endLoc) { 4317ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumInstanceMethods = numInsMembers; 432e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian if (numInsMembers) { 433a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 434a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 435e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian } 4367ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumClassMethods = numClsMembers; 437e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian if (numClsMembers) { 438a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ClassMethods = new ObjCMethodDecl*[numClsMembers]; 439a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 440e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian } 441f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff AtEndLoc = endLoc; 442e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian} 443e3a2ca7e30601cdd31c77a830f4cc487851e8096Fariborz Jahanian 44460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff/// addMethods - Insert instance and methods declarations into 445a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCProtocolDecl's ProtoInsMethods and ProtoClsMethods fields. 44625e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian/// 447a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCProtocolDecl::addMethods(ObjCMethodDecl **insMethods, 44860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numInsMembers, 449a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, 45060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numClsMembers, 451423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation endLoc) { 4527ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumInstanceMethods = numInsMembers; 45325e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian if (numInsMembers) { 454a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 455a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 45625e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian } 4577ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumClassMethods = numClsMembers; 45825e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian if (numClsMembers) { 459a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ClassMethods = new ObjCMethodDecl*[numClsMembers]; 460a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 46125e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian } 462423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff AtEndLoc = endLoc; 46325e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian} 46425e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian 46560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff/// addMethods - Insert instance and methods declarations into 466a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryDecl's CatInsMethods and CatClsMethods fields. 467fd225cc227143553898f2d3902242d25db9a4902Fariborz Jahanian/// 468a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCCategoryDecl::addMethods(ObjCMethodDecl **insMethods, 46960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numInsMembers, 470a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, 47160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff unsigned numClsMembers, 472423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation endLoc) { 4737ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumInstanceMethods = numInsMembers; 474fd225cc227143553898f2d3902242d25db9a4902Fariborz Jahanian if (numInsMembers) { 475a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek InstanceMethods = new ObjCMethodDecl*[numInsMembers]; 476a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); 4778f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 4787ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumClassMethods = numClsMembers; 4798f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian if (numClsMembers) { 480a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ClassMethods = new ObjCMethodDecl*[numClsMembers]; 481a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); 4828f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 483423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff AtEndLoc = endLoc; 4848f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian} 4858f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 486a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( 487a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { 488a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl* ClassDecl = this; 4890330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff while (ClassDecl != NULL) { 490be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); 491be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner I != E; ++I) { 492be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner if ((*I)->getIdentifier() == ID) { 4930330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff clsDeclared = ClassDecl; 494be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner return *I; 4950330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff } 4960330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff } 4970330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 4980330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff } 4990330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff return NULL; 5000330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff} 5010330071714f1ba09e926becd666f4fc0ed62bc0bSteve Naroff 5020157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in 50333ef2590b982c626e5c645a97f8e4ca160cd8f98Chris Lattner/// the class, its categories, and its super classes (using a linear search). 504a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { 505a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl* ClassDecl = this; 506a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *MethodDecl = 0; 50758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 5086a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff while (ClassDecl != NULL) { 50994a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) 51058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 51158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 512ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff // Didn't find one yet - look through protocols. 513a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **protocols = ClassDecl->getReferencedProtocols(); 514ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff int numProtocols = ClassDecl->getNumIntfRefProtocols(); 515ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff for (int pIdx = 0; pIdx < numProtocols; pIdx++) { 51694a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = protocols[pIdx]->getInstanceMethod(Sel))) 51758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 518ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff } 5193d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff // Didn't find one yet - now look through categories. 520a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 5213d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff while (CatDecl) { 52294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) 52358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 5243d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff CatDecl = CatDecl->getNextClassCategory(); 5253d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff } 5266a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 5276a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 5286a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff return NULL; 5296a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff} 5306a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff 5313d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff// lookupClassMethod - This method returns a class method by looking in the 53233ef2590b982c626e5c645a97f8e4ca160cd8f98Chris Lattner// class, its categories, and its super classes (using a linear search). 533a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { 534a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl* ClassDecl = this; 535a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *MethodDecl = 0; 53658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 5376a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff while (ClassDecl != NULL) { 53894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = ClassDecl->getClassMethod(Sel))) 53958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 54058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 541ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff // Didn't find one yet - look through protocols. 542a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **protocols = ClassDecl->getReferencedProtocols(); 543ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff int numProtocols = ClassDecl->getNumIntfRefProtocols(); 544ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff for (int pIdx = 0; pIdx < numProtocols; pIdx++) { 54594a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = protocols[pIdx]->getClassMethod(Sel))) 54658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 547ff1afdb4f5ee2fc74ec0af788e18b3a036eaaafeSteve Naroff } 5483d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff // Didn't find one yet - now look through categories. 549a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 5503d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff while (CatDecl) { 55194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = CatDecl->getClassMethod(Sel))) 55258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 5533d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff CatDecl = CatDecl->getNextClassCategory(); 5543d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff } 5556a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 5566a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 5576a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff return NULL; 5586a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff} 5596a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff 5600157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in 5610157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// the class implementation. Unlike interfaces, we don't look outside the 5620157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// implementation. 563a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCImplementationDecl::getInstanceMethod(Selector Sel) { 5640157c5144513438bb74aebf50d18f95df4104acbChris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 5650157c5144513438bb74aebf50d18f95df4104acbChris Lattner if ((*I)->getSelector() == Sel) 5660157c5144513438bb74aebf50d18f95df4104acbChris Lattner return *I; 567c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff return NULL; 568c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff} 569c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff 5700157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// lookupClassMethod - This method returns a class method by looking in 5710157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// the class implementation. Unlike interfaces, we don't look outside the 5720157c5144513438bb74aebf50d18f95df4104acbChris Lattner/// implementation. 573a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCImplementationDecl::getClassMethod(Selector Sel) { 574ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 575ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner I != E; ++I) 576ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner if ((*I)->getSelector() == Sel) 577ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner return *I; 578c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff return NULL; 579c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff} 58025e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian 581e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// lookupInstanceMethod - This method returns an instance method by looking in 582e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// the class implementation. Unlike interfaces, we don't look outside the 583e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// implementation. 584a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) { 585ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 586ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner if ((*I)->getSelector() == Sel) 587ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner return *I; 588e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff return NULL; 589e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff} 590e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 591e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// lookupClassMethod - This method returns an instance method by looking in 592e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// the class implementation. Unlike interfaces, we don't look outside the 593e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff// implementation. 594a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) { 595ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 596ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner I != E; ++I) 597ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner if ((*I)->getSelector() == Sel) 598ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner return *I; 599e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff return NULL; 600e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff} 6017dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 6027dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian// lookupInstanceMethod - Lookup a instance method in the protocol and protocols 6037dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian// it inherited. 604a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { 605a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *MethodDecl = NULL; 60658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 60794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = getInstanceMethod(Sel))) 60858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 60958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 6107dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian if (getNumReferencedProtocols() > 0) { 611a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **RefPDecl = getReferencedProtocols(); 6127dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 613c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian for (unsigned i = 0; i < getNumReferencedProtocols(); i++) { 61494a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = RefPDecl[i]->getInstanceMethod(Sel))) 61558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 6167dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian } 6177dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian } 6187dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian return NULL; 6197dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian} 6207dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 6217dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian// lookupInstanceMethod - Lookup a class method in the protocol and protocols 6227dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian// it inherited. 623a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { 624a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *MethodDecl = NULL; 62558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 62694a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = getClassMethod(Sel))) 62758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 62858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 6297dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian if (getNumReferencedProtocols() > 0) { 630a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **RefPDecl = getReferencedProtocols(); 6317dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 632c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian for(unsigned i = 0; i < getNumReferencedProtocols(); i++) { 63394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff if ((MethodDecl = RefPDecl[i]->getClassMethod(Sel))) 63458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return MethodDecl; 6357dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian } 6367dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian } 6377dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian return NULL; 6387dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian} 63958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 640faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian/// getSynthesizedMethodSize - Compute size of synthesized method name 641faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian/// as done be the rewrite. 642faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian/// 643faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanianunsigned ObjCMethodDecl::getSynthesizedMethodSize() const { 644847794a7620bfd5fda09ee06bc0205d30e17e2aaFariborz Jahanian // syntesized method name is a concatenation of -/+[class-name selector] 645847794a7620bfd5fda09ee06bc0205d30e17e2aaFariborz Jahanian // Get length of this name. 646faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian unsigned length = 3; // _I_ or _C_ 647faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian length += strlen(getClassInterface()->getName()) +1; // extra for _ 648faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian NamedDecl *MethodContext = getMethodContext(); 649faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian if (ObjCCategoryImplDecl *CID = 650faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian dyn_cast<ObjCCategoryImplDecl>(MethodContext)) 651faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian length += strlen(CID->getName()) +1; 652faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian length += getSelector().getName().size(); // selector name 653847794a7620bfd5fda09ee06bc0205d30e17e2aaFariborz Jahanian return length; 654847794a7620bfd5fda09ee06bc0205d30e17e2aaFariborz Jahanian} 655847794a7620bfd5fda09ee06bc0205d30e17e2aaFariborz Jahanian 656a526c5c67e5a0473c340903ee542ce570119665fTed KremenekObjCInterfaceDecl *const ObjCMethodDecl::getClassInterface() const { 657a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(MethodContext)) 65858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return ID; 659a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(MethodContext)) 66058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return CD->getClassInterface(); 661a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCImplementationDecl *IMD = 662a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek dyn_cast<ObjCImplementationDecl>(MethodContext)) 66358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return IMD->getClassInterface(); 664a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCCategoryImplDecl *CID = 665a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek dyn_cast<ObjCCategoryImplDecl>(MethodContext)) 66658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return CID->getClassInterface(); 66758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff assert(false && "unknown method context"); 66858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return 0; 66958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff} 670