DeclObjC.cpp revision 07fa7749da805969f2ed467a4eb5b405a4ff9a23
11e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===--- DeclObjC.cpp - ObjC Declaration AST Node Implementation ----------===//
21e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//
31e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//                     The LLVM Compiler Infrastructure
41e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//
51e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// This file is distributed under the University of Illinois Open Source
61e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// License. See LICENSE.TXT for details.
71e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//
81e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===//
91e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//
101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// This file implements the Objective-C related Decl classes.
111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//
121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===//
131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner#include "clang/AST/DeclObjC.h"
151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner#include "clang/AST/ASTContext.h"
16e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h"
171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnerusing namespace clang;
181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
196c4ae5de0c356777446f823b573821fb95560d91Chris Lattner//===----------------------------------------------------------------------===//
206c4ae5de0c356777446f823b573821fb95560d91Chris Lattner// ObjC Decl Allocation/Deallocation Method Implementations
216c4ae5de0c356777446f823b573821fb95560d91Chris Lattner//===----------------------------------------------------------------------===//
226c4ae5de0c356777446f823b573821fb95560d91Chris Lattner
230ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C,
240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                       SourceLocation beginLoc,
256c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                       SourceLocation endLoc,
266c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                       Selector SelInfo, QualType T,
270701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff                                       DeclContext *contextDecl,
28f6414927e67e27d9324d8d179c5f7ea620443924Daniel Dunbar                                       bool isInstance,
296c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                       bool isVariadic,
304607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian                                       bool isSynthesized,
31b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner                                       ImplementationControl impControl) {
323e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCMethodDecl(beginLoc, endLoc,
330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                  SelInfo, T, contextDecl,
34f6414927e67e27d9324d8d179c5f7ea620443924Daniel Dunbar                                  isInstance,
354607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian                                  isVariadic, isSynthesized, impControl);
360e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner}
370e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner
388a779314870760848e61da2c428a78971fe3f1c3Ted Kremenekvoid ObjCMethodDecl::Destroy(ASTContext& C) {
398a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  if (Body) Body->Destroy(C);
408a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  if (SelfDecl) SelfDecl->Destroy(C);
418a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek
428a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
438a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek    if (*I) (*I)->Destroy(C);
44411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner
452073216a1075767b5d25c23d1462b7034686d94dChris Lattner  ParamInfo.clear();
46411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner
478a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  Decl::Destroy(C);
488a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek}
498a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek
500b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner
510ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
52d04341000d35c8808a72838b057eed7bf13b7661Douglas Gregor                                             DeclContext *DC,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                             SourceLocation atLoc,
54d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                                             IdentifierInfo *Id,
55d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                                             SourceLocation ClassLoc,
560e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner                                             bool ForwardDecl, bool isInternal){
573e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl,
580e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner                                     isInternal);
590e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner}
606c4ae5de0c356777446f823b573821fb95560d91Chris Lattner
610b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCInterfaceDecl::
620b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id,
630b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner                  SourceLocation CLoc, bool FD, bool isInternal)
640b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner  : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id),
65e881483a3bc22ffad62367501aa09ad8508fe363Chris Lattner    TypeForDecl(0), SuperClass(0),
660b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner    CategoryList(0), ForwardDecl(FD), InternalInterface(isInternal),
670b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner    ClassLoc(CLoc) {
68e4f039e01e797a38bc97bf22aff9832ecd18ff5fSteve Naroff}
69e4f039e01e797a38bc97bf22aff9832ecd18ff5fSteve Naroff
700b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCInterfaceDecl::Destroy(ASTContext &C) {
718a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  for (ivar_iterator I=ivar_begin(), E=ivar_end(); I!=E; ++I)
728a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek    if (*I) (*I)->Destroy(C);
738a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek
74e881483a3bc22ffad62367501aa09ad8508fe363Chris Lattner  IVars.clear();
750b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner  // FIXME: CategoryList?
760b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner
771a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek  // FIXME: Because there is no clear ownership
781a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek  //  role between ObjCInterfaceDecls and the ObjCPropertyDecls that they
791a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek  //  reference, we destroy ObjCPropertyDecls in ~TranslationUnit.
808a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek  Decl::Destroy(C);
818a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek}
828a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek
838a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek
840c00aac5d618f39afc406c5b2e07642930af1d56Argyrios KyrtzidisObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC,
850c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis                                   SourceLocation L, IdentifierInfo *Id,
860c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis                                   QualType T, AccessControl ac, Expr *BW) {
870c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis  return new (C) ObjCIvarDecl(DC, L, Id, T, ac, BW);
886c4ae5de0c356777446f823b573821fb95560d91Chris Lattner}
896c4ae5de0c356777446f823b573821fb95560d91Chris Lattner
9001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek
9101e6779faca1e3a3164c697d6e2dfee0881a6981Ted KremenekObjCAtDefsFieldDecl
9244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor*ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
9301e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek                             IdentifierInfo *Id, QualType T, Expr *BW) {
943e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCAtDefsFieldDecl(DC, L, Id, T, BW);
9501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek}
9601e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek
9701e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenekvoid ObjCAtDefsFieldDecl::Destroy(ASTContext& C) {
9801e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek  this->~ObjCAtDefsFieldDecl();
993e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate((void *)this);
10001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek}
10101e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek
102d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
1030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
104c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner                                           IdentifierInfo *Id) {
1053e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCProtocolDecl(DC, L, Id);
106cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner}
107cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner
108411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattnervoid ObjCProtocolDecl::Destroy(ASTContext &C) {
1094a323d94e50c8f570cbfaf0392e68215b8ca87bfChris Lattner  ReferencedProtocols.clear();
110411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner  ObjCContainerDecl::Destroy(C);
1111c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek}
1121c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek
1131c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek
114411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner
115411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner
116d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                     SourceLocation L,
11867956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner                                     ObjCInterfaceDecl *const *Elts,
11967956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner                                     unsigned nElts) {
1203e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCClassDecl(DC, L, Elts, nElts);
12161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner}
12261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
1230b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCClassDecl::Destroy(ASTContext &C) {
124400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek
125400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  // FIXME: There is no clear ownership policy now for referenced
126400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  ObjCInterfaceDecls.  Some of them can be forward declarations that
127400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  are never later defined (in which case the ObjCClassDecl owns them)
128400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  or the ObjCInterfaceDecl later becomes a real definition later.  Ideally
129400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  we should have separate objects for forward declarations and definitions,
130400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  obviating this problem.  Because of this situation, referenced
131400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  //  ObjCInterfaceDecls are destroyed in ~TranslationUnit.
132400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek
13367956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner  ForwardDecls.clear();
134400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek  Decl::Destroy(C);
135400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek}
136400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek
13761f9d41036e30ff80130f99b31c0626e3ef057ccChris LattnerObjCForwardProtocolDecl *
138d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC,
1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                SourceLocation L,
14007fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner                                ObjCProtocolDecl *const *Elts,
14107fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner                                unsigned NumElts) {
1423e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts);
14361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner}
14461f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
1450b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCForwardProtocolDecl::
1460b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
14707fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner                        ObjCProtocolDecl *const *Elts, unsigned nElts)
1480b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner  : Decl(ObjCForwardProtocol, DC, L) {
14907fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner  ReferencedProtocols.set(Elts, nElts);
1500b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner}
1510b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner
1520b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCForwardProtocolDecl::Destroy(ASTContext &C) {
15307fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner  ReferencedProtocols.clear();
15407fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner  Decl::Destroy(C);
15505ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek}
15605ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek
157d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,
1580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
15961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner                                           IdentifierInfo *Id) {
1603e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCCategoryDecl(DC, L, Id);
16161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner}
16261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
16375c9cae5f85c72cbb1649e93849e16ede3f07522Chris LattnerObjCCategoryImplDecl *
164d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC,
1650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                             SourceLocation L,IdentifierInfo *Id,
16675c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                             ObjCInterfaceDecl *ClassInterface) {
1673e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCCategoryImplDecl(DC, L, Id, ClassInterface);
16875c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner}
16975c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner
17075c9cae5f85c72cbb1649e93849e16ede3f07522Chris LattnerObjCImplementationDecl *
171d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC,
1720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                               SourceLocation L,
17375c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                               ObjCInterfaceDecl *ClassInterface,
17475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                               ObjCInterfaceDecl *SuperDecl) {
1753e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl);
17675c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner}
1771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
178f8d17a59167d9c2026506ed8813ea434d93b662aChris LattnerObjCCompatibleAliasDecl *
179d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
1800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                SourceLocation L,
181f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner                                IdentifierInfo *Id,
182f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner                                ObjCInterfaceDecl* AliasedClass) {
1833e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass);
184f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner}
185f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner
186d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC,
187dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian                                           SourceLocation L,
1881de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian                                           IdentifierInfo *Id,
18946b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian                                           QualType T,
19046b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian                                           PropertyControl propControl) {
1913e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCPropertyDecl(DC, L, Id, T);
192f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner}
193f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner
1941e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===//
1951e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// Objective-C Decl Implementation
1961e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner//===----------------------------------------------------------------------===//
1971e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
198fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanianvoid ObjCMethodDecl::createImplicitParams(ASTContext &Context,
199fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian                                          const ObjCInterfaceDecl *OID) {
20008a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar  QualType selfTy;
201f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  if (isInstanceMethod()) {
20208a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar    // There may be no interface context due to error in declaration
20308a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar    // of the interface (which has been reported). Recover gracefully.
204fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian    if (OID) {
205fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian      selfTy = Context.getObjCInterfaceType(const_cast<ObjCInterfaceDecl *>(OID));
20608a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar      selfTy = Context.getPointerType(selfTy);
20708a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar    } else {
20808a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar      selfTy = Context.getObjCIdType();
20908a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar    }
21008a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar  } else // we have a factory method.
21108a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar    selfTy = Context.getObjCClassType();
21208a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar
21308a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar  SelfDecl = ImplicitParamDecl::Create(Context, this,
21408a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar                                       SourceLocation(),
21508a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar                                       &Context.Idents.get("self"),
2164afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                       selfTy);
21708a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar
21808a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar  CmdDecl = ImplicitParamDecl::Create(Context, this,
21908a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar                                      SourceLocation(),
22008a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar                                      &Context.Idents.get("_cmd"),
2214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                      Context.getObjCSelType());
22208a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar}
22308a356cc2b98cff990ef6969e819a214443d7f8fDaniel Dunbar
224559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// FindCategoryDeclaration - Finds category declaration in the list of
225559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// categories for this class and returns it. Name of the category is passed
226559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// in 'CategoryId'. If category not found, return 0;
227559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian///
228559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz JahanianObjCCategoryDecl *
229559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian  ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const {
230559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian    for (ObjCCategoryDecl *Category = getCategoryList();
231559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian         Category; Category = Category->getNextClassCategory())
232559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian      if (Category->getIdentifier() == CategoryId)
233559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian        return Category;
234559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian    return 0;
235559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian}
236559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian
237aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian/// lookupFieldDeclForIvar - looks up a field decl' in the laid out
238aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian/// storage which matches this 'ivar'.
239aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian///
240aaa63a761c6671a08e3f4f463435b72739fa194bFariborz JahanianFieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context,
241fd64bb635dc221baa19f81d5d2a084f7eb269f7fFariborz Jahanian                                                     const ObjCIvarDecl *ivar) {
242a769c004a2874504c17ea8afccbc4ad35fc33c9fFariborz Jahanian  const RecordDecl *RecordForDecl = Context.addRecordToClass(this);
243aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class");
244aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  DeclarationName Member = ivar->getDeclName();
245a769c004a2874504c17ea8afccbc4ad35fc33c9fFariborz Jahanian  DeclContext::lookup_result Lookup = (const_cast< RecordDecl *>(RecordForDecl))
2460701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff                                        ->lookup(Member);
247aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  assert((Lookup.first != Lookup.second) && "field decl not found");
248aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  FieldDecl *MemberDecl = dyn_cast<FieldDecl>(*Lookup.first);
249aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  assert(MemberDecl && "field decl not found");
250aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian  return MemberDecl;
251aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian}
252aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian
2531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// ObjCAddInstanceVariablesToClassImpl - Checks for correctness of Instance
2541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// Variables (Ivars) relative to what declared in @implementation;s class.
2551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// Ivars into ObjCImplementationDecl's fields.
2561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner///
2571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnervoid ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl(
2581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner                               ObjCIvarDecl **ivars, unsigned numIvars) {
2591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  NumIvars = numIvars;
2601e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  if (numIvars) {
2611e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    Ivars = new ObjCIvarDecl*[numIvars];
2621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*));
2631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  }
2641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
2651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
2660701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff// Get the local instance method declared in this interface.
2670701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff// FIXME: handle overloading, instance & class methods can have the same name.
2680701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffObjCMethodDecl *ObjCContainerDecl::getInstanceMethod(Selector Sel) const {
2690701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  lookup_const_result MethodResult = lookup(Sel);
2700701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  if (MethodResult.first)
2710701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff    return const_cast<ObjCMethodDecl*>(
2720701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff             dyn_cast<ObjCMethodDecl>(*MethodResult.first));
2730701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  return 0;
2740701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff}
2750701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff
2760701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff// Get the local class method declared in this interface.
2770701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffObjCMethodDecl *ObjCContainerDecl::getClassMethod(Selector Sel) const {
2780701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  lookup_const_result MethodResult = lookup(Sel);
2790701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  if (MethodResult.first)
2800701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff    return const_cast<ObjCMethodDecl*>(
2810701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff             dyn_cast<ObjCMethodDecl>(*MethodResult.first));
2820701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  return 0;
2830701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff}
2840701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff
2850701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroffunsigned ObjCContainerDecl::getNumInstanceMethods() const {
2860701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  unsigned sum = 0;
2870701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  for (instmeth_iterator I=instmeth_begin(), E=instmeth_end(); I != E; ++I)
2880701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff    sum++;
2890701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  return sum;
2900701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff}
2910701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroffunsigned ObjCContainerDecl::getNumClassMethods() const {
2920701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  unsigned sum = 0;
2930701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  for (classmeth_iterator I=classmeth_begin(), E=classmeth_end(); I != E; ++I)
2940701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff    sum++;
2950701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff  return sum;
2960701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff}
2976327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroffunsigned ObjCContainerDecl::getNumProperties() const {
2986327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroff  unsigned sum = 0;
2996327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroff  for (prop_iterator I=prop_begin(), E=prop_end(); I != E; ++I)
3006327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroff    sum++;
3016327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroff  return sum;
3026327e0d55c590b3c2766fa76ef1db241a0467df2Steve Naroff}
3030701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff
304559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// FindPropertyDeclaration - Finds declaration of the property given its name
305559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// in 'PropertyId' and returns it. It returns 0, if not found.
30693983f8fa120330bf212bfde7e65da2709fb3be8Steve Naroff/// FIXME: Convert to DeclContext lookup...
307559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian///
308559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz JahanianObjCPropertyDecl *
30909c4719788a5cea09897525e528fa00420f1677bSteve NaroffObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
31009c4719788a5cea09897525e528fa00420f1677bSteve Naroff  for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I) {
311559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian    ObjCPropertyDecl *property = *I;
312559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian    if (property->getIdentifier() == PropertyId)
313559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian      return property;
3143d2c22b1d334fa74d26a5f21841cb55df5dfdd1aSteve Naroff  }
315a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian  const ObjCProtocolDecl *PID = dyn_cast<ObjCProtocolDecl>(this);
316a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian  if (PID) {
317a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian    for (ObjCProtocolDecl::protocol_iterator P = PID->protocol_begin(),
318a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian         E = PID->protocol_end();
319a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian         P != E; ++P)
320a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian      if (ObjCPropertyDecl *property =
321a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian            (*P)->FindPropertyDeclaration(PropertyId))
322a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian        return property;
323a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian  }
324a66793ee8d2589ead81739d9b8a968650db3d452Fariborz Jahanian
325f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian  if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this)) {
32609c4719788a5cea09897525e528fa00420f1677bSteve Naroff    // Look through categories.
32709c4719788a5cea09897525e528fa00420f1677bSteve Naroff    for (ObjCCategoryDecl *Category = OID->getCategoryList();
32809c4719788a5cea09897525e528fa00420f1677bSteve Naroff         Category; Category = Category->getNextClassCategory()) {
32909c4719788a5cea09897525e528fa00420f1677bSteve Naroff      ObjCPropertyDecl *property = Category->FindPropertyDeclaration(PropertyId);
33009c4719788a5cea09897525e528fa00420f1677bSteve Naroff      if (property)
33109c4719788a5cea09897525e528fa00420f1677bSteve Naroff        return property;
33209c4719788a5cea09897525e528fa00420f1677bSteve Naroff    }
33309c4719788a5cea09897525e528fa00420f1677bSteve Naroff    // Look through protocols.
33409c4719788a5cea09897525e528fa00420f1677bSteve Naroff    for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(),
33509c4719788a5cea09897525e528fa00420f1677bSteve Naroff         E = OID->protocol_end(); I != E; ++I) {
33609c4719788a5cea09897525e528fa00420f1677bSteve Naroff      ObjCProtocolDecl *Protocol = *I;
33709c4719788a5cea09897525e528fa00420f1677bSteve Naroff      ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId);
33809c4719788a5cea09897525e528fa00420f1677bSteve Naroff      if (property)
33909c4719788a5cea09897525e528fa00420f1677bSteve Naroff        return property;
34009c4719788a5cea09897525e528fa00420f1677bSteve Naroff    }
34109c4719788a5cea09897525e528fa00420f1677bSteve Naroff    if (OID->getSuperClass())
34209c4719788a5cea09897525e528fa00420f1677bSteve Naroff      return OID->getSuperClass()->FindPropertyDeclaration(PropertyId);
343559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian  }
344f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian  else if (const ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(this)) {
345f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian    // Look through protocols.
346f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian    for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(),
347f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian         E = OCD->protocol_end(); I != E; ++I) {
348f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian      ObjCProtocolDecl *Protocol = *I;
349f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian      ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId);
350f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian      if (property)
351f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian        return property;
352f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian    }
353f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian  }
354559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian  return 0;
355559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian}
356559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian
3571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable(
3581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) {
3591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCInterfaceDecl* ClassDecl = this;
3601e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  while (ClassDecl != NULL) {
3611e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end();
3621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner         I != E; ++I) {
3631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      if ((*I)->getIdentifier() == ID) {
3641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        clsDeclared = ClassDecl;
3651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        return *I;
3661e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      }
3671e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    }
3681e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    ClassDecl = ClassDecl->getSuperClass();
3691e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  }
3701e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
3711e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
3721e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
3731e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in
3741e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// the class, its categories, and its super classes (using a linear search).
3751e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) {
3761e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCInterfaceDecl* ClassDecl = this;
3771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCMethodDecl *MethodDecl = 0;
3781e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
3791e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  while (ClassDecl != NULL) {
3801e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((MethodDecl = ClassDecl->getInstanceMethod(Sel)))
3811e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return MethodDecl;
3821e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
3831e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    // Didn't find one yet - look through protocols.
3843db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner    const ObjCList<ObjCProtocolDecl> &Protocols =
3853db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner      ClassDecl->getReferencedProtocols();
3863db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner    for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
3873db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner         E = Protocols.end(); I != E; ++I)
3883db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner      if ((MethodDecl = (*I)->getInstanceMethod(Sel)))
3891e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        return MethodDecl;
3903db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner
3911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    // Didn't find one yet - now look through categories.
3921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList();
3931e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    while (CatDecl) {
3941e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      if ((MethodDecl = CatDecl->getInstanceMethod(Sel)))
3951e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        return MethodDecl;
396b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff
397b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff      // Didn't find one yet - look through protocols.
398b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff      const ObjCList<ObjCProtocolDecl> &Protocols =
399b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff        CatDecl->getReferencedProtocols();
400b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff      for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
401b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff           E = Protocols.end(); I != E; ++I)
402b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff        if ((MethodDecl = (*I)->getInstanceMethod(Sel)))
403b79c01ea321687d8b9e82968395f30c5c261a6b0Steve Naroff          return MethodDecl;
4041e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      CatDecl = CatDecl->getNextClassCategory();
4051e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    }
4061e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    ClassDecl = ClassDecl->getSuperClass();
4071e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  }
4081e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
4091e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
4101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
4111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupClassMethod - This method returns a class method by looking in the
4121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// class, its categories, and its super classes (using a linear search).
4131e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) {
4141e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCInterfaceDecl* ClassDecl = this;
4151e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCMethodDecl *MethodDecl = 0;
4161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
4171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  while (ClassDecl != NULL) {
4181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((MethodDecl = ClassDecl->getClassMethod(Sel)))
4191e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return MethodDecl;
4201e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
4211e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    // Didn't find one yet - look through protocols.
422780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner    for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(),
423780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner         E = ClassDecl->protocol_end(); I != E; ++I)
4243db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner      if ((MethodDecl = (*I)->getClassMethod(Sel)))
4251e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        return MethodDecl;
426780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner
4271e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    // Didn't find one yet - now look through categories.
4281e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList();
4291e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    while (CatDecl) {
4301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      if ((MethodDecl = CatDecl->getClassMethod(Sel)))
4311e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner        return MethodDecl;
4321e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      CatDecl = CatDecl->getNextClassCategory();
4331e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    }
4341e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    ClassDecl = ClassDecl->getSuperClass();
4351e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  }
4361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
4371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
4381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
4393216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// getInstanceMethod - This method returns an instance method by
4403216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// looking in the class implementation. Unlike interfaces, we don't
4413216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// look outside the implementation.
4423216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCImplementationDecl::getInstanceMethod(Selector Sel) const {
4431e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I)
4441e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((*I)->getSelector() == Sel)
4451e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return *I;
4461e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
4471e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
4481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
4493216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// getClassMethod - This method returns a class method by looking in
4503216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// the class implementation. Unlike interfaces, we don't look outside
4513216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// the implementation.
4523216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCImplementationDecl::getClassMethod(Selector Sel) const {
4531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
4541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner       I != E; ++I)
4551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((*I)->getSelector() == Sel)
4561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return *I;
4571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
4581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
4591e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
460ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl
461ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// added to the list of those properties @synthesized/@dynamic in this
462ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// @implementation block.
463ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian///
464ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz JahanianObjCPropertyImplDecl *ObjCImplementationDecl::FindPropertyImplDecl(IdentifierInfo *Id) const {
465ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i) {
466ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    ObjCPropertyImplDecl *PID = *i;
467ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    if (PID->getPropertyDecl()->getIdentifier() == Id)
468ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian      return PID;
469ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  }
470ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  return 0;
471ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian}
472ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian
473ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of
4749482a4f0feca4bc9eb7c6ad36e21cbf7365f5359Fariborz Jahanian/// properties implemented in this @implementation block and returns the
4759482a4f0feca4bc9eb7c6ad36e21cbf7365f5359Fariborz Jahanian/// implemented property that uses it.
476ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian///
477ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz JahanianObjCPropertyImplDecl *ObjCImplementationDecl::FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const {
478ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i) {
479ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    ObjCPropertyImplDecl *PID = *i;
480ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    if (PID->getPropertyIvarDecl() &&
481ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian        PID->getPropertyIvarDecl()->getIdentifier() == ivarId)
482ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian      return PID;
483ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  }
484ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  return 0;
485ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian}
486ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian
487ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of
488d6eed1cb06016d2e41f9dba4b794f52696415eecChris Lattner/// properties implemented in this category @implementation block and returns
489d6eed1cb06016d2e41f9dba4b794f52696415eecChris Lattner/// the implemented property that uses it.
490ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian///
491d6eed1cb06016d2e41f9dba4b794f52696415eecChris LattnerObjCPropertyImplDecl *ObjCCategoryImplDecl::
492d6eed1cb06016d2e41f9dba4b794f52696415eecChris LattnerFindPropertyImplIvarDecl(IdentifierInfo *ivarId) const {
493d6eed1cb06016d2e41f9dba4b794f52696415eecChris Lattner  for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
494ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    ObjCPropertyImplDecl *PID = *i;
495ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    if (PID->getPropertyIvarDecl() &&
496ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian        PID->getPropertyIvarDecl()->getIdentifier() == ivarId)
497ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian      return PID;
498ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  }
499ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  return 0;
500ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian}
501ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian
502ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl
503ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// added to the list of those properties @synthesized/@dynamic in this
504ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// category @implementation block.
505ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian///
506d6eed1cb06016d2e41f9dba4b794f52696415eecChris LattnerObjCPropertyImplDecl *ObjCCategoryImplDecl::
507d6eed1cb06016d2e41f9dba4b794f52696415eecChris LattnerFindPropertyImplDecl(IdentifierInfo *Id) const {
508d6eed1cb06016d2e41f9dba4b794f52696415eecChris Lattner  for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
509ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    ObjCPropertyImplDecl *PID = *i;
510ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian    if (PID->getPropertyDecl()->getIdentifier() == Id)
511ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian      return PID;
512ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  }
513ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian  return 0;
514ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian}
515ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian
5161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - This method returns an instance method by looking in
5171e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the
5181e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// implementation.
5193216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) const {
5201e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I)
5211e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((*I)->getSelector() == Sel)
5221e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return *I;
5231e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
5241e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
5251e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5261e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupClassMethod - This method returns an instance method by looking in
5271e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the
5281e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// implementation.
5293216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) const {
5301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
5311e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner       I != E; ++I)
5321e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    if ((*I)->getSelector() == Sel)
5331e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner      return *I;
5341e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
5351e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
5361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - Lookup a instance method in the protocol and protocols
5381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// it inherited.
5391e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) {
5401e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCMethodDecl *MethodDecl = NULL;
5411e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5421e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  if ((MethodDecl = getInstanceMethod(Sel)))
5431e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return MethodDecl;
5441e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
545780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner  for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
546d8df6823420c22329a2a9aacd2a440368d38d86cSteve Naroff    if ((MethodDecl = (*I)->lookupInstanceMethod(Sel)))
547780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner      return MethodDecl;
5481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
5491e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
5501e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5511e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// lookupInstanceMethod - Lookup a class method in the protocol and protocols
5521e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner// it inherited.
5531e03a561f4bd96910cb31a8af53a6ad321a12b51Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) {
5541e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  ObjCMethodDecl *MethodDecl = NULL;
5551e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5561e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  if ((MethodDecl = getClassMethod(Sel)))
5571e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return MethodDecl;
5581e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
559780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner  for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
560d8df6823420c22329a2a9aacd2a440368d38d86cSteve Naroff    if ((MethodDecl = (*I)->lookupClassMethod(Sel)))
561780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner      return MethodDecl;
5621e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return NULL;
5631e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
5641e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5651e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// getSynthesizedMethodSize - Compute size of synthesized method name
5661e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner/// as done be the rewrite.
5671e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner///
5681e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattnerunsigned ObjCMethodDecl::getSynthesizedMethodSize() const {
5691e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  // syntesized method name is a concatenation of -/+[class-name selector]
5701e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  // Get length of this name.
5711e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  unsigned length = 3;  // _I_ or _C_
5728ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner  length += getClassInterface()->getNameAsString().size()+1; // extra for _
5733e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff  if (const ObjCCategoryImplDecl *CID =
5743e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff      dyn_cast<ObjCCategoryImplDecl>(getDeclContext()))
5758ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner    length += CID->getNameAsString().size()+1;
576077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner  length += getSelector().getAsString().size(); // selector name
5771e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return length;
5781e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
5791e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner
5805619688510185081cbb4621d703daf7ee24cf39aChris LattnerObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() {
5813e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff  if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(getDeclContext()))
5821e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return ID;
5833e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff  if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(getDeclContext()))
5841e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return CD->getClassInterface();
5851e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  if (ObjCImplementationDecl *IMD =
5863e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff        dyn_cast<ObjCImplementationDecl>(getDeclContext()))
5871e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return IMD->getClassInterface();
5883e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff  if (ObjCCategoryImplDecl *CID =
5893e0a540b6d846178857289ec0eb8470a278d11a3Steve Naroff        dyn_cast<ObjCCategoryImplDecl>(getDeclContext()))
5901e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner    return CID->getClassInterface();
5911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  assert(false && "unknown method context");
5921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner  return 0;
5931e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner}
594f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner
595628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz JahanianObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C,
596d04341000d35c8808a72838b057eed7bf13b7661Douglas Gregor                                                   DeclContext *DC,
597628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian                                                   SourceLocation atLoc,
598628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian                                                   SourceLocation L,
599628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian                                                   ObjCPropertyDecl *property,
6009f0afd4e79601d9982072ff9318e6f9a982c770eDaniel Dunbar                                                   Kind PK,
601628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian                                                   ObjCIvarDecl *ivar) {
6023e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar);
603628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian}
604f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner
6050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
606