DeclObjC.cpp revision ab35163a5b80bf1bd49f0eebb708970f2b0e04e9
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//===----------------------------------------------------------------------===// 20ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCInterfaceDecl 21ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 22ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 23ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// Get the local instance method declared in this interface. 24ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// FIXME: handle overloading, instance & class methods can have the same name. 25ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCContainerDecl::getInstanceMethod(Selector Sel) const { 26ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner lookup_const_result MethodResult = lookup(Sel); 27ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (MethodResult.first) 28ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return const_cast<ObjCMethodDecl*>( 29ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner dyn_cast<ObjCMethodDecl>(*MethodResult.first)); 30ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return 0; 31ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 32ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 33ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// Get the local class method declared in this interface. 34ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCContainerDecl::getClassMethod(Selector Sel) const { 35ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner lookup_const_result MethodResult = lookup(Sel); 36ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (MethodResult.first) 37ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return const_cast<ObjCMethodDecl*>( 38ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner dyn_cast<ObjCMethodDecl>(*MethodResult.first)); 39ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return 0; 40ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 41ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 42ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// FindPropertyDeclaration - Finds declaration of the property given its name 43ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// in 'PropertyId' and returns it. It returns 0, if not found. 44ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// FIXME: Convert to DeclContext lookup... 45ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// 46ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyDecl * 47ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const { 48ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I) 49ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((*I)->getIdentifier() == PropertyId) 50ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return *I; 51ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 52ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const ObjCProtocolDecl *PID = dyn_cast<ObjCProtocolDecl>(this); 53ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (PID) { 54ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 55ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = PID->protocol_end(); I != E; ++I) 56ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 57ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return P; 58ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 59ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 60ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this)) { 61ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Look through categories. 62ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCCategoryDecl *Category = OID->getCategoryList(); 63ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner Category; Category = Category->getNextClassCategory()) { 64ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCPropertyDecl *P = Category->FindPropertyDeclaration(PropertyId)) 65ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return P; 66ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 67ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Look through protocols. 68ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(), 69ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = OID->protocol_end(); I != E; ++I) { 70ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 71ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return P; 72ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 73ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (OID->getSuperClass()) 74ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return OID->getSuperClass()->FindPropertyDeclaration(PropertyId); 75ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } else if (const ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(this)) { 76ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Look through protocols. 77ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(), 78ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = OCD->protocol_end(); I != E; ++I) { 79ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 80ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return P; 81ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 82ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 83ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return 0; 84ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 85ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 86ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( 87ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { 88ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 89ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner while (ClassDecl != NULL) { 90ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); 91ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner I != E; ++I) { 92ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((*I)->getIdentifier() == ID) { 93ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner clsDeclared = ClassDecl; 94ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return *I; 95ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 96ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 97ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 98ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 99ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return NULL; 100ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 101ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 102ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// lookupInstanceMethod - This method returns an instance method by looking in 103ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// the class, its categories, and its super classes (using a linear search). 104ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { 105ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 106ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCMethodDecl *MethodDecl = 0; 107ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 108ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner while (ClassDecl != NULL) { 109ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) 110ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 111ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 112ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Didn't find one yet - look through protocols. 113ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const ObjCList<ObjCProtocolDecl> &Protocols = 114ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ClassDecl->getReferencedProtocols(); 115ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 116ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = Protocols.end(); I != E; ++I) 117ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = (*I)->getInstanceMethod(Sel))) 118ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 119ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 120ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Didn't find one yet - now look through categories. 121ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 122ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner while (CatDecl) { 123ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) 124ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 125ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 126ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Didn't find one yet - look through protocols. 127ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const ObjCList<ObjCProtocolDecl> &Protocols = 128ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner CatDecl->getReferencedProtocols(); 129ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 130ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = Protocols.end(); I != E; ++I) 131ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = (*I)->getInstanceMethod(Sel))) 132ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 133ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner CatDecl = CatDecl->getNextClassCategory(); 134ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 135ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 136ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 137ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return NULL; 138ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 139ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 140ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// lookupClassMethod - This method returns a class method by looking in the 141ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// class, its categories, and its super classes (using a linear search). 142ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { 143ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl* ClassDecl = this; 144ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCMethodDecl *MethodDecl = 0; 145ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 146ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner while (ClassDecl != NULL) { 147ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = ClassDecl->getClassMethod(Sel))) 148ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 149ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 150ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Didn't find one yet - look through protocols. 151ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(), 152ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner E = ClassDecl->protocol_end(); I != E; ++I) 153ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = (*I)->getClassMethod(Sel))) 154ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 155ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 156ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Didn't find one yet - now look through categories. 157ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 158ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner while (CatDecl) { 159ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = CatDecl->getClassMethod(Sel))) 160ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 161ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner CatDecl = CatDecl->getNextClassCategory(); 162ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 163ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ClassDecl = ClassDecl->getSuperClass(); 164ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 165ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return NULL; 166ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 167ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 168ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 169ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 170ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 171ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCMethodDecl 1726c4ae5de0c356777446f823b573821fb95560d91Chris Lattner//===----------------------------------------------------------------------===// 1736c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 1740ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, 1750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation beginLoc, 1766c4ae5de0c356777446f823b573821fb95560d91Chris Lattner SourceLocation endLoc, 1776c4ae5de0c356777446f823b573821fb95560d91Chris Lattner Selector SelInfo, QualType T, 1780701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *contextDecl, 179f6414927e67e27d9324d8d179c5f7ea620443924Daniel Dunbar bool isInstance, 1806c4ae5de0c356777446f823b573821fb95560d91Chris Lattner bool isVariadic, 1814607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized, 182b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner ImplementationControl impControl) { 1833e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCMethodDecl(beginLoc, endLoc, 1840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SelInfo, T, contextDecl, 185f6414927e67e27d9324d8d179c5f7ea620443924Daniel Dunbar isInstance, 1864607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian isVariadic, isSynthesized, impControl); 1870e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner} 1880e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner 1898a779314870760848e61da2c428a78971fe3f1c3Ted Kremenekvoid ObjCMethodDecl::Destroy(ASTContext& C) { 1908a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek if (Body) Body->Destroy(C); 1918a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek if (SelfDecl) SelfDecl->Destroy(C); 1928a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 1938a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 1948a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek if (*I) (*I)->Destroy(C); 195411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner 1962073216a1075767b5d25c23d1462b7034686d94dChris Lattner ParamInfo.clear(); 197411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner 1988a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek Decl::Destroy(C); 1998a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek} 2008a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 201ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattnervoid ObjCMethodDecl::createImplicitParams(ASTContext &Context, 202ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const ObjCInterfaceDecl *OID) { 203ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner QualType selfTy; 204ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (isInstanceMethod()) { 205ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // There may be no interface context due to error in declaration 206ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // of the interface (which has been reported). Recover gracefully. 207ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (OID) { 208ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner selfTy =Context.getObjCInterfaceType(const_cast<ObjCInterfaceDecl*>(OID)); 209ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner selfTy = Context.getPointerType(selfTy); 210ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } else { 211ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner selfTy = Context.getObjCIdType(); 212ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 213ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } else // we have a factory method. 214ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner selfTy = Context.getObjCClassType(); 215ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 216ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner SelfDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), 217ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner &Context.Idents.get("self"), selfTy); 218ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 219ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner CmdDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), 220ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner &Context.Idents.get("_cmd"), 221ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner Context.getObjCSelType()); 222ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 223ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 224ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 225ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 226ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// getSynthesizedMethodSize - Compute size of synthesized method name 227ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// as done be the rewrite. 228ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// 229ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattnerunsigned ObjCMethodDecl::getSynthesizedMethodSize() const { 230ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // syntesized method name is a concatenation of -/+[class-name selector] 231ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner // Get length of this name. 232ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner unsigned length = 3; // _I_ or _C_ 233ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner length += getClassInterface()->getNameAsString().size()+1; // extra for _ 234ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (const ObjCCategoryImplDecl *CID = 235ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner dyn_cast<ObjCCategoryImplDecl>(getDeclContext())) 236ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner length += CID->getNameAsString().size()+1; 237ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner length += getSelector().getAsString().size(); // selector name 238ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return length; 239ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 240ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 241ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() { 242ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(getDeclContext())) 243ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return ID; 244ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(getDeclContext())) 245ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return CD->getClassInterface(); 246ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCImplementationDecl *IMD = 247ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner dyn_cast<ObjCImplementationDecl>(getDeclContext())) 248ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return IMD->getClassInterface(); 249ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (ObjCCategoryImplDecl *CID = 250ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner dyn_cast<ObjCCategoryImplDecl>(getDeclContext())) 251ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return CID->getClassInterface(); 252ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner assert(false && "unknown method context"); 253ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return 0; 254ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 255ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 256ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 257ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCInterfaceDecl 258ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 2590b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner 2600ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, 261d04341000d35c8808a72838b057eed7bf13b7661Douglas Gregor DeclContext *DC, 2620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation atLoc, 263d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff IdentifierInfo *Id, 264d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation ClassLoc, 2650e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner bool ForwardDecl, bool isInternal){ 2663e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl, 2670e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner isInternal); 2680e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner} 2696c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 2700b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCInterfaceDecl:: 2710b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id, 2720b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner SourceLocation CLoc, bool FD, bool isInternal) 2730b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id), 274e881483a3bc22ffad62367501aa09ad8508fe363Chris Lattner TypeForDecl(0), SuperClass(0), 2750b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner CategoryList(0), ForwardDecl(FD), InternalInterface(isInternal), 2760b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner ClassLoc(CLoc) { 277e4f039e01e797a38bc97bf22aff9832ecd18ff5fSteve Naroff} 278e4f039e01e797a38bc97bf22aff9832ecd18ff5fSteve Naroff 2790b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCInterfaceDecl::Destroy(ASTContext &C) { 2808a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek for (ivar_iterator I=ivar_begin(), E=ivar_end(); I!=E; ++I) 2818a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek if (*I) (*I)->Destroy(C); 2828a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 283e881483a3bc22ffad62367501aa09ad8508fe363Chris Lattner IVars.clear(); 2840b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner // FIXME: CategoryList? 2850b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner 2861a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek // FIXME: Because there is no clear ownership 2871a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek // role between ObjCInterfaceDecls and the ObjCPropertyDecls that they 2881a726d7cbf62ab13949743e9ef8c0670dd862e46Ted Kremenek // reference, we destroy ObjCPropertyDecls in ~TranslationUnit. 2898a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek Decl::Destroy(C); 2908a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek} 2918a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2928a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 293ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// FindCategoryDeclaration - Finds category declaration in the list of 294ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// categories for this class and returns it. Name of the category is passed 295ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// in 'CategoryId'. If category not found, return 0; 296ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// 297ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCCategoryDecl * 298ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const { 299ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (ObjCCategoryDecl *Category = getCategoryList(); 300ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner Category; Category = Category->getNextClassCategory()) 301ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (Category->getIdentifier() == CategoryId) 302ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return Category; 303ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return 0; 304ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 305ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 306ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// lookupFieldDeclForIvar - looks up a field decl' in the laid out 307ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// storage which matches this 'ivar'. 308ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// 309ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerFieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context, 310ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const ObjCIvarDecl *IVar) { 311ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner const RecordDecl *RecordForDecl = Context.addRecordToClass(this); 312ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class"); 313ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner DeclarationName Member = IVar->getDeclName(); 314ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner DeclContext::lookup_result Lookup = 315ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner (const_cast< RecordDecl *>(RecordForDecl))->lookup(Member); 316ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner assert((Lookup.first != Lookup.second) && "field decl not found"); 317ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner FieldDecl *MemberDecl = dyn_cast<FieldDecl>(*Lookup.first); 318ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner assert(MemberDecl && "field decl not found"); 319ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MemberDecl; 320ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 321ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 322ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 323ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCIvarDecl 324ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 325ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 3260c00aac5d618f39afc406c5b2e07642930af1d56Argyrios KyrtzidisObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC, 3270c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id, 3280c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis QualType T, AccessControl ac, Expr *BW) { 3290c00aac5d618f39afc406c5b2e07642930af1d56Argyrios Kyrtzidis return new (C) ObjCIvarDecl(DC, L, Id, T, ac, BW); 3306c4ae5de0c356777446f823b573821fb95560d91Chris Lattner} 3316c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 33201e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek 333ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 334ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 335ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCAtDefsFieldDecl 336ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 337ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 33801e6779faca1e3a3164c697d6e2dfee0881a6981Ted KremenekObjCAtDefsFieldDecl 33944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor*ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 34001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek IdentifierInfo *Id, QualType T, Expr *BW) { 3413e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCAtDefsFieldDecl(DC, L, Id, T, BW); 34201e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek} 34301e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek 34401e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenekvoid ObjCAtDefsFieldDecl::Destroy(ASTContext& C) { 34501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek this->~ObjCAtDefsFieldDecl(); 3463e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 34701e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek} 34801e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek 349ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 350ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCProtocolDecl 351ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 352ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 353d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC, 3540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 355c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner IdentifierInfo *Id) { 3563e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCProtocolDecl(DC, L, Id); 357cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner} 358cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner 359411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattnervoid ObjCProtocolDecl::Destroy(ASTContext &C) { 3604a323d94e50c8f570cbfaf0392e68215b8ca87bfChris Lattner ReferencedProtocols.clear(); 361411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner ObjCContainerDecl::Destroy(C); 3621c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek} 3631c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 364ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// lookupInstanceMethod - Lookup a instance method in the protocol and protocols 365ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// it inherited. 366ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { 367ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCMethodDecl *MethodDecl = NULL; 368ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 369ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = getInstanceMethod(Sel))) 370ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 371ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 372ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) 373ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) 374ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 375ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return NULL; 376ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 3771c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 378ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// lookupInstanceMethod - Lookup a class method in the protocol and protocols 379ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// it inherited. 380ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { 381ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCMethodDecl *MethodDecl = NULL; 382ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 383ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = getClassMethod(Sel))) 384ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 385ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 386ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) 387ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((MethodDecl = (*I)->lookupClassMethod(Sel))) 388ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return MethodDecl; 389ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return NULL; 390ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 391411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner 392ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 393ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCClassDecl 394ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 395411280e5b25ba7dcd7c8a82a5c23880fe7632a3cChris Lattner 396d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC, 3970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 39867956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner ObjCInterfaceDecl *const *Elts, 39967956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner unsigned nElts) { 4003e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCClassDecl(DC, L, Elts, nElts); 40161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner} 40261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 4030b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCClassDecl::Destroy(ASTContext &C) { 404400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 405400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // FIXME: There is no clear ownership policy now for referenced 406400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // ObjCInterfaceDecls. Some of them can be forward declarations that 407400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // are never later defined (in which case the ObjCClassDecl owns them) 408400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // or the ObjCInterfaceDecl later becomes a real definition later. Ideally 409400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // we should have separate objects for forward declarations and definitions, 410400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // obviating this problem. Because of this situation, referenced 411400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek // ObjCInterfaceDecls are destroyed in ~TranslationUnit. 412400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 41367956052ea5fb0cd7f443de96a11f9a0176dc681Chris Lattner ForwardDecls.clear(); 414400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek Decl::Destroy(C); 415400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek} 416400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 417ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 418ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCForwardProtocolDecl 419ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 420ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 42161f9d41036e30ff80130f99b31c0626e3ef057ccChris LattnerObjCForwardProtocolDecl * 422d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, 4230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 42407fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner ObjCProtocolDecl *const *Elts, 42507fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner unsigned NumElts) { 4263e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts); 42761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner} 42861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 4290b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCForwardProtocolDecl:: 4300b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris LattnerObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, 43107fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner ObjCProtocolDecl *const *Elts, unsigned nElts) 4320b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner : Decl(ObjCForwardProtocol, DC, L) { 43307fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner ReferencedProtocols.set(Elts, nElts); 4340b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner} 4350b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattner 4360b7ebb3dba0df0a6cbf221e5edbc6a4b8848478cChris Lattnervoid ObjCForwardProtocolDecl::Destroy(ASTContext &C) { 43707fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner ReferencedProtocols.clear(); 43807fa7749da805969f2ed467a4eb5b405a4ff9a23Chris Lattner Decl::Destroy(C); 43905ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek} 44005ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 441ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 442ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCCategoryDecl 443ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 444ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 445d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC, 4460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 44761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner IdentifierInfo *Id) { 4483e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCCategoryDecl(DC, L, Id); 44961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner} 45061f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 451ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 452ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCCategoryImplDecl 453ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 454ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner 45575c9cae5f85c72cbb1649e93849e16ede3f07522Chris LattnerObjCCategoryImplDecl * 456d04341000d35c8808a72838b057eed7bf13b7661Douglas GregorObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, 4570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L,IdentifierInfo *Id, 45875c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *ClassInterface) { 4593e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCCategoryImplDecl(DC, L, Id, ClassInterface); 46075c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner} 46175c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 462f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner 463ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of 464ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// properties implemented in this category @implementation block and returns 465ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// the implemented property that uses it. 466aaa63a761c6671a08e3f4f463435b72739fa194bFariborz Jahanian/// 467ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyImplDecl *ObjCCategoryImplDecl:: 468ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerFindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { 469ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 470ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCPropertyImplDecl *PID = *i; 471ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (PID->getPropertyIvarDecl() && 472ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner PID->getPropertyIvarDecl()->getIdentifier() == ivarId) 473ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return PID; 474ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner } 4750701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return 0; 4760701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff} 4770701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff 478ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl 479ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// added to the list of those properties @synthesized/@dynamic in this 480ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// category @implementation block. 481559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// 482ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyImplDecl *ObjCCategoryImplDecl:: 483ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerFindPropertyImplDecl(IdentifierInfo *Id) const { 484ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 485ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCPropertyImplDecl *PID = *i; 486ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if (PID->getPropertyDecl()->getIdentifier() == Id) 487ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return PID; 488f034e9cc4dad81d8fe6eb88a84da55b2909a9cddFariborz Jahanian } 489559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return 0; 490559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian} 491559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 492ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// lookupInstanceMethod - This method returns an instance method by looking in 493ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the 494ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// implementation. 495ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) const { 496ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 497ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((*I)->getSelector() == Sel) 498ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return *I; 4991e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 5001e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5011e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 502ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// lookupClassMethod - This method returns an instance method by looking in 503ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// the class implementation. Unlike interfaces, we don't look outside the 504ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// implementation. 505ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) const { 506ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 507ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner I != E; ++I) 508ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner if ((*I)->getSelector() == Sel) 509ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return *I; 5101e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 5111e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5121e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 513ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 514ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCImplementationDecl 515ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 5161e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 517ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCImplementationDecl * 518ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, 519ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner SourceLocation L, 520ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl *ClassInterface, 521ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl *SuperDecl) { 522ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl); 523ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner} 5241e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 525ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner/// Destroy - Call destructors and release memory. 526ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattnervoid ObjCImplementationDecl::Destroy(ASTContext& C) { 527ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner IVars.clear(); 528ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner Decl::Destroy(C); 5291e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5301e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 5313216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// getInstanceMethod - This method returns an instance method by 5323216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// looking in the class implementation. Unlike interfaces, we don't 5333216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// look outside the implementation. 5343216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCImplementationDecl::getInstanceMethod(Selector Sel) const { 5351e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 5361e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 5371e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 5381e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 5391e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5401e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 5413216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// getClassMethod - This method returns a class method by looking in 5423216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// the class implementation. Unlike interfaces, we don't look outside 5433216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel Dunbar/// the implementation. 5443216dcdebb8ae0f2993ac5f5249caa217444bacfDaniel DunbarObjCMethodDecl *ObjCImplementationDecl::getClassMethod(Selector Sel) const { 5451e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 5461e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner I != E; ++I) 5471e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner if ((*I)->getSelector() == Sel) 5481e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return *I; 5491e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner return NULL; 5501e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5511e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 552ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl 553ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// added to the list of those properties @synthesized/@dynamic in this 554ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// @implementation block. 555ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// 556ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyImplDecl *ObjCImplementationDecl:: 557ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerFindPropertyImplDecl(IdentifierInfo *Id) const { 558ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 559ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian ObjCPropertyImplDecl *PID = *i; 560ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian if (PID->getPropertyDecl()->getIdentifier() == Id) 561ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian return PID; 562ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian } 563ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian return 0; 564ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian} 565ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian 566ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of 5679482a4f0feca4bc9eb7c6ad36e21cbf7365f5359Fariborz Jahanian/// properties implemented in this @implementation block and returns the 5689482a4f0feca4bc9eb7c6ad36e21cbf7365f5359Fariborz Jahanian/// implemented property that uses it. 569ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian/// 570ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyImplDecl *ObjCImplementationDecl:: 571d6eed1cb06016d2e41f9dba4b794f52696415eecChris LattnerFindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { 572d6eed1cb06016d2e41f9dba4b794f52696415eecChris Lattner for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 573ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian ObjCPropertyImplDecl *PID = *i; 574ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian if (PID->getPropertyIvarDecl() && 575ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian PID->getPropertyIvarDecl()->getIdentifier() == ivarId) 576ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian return PID; 577ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian } 578ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian return 0; 579ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian} 580ae6f6fd1527a1da84679a6f0439dec3bbbd6ca7bFariborz Jahanian 581ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 582ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCCompatibleAliasDecl 583ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 5841e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 585ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCCompatibleAliasDecl * 586ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, 587ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner SourceLocation L, 588ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner IdentifierInfo *Id, 589ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner ObjCInterfaceDecl* AliasedClass) { 590ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass); 5911e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 5921e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 593ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 594ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCPropertyDecl 595ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 5961e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 597ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris LattnerObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC, 598ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner SourceLocation L, 599ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner IdentifierInfo *Id, 600ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner QualType T, 601ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner PropertyControl propControl) { 602ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner return new (C) ObjCPropertyDecl(DC, L, Id, T); 6031e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner} 6041e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 6051e03a561f4bd96910cb31a8af53a6ad321a12b51Chris Lattner 606ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 607ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner// ObjCPropertyImplDecl 608ab35163a5b80bf1bd49f0eebb708970f2b0e04e9Chris Lattner//===----------------------------------------------------------------------===// 609f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner 610628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz JahanianObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C, 611d04341000d35c8808a72838b057eed7bf13b7661Douglas Gregor DeclContext *DC, 612628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian SourceLocation atLoc, 613628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian SourceLocation L, 614628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyDecl *property, 6159f0afd4e79601d9982072ff9318e6f9a982c770eDaniel Dunbar Kind PK, 616628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCIvarDecl *ivar) { 6173e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar); 618628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian} 619f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner 6200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 621