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