DeclObjC.cpp revision 91b0b0cf6b537cbcbca0038c7032f87161a41d31
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- DeclObjC.cpp - ObjC Declaration AST Node Implementation ----------===// 2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// The LLVM Compiler Infrastructure 4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source 6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details. 7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Objective-C related Decl classes. 11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/DeclObjC.h" 15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h" 164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman#include "clang/AST/Stmt.h" 170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "llvm/ADT/STLExtras.h" 1854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattnerusing namespace clang; 1906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 20c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson//===----------------------------------------------------------------------===// 21c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// ObjCListBase 22f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 23d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 24c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonvoid ObjCListBase::Destroy(ASTContext &Ctx) { 2587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Ctx.Deallocate(List); 2687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner NumElts = 0; 2787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner List = 0; 2887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner} 2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnervoid ObjCListBase::set(void *const* InList, unsigned Elts, ASTContext &Ctx) { 3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner assert(List == 0 && "Elements already set!"); 3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (Elts == 0) return; // Setting to an empty list is a noop. 3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner List = new (Ctx) void*[Elts]; 3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner NumElts = Elts; 3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner memcpy(List, InList, sizeof(void*)*Elts); 3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner} 3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner//===----------------------------------------------------------------------===// 4254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson// ObjCInterfaceDecl 4354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson//===----------------------------------------------------------------------===// 44f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 45f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson// Get the local instance method declared in this interface. 46f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders CarlssonObjCMethodDecl *ObjCContainerDecl::getInstanceMethod(Selector Sel) const { 47f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson // Since instance & class methods can have the same name, the loop below 4854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson // ensures we get the correct method. 4954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson // 50f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson // @interface Whatever 5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // - (int) class_method; 5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // + (float) class_method; 5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // @end 544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // 5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner lookup_const_iterator Meth, MethEnd; 5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner for (llvm::tie(Meth, MethEnd) = lookup(Sel); 57d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Meth != MethEnd; ++Meth) { 589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth); 599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson if (MD && MD->isInstanceMethod()) 60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return MD; 61f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return 0; 634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Get the local class method declared in this interface. 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCMethodDecl *ObjCContainerDecl::getClassMethod(Selector Sel) const { 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Since instance & class methods can have the same name, the loop below 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // ensures we get the correct method. 694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // 704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // @interface Whatever 714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // - (int) class_method; 724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // + (float) class_method; 734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // @end 744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // 754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman lookup_const_iterator Meth, MethEnd; 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (llvm::tie(Meth, MethEnd) = lookup(Sel); 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Meth != MethEnd; ++Meth) { 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth); 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (MD && MD->isClassMethod()) 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return MD; 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return 0; 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// FindPropertyDeclaration - Finds declaration of the property given its name 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// in 'PropertyId' and returns it. It returns 0, if not found. 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// FIXME: Convert to DeclContext lookup... 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCPropertyDecl * 904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const { 914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I) 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if ((*I)->getIdentifier() == PropertyId) 934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return *I; 944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ObjCProtocolDecl *PID = dyn_cast<ObjCProtocolDecl>(this); 964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (PID) { 974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman E = PID->protocol_end(); I != E; ++I) 994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 1004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return P; 1014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1038a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this)) { 1044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Look through categories. 1054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCCategoryDecl *Category = OID->getCategoryList(); 1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Category; Category = Category->getNextClassCategory()) { 1078a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar if (ObjCPropertyDecl *P = Category->FindPropertyDeclaration(PropertyId)) 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return P; 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Look through protocols. 1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(), 11235873c49adad211ff466e34342a52665742794f5Anders Carlsson E = OID->protocol_end(); I != E; ++I) { 1134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 1144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return P; 1154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (OID->getSuperClass()) 1173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return OID->getSuperClass()->FindPropertyDeclaration(PropertyId); 1184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (const ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(this)) { 1194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Look through protocols. 1204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(), 1214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman E = OCD->protocol_end(); I != E; ++I) { 1224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) 1234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return P; 1244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 12635873c49adad211ff466e34342a52665742794f5Anders Carlsson return 0; 12735873c49adad211ff466e34342a52665742794f5Anders Carlsson} 12835873c49adad211ff466e34342a52665742794f5Anders Carlsson 12935873c49adad211ff466e34342a52665742794f5Anders CarlssonObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( 13035873c49adad211ff466e34342a52665742794f5Anders Carlsson IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { 13135873c49adad211ff466e34342a52665742794f5Anders Carlsson ObjCInterfaceDecl* ClassDecl = this; 13235873c49adad211ff466e34342a52665742794f5Anders Carlsson while (ClassDecl != NULL) { 13335873c49adad211ff466e34342a52665742794f5Anders Carlsson for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); 1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman I != E; ++I) { 1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if ((*I)->getIdentifier() == ID) { 1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman clsDeclared = ClassDecl; 1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return *I; 1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ClassDecl = ClassDecl->getSuperClass(); 1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return NULL; 1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// lookupInstanceMethod - This method returns an instance method by looking in 1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman/// the class, its categories, and its super classes (using a linear search). 1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { 1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ObjCInterfaceDecl* ClassDecl = this; 1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ObjCMethodDecl *MethodDecl = 0; 1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman while (ClassDecl != NULL) { 1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) 1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return MethodDecl; 1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Didn't find one yet - look through protocols. 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ObjCList<ObjCProtocolDecl> &Protocols = 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ClassDecl->getReferencedProtocols(); 1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 15944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor E = Protocols.end(); I != E; ++I) 16044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) 16144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return MethodDecl; 16244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 16344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Didn't find one yet - now look through categories. 1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman while (CatDecl) { 1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) 1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return MethodDecl; 1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // Didn't find one yet - look through protocols. 1704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ObjCList<ObjCProtocolDecl> &Protocols = 1714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman CatDecl->getReferencedProtocols(); 1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 1733068d117951a8df54bae9db039b56201ab10962bAnders Carlsson E = Protocols.end(); I != E; ++I) 1743068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) 1753068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return MethodDecl; 1763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson CatDecl = CatDecl->getNextClassCategory(); 1773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 1783068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ClassDecl = ClassDecl->getSuperClass(); 1793068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 1803068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return NULL; 1813068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 1823068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1833068d117951a8df54bae9db039b56201ab10962bAnders Carlsson// lookupClassMethod - This method returns a class method by looking in the 1843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson// class, its categories, and its super classes (using a linear search). 1853068d117951a8df54bae9db039b56201ab10962bAnders CarlssonObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { 1863068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ObjCInterfaceDecl* ClassDecl = this; 1873068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ObjCMethodDecl *MethodDecl = 0; 1883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson while (ClassDecl != NULL) { 1903068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if ((MethodDecl = ClassDecl->getClassMethod(Sel))) 1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return MethodDecl; 1924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 193f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Didn't find one yet - look through protocols. 194f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(), 195f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner E = ClassDecl->protocol_end(); I != E; ++I) 196c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson if ((MethodDecl = (*I)->lookupClassMethod(Sel))) 1972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return MethodDecl; 1982bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 19987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Didn't find one yet - now look through categories. 2002bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); 2012bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson while (CatDecl) { 20287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if ((MethodDecl = CatDecl->getClassMethod(Sel))) 203f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return MethodDecl; 2042bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2052bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson // Didn't find one yet - look through protocols. 2062bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson const ObjCList<ObjCProtocolDecl> &Protocols = 2072bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson CatDecl->getReferencedProtocols(); 2082bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 2092bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson E = Protocols.end(); I != E; ++I) 210650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if ((MethodDecl = (*I)->lookupClassMethod(Sel))) 211650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return MethodDecl; 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman CatDecl = CatDecl->getNextClassCategory(); 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman ClassDecl = ClassDecl->getSuperClass(); 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2162bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return NULL; 217f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 2182bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 21987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 220f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 221f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 22287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner// ObjCMethodDecl 223f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 224f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 225650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders CarlssonObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, 226f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner SourceLocation beginLoc, 227650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson SourceLocation endLoc, 228650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson Selector SelInfo, QualType T, 229650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson DeclContext *contextDecl, 230650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson bool isInstance, 231650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson bool isVariadic, 232650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson bool isSynthesized, 233650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson ImplementationControl impControl) { 234f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return new (C) ObjCMethodDecl(beginLoc, endLoc, 235650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson SelInfo, T, contextDecl, 236650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson isInstance, 23787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner isVariadic, isSynthesized, impControl); 238650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 239f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 240650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlssonvoid ObjCMethodDecl::Destroy(ASTContext &C) { 24187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (Body) Body->Destroy(C); 242650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (SelfDecl) SelfDecl->Destroy(C); 243650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (*I) (*I)->Destroy(C); 2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 247650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson ParamInfo.Destroy(C); 2484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 249650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson Decl::Destroy(C); 2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 251650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanvoid ObjCMethodDecl::createImplicitParams(ASTContext &Context, 2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ObjCInterfaceDecl *OID) { 254650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson QualType selfTy; 255650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (isInstanceMethod()) { 2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // There may be no interface context due to error in declaration 2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // of the interface (which has been reported). Recover gracefully. 2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (OID) { 2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman selfTy =Context.getObjCInterfaceType(const_cast<ObjCInterfaceDecl*>(OID)); 2604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman selfTy = Context.getPointerType(selfTy); 2614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 2624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman selfTy = Context.getObjCIdType(); 2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else // we have a factory method. 2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman selfTy = Context.getObjCClassType(); 2664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SelfDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), 2684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman &Context.Idents.get("self"), selfTy); 2694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman CmdDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), 271d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson &Context.Idents.get("_cmd"), 272650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson Context.getObjCSelType()); 273b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner} 274650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 275650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson/// getSynthesizedMethodSize - Compute size of synthesized method name 278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson/// as done be the rewrite. 27987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlssonunsigned ObjCMethodDecl::getSynthesizedMethodSize() const { 281f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // syntesized method name is a concatenation of -/+[class-name selector] 282650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Get length of this name. 283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson unsigned length = 3; // _I_ or _C_ 284d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman length += getClassInterface()->getNameAsString().size()+1; // extra for _ 285650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (const ObjCCategoryImplDecl *CID = 28687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner dyn_cast<ObjCCategoryImplDecl>(getDeclContext())) 28787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner length += CID->getNameAsString().size()+1; 288650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson length += getSelector().getAsString().size(); // selector name 289650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return length; 290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() { 2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(getDeclContext())) 2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return ID; 2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(getDeclContext())) 2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return CD->getClassInterface(); 2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCImplementationDecl *IMD = 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman dyn_cast<ObjCImplementationDecl>(getDeclContext())) 2994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return IMD->getClassInterface(); 3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (ObjCCategoryImplDecl *CID = 301650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson dyn_cast<ObjCCategoryImplDecl>(getDeclContext())) 302650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return CID->getClassInterface(); 303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson assert(false && "unknown method context"); 3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return 0; 3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// ObjCInterfaceDecl 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, 3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman DeclContext *DC, 3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SourceLocation atLoc, 3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman IdentifierInfo *Id, 3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SourceLocation ClassLoc, 316f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner bool ForwardDecl, bool isInternal){ 317f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return new (C) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl, 318f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner isInternal); 319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerObjCInterfaceDecl:: 322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id, 323b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner SourceLocation CLoc, bool FD, bool isInternal) 32487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id), 325b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner TypeForDecl(0), SuperClass(0), 326f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner CategoryList(0), ForwardDecl(FD), InternalInterface(isInternal), 32787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner ClassLoc(CLoc) { 32887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner} 329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3307a76778e218da57a3b10c80066a0a938f28987b6Chris Lattnervoid ObjCInterfaceDecl::Destroy(ASTContext &C) { 33154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner for (ivar_iterator I=ivar_begin(), E=ivar_end(); I!=E; ++I) 33254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (*I) (*I)->Destroy(C); 33354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 33482206e267ce6cc709797127616f64672d255b310Anders Carlsson IVars.Destroy(C); 33554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson // FIXME: CategoryList? 33654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 33782206e267ce6cc709797127616f64672d255b310Anders Carlsson // FIXME: Because there is no clear ownership 33854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // role between ObjCInterfaceDecls and the ObjCPropertyDecls that they 33954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // reference, we destroy ObjCPropertyDecls in ~TranslationUnit. 34054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Decl::Destroy(C); 34182206e267ce6cc709797127616f64672d255b310Anders Carlsson} 34254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 34354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 344f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson/// FindCategoryDeclaration - Finds category declaration in the list of 34532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner/// categories for this class and returns it. Name of the category is passed 34632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner/// in 'CategoryId'. If category not found, return 0; 34782206e267ce6cc709797127616f64672d255b310Anders Carlsson/// 34882206e267ce6cc709797127616f64672d255b310Anders CarlssonObjCCategoryDecl * 34954176fdb044312b4b77c3da6682d3575b3728d30Chris LattnerObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const { 35032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner for (ObjCCategoryDecl *Category = getCategoryList(); 35154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Category; Category = Category->getNextClassCategory()) 35232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner if (Category->getIdentifier() == CategoryId) 35354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson return Category; 35454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson return 0; 35554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson} 35682206e267ce6cc709797127616f64672d255b310Anders Carlsson 35732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner/// lookupFieldDeclForIvar - looks up a field decl' in the laid out 35854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner/// storage which matches this 'ivar'. 3597a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner/// 3607a76778e218da57a3b10c80066a0a938f28987b6Chris LattnerFieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context, 361f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner const ObjCIvarDecl *IVar) { 362f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner const RecordDecl *RecordForDecl = Context.addRecordToClass(this); 363f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class"); 36432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner DeclarationName Member = IVar->getDeclName(); 36532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner DeclContext::lookup_result Lookup = 36632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner (const_cast< RecordDecl *>(RecordForDecl))->lookup(Member); 36732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert((Lookup.first != Lookup.second) && "field decl not found"); 36832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner FieldDecl *MemberDecl = dyn_cast<FieldDecl>(*Lookup.first); 3697a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner assert(MemberDecl && "field decl not found"); 37032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return MemberDecl; 3710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson} 372f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 373f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 374b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner// ObjCIvarDecl 375f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3774c4867e140327fa3b56306fa03c64c8e6a7c95efChris LattnerObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC, 3784c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner SourceLocation L, IdentifierInfo *Id, 3794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner QualType T, AccessControl ac, Expr *BW) { 3804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return new (C) ObjCIvarDecl(DC, L, Id, T, ac, BW); 3814c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 3824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3844c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3854c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner//===----------------------------------------------------------------------===// 3864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner// ObjCAtDefsFieldDecl 3874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner//===----------------------------------------------------------------------===// 3884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 389ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel DunbarObjCAtDefsFieldDecl 390ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar*ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 391ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar IdentifierInfo *Id, QualType T, Expr *BW) { 392ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar return new (C) ObjCAtDefsFieldDecl(DC, L, Id, T, BW); 393ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar} 394ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar 395ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbarvoid ObjCAtDefsFieldDecl::Destroy(ASTContext& C) { 3964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner this->~ObjCAtDefsFieldDecl(); 3974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner C.Deallocate((void *)this); 3984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 3994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 400b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===----------------------------------------------------------------------===// 401b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner// ObjCProtocolDecl 402ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes//===----------------------------------------------------------------------===// 403f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 404732b2236ae4a4f11e7642677cebbd169c07ea877Chris LattnerObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC, 40582206e267ce6cc709797127616f64672d255b310Anders Carlsson SourceLocation L, 406f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner IdentifierInfo *Id) { 4070518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return new (C) ObjCProtocolDecl(DC, L, Id); 4080518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl} 4093068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 410529569e68d10b0fd3750fd2124faf742249b846bAnders Carlssonvoid ObjCProtocolDecl::Destroy(ASTContext &C) { 4113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ReferencedProtocols.Destroy(C); 4123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ObjCContainerDecl::Destroy(C); 4133068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 4143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 4153068d117951a8df54bae9db039b56201ab10962bAnders CarlssonObjCProtocolDecl *ObjCProtocolDecl::lookupProtocolNamed(IdentifierInfo *Name) { 4163068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ObjCProtocolDecl *PDecl = this; 4173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 4183068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (Name == getIdentifier()) 4193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return PDecl; 4203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 4213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) 422fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if ((PDecl = (*I)->lookupProtocolNamed(Name))) 42382206e267ce6cc709797127616f64672d255b310Anders Carlsson return PDecl; 424f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 425f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return NULL; 426f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 42787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 42887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner// lookupInstanceMethod - Lookup a instance method in the protocol and protocols 429f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// it inherited. 430f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { 4314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner ObjCMethodDecl *MethodDecl = NULL; 4324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 4334c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if ((MethodDecl = getInstanceMethod(Sel))) 4344c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return MethodDecl; 435e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman 436e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) 437e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) 4384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return MethodDecl; 4394c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return NULL; 4404c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 4414c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 4420e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson// lookupInstanceMethod - Lookup a class method in the protocol and protocols 4434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner// it inherited. 4444c4867e140327fa3b56306fa03c64c8e6a7c95efChris LattnerObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { 445a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ObjCMethodDecl *MethodDecl = NULL; 446a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 447a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if ((MethodDecl = getClassMethod(Sel))) 448a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return MethodDecl; 449a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 450a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) 451a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if ((MethodDecl = (*I)->lookupClassMethod(Sel))) 452a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return MethodDecl; 453a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return NULL; 454a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 455a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 456a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner//===----------------------------------------------------------------------===// 457a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner// ObjCClassDecl 458a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner//===----------------------------------------------------------------------===// 459a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 460a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris LattnerObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L, 461a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ObjCInterfaceDecl *const *Elts, unsigned nElts, 462a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ASTContext &C) 463a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner : Decl(ObjCClass, DC, L) { 464a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ForwardDecls.set(Elts, nElts, C); 465a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 466a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 467a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 468a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris LattnerObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC, 469a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner SourceLocation L, 470a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ObjCInterfaceDecl *const *Elts, 471a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner unsigned nElts) { 472a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return new (C) ObjCClassDecl(DC, L, Elts, nElts, C); 473a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 474a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 475a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnervoid ObjCClassDecl::Destroy(ASTContext &C) { 476a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 477a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // FIXME: There is no clear ownership policy now for referenced 478a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ObjCInterfaceDecls. Some of them can be forward declarations that 479a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // are never later defined (in which case the ObjCClassDecl owns them) 480a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // or the ObjCInterfaceDecl later becomes a real definition later. Ideally 481a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // we should have separate objects for forward declarations and definitions, 482a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // obviating this problem. Because of this situation, referenced 483a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ObjCInterfaceDecls are destroyed in ~TranslationUnit. 484a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 485a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ForwardDecls.Destroy(C); 486a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Decl::Destroy(C); 487a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 488a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 489a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner//===----------------------------------------------------------------------===// 490a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner// ObjCForwardProtocolDecl 491a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner//===----------------------------------------------------------------------===// 492a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 493a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris LattnerObjCForwardProtocolDecl:: 494a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris LattnerObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, 495a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ObjCProtocolDecl *const *Elts, unsigned nElts, 496a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ASTContext &C) 497a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner: Decl(ObjCForwardProtocol, DC, L) { 498a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner ReferencedProtocols.set(Elts, nElts, C); 499a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 5004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 5014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 5024c4867e140327fa3b56306fa03c64c8e6a7c95efChris LattnerObjCForwardProtocolDecl * 503019f4e858e78587f2241ff1a76c747d7bcd7578cChris LattnerObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, 504019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner SourceLocation L, 5050e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson ObjCProtocolDecl *const *Elts, 506019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner unsigned NumElts) { 507a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts, C); 508a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 509019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 510019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnervoid ObjCForwardProtocolDecl::Destroy(ASTContext &C) { 5114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson ReferencedProtocols.Destroy(C); 512019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner Decl::Destroy(C); 513019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 5144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson 515019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner//===----------------------------------------------------------------------===// 516019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner// ObjCCategoryDecl 5174c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner//===----------------------------------------------------------------------===// 518f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 519b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC, 520a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman SourceLocation L, 521027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson IdentifierInfo *Id) { 522027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return new (C) ObjCCategoryDecl(DC, L, Id); 5234fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson} 5244fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 5254fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson//===----------------------------------------------------------------------===// 5264fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson// ObjCCategoryImplDecl 5274fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson//===----------------------------------------------------------------------===// 5284fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 5294fdfb0965b396f2778091f7e6c051d17ff9791baAnders CarlssonObjCCategoryImplDecl * 5300e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders CarlssonObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, 5314fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson SourceLocation L,IdentifierInfo *Id, 532c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner ObjCInterfaceDecl *ClassInterface) { 533027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return new (C) ObjCCategoryImplDecl(DC, L, Id, ClassInterface); 534a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman} 535a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 536a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 537a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of 538a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman/// properties implemented in this category @implementation block and returns 539fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson/// the implemented property that uses it. 54051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson/// 541fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders CarlssonObjCPropertyImplDecl *ObjCImplDecl:: 54251fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonFindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { 54351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 544fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson ObjCPropertyImplDecl *PID = *i; 545fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (PID->getPropertyIvarDecl() && 5464bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson PID->getPropertyIvarDecl()->getIdentifier() == ivarId) 5474bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return PID; 548fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson } 5494bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return 0; 550f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson} 551fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 552f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl 553f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson/// added to the list of those properties @synthesized/@dynamic in this 554fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson/// category @implementation block. 555fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson/// 556fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders CarlssonObjCPropertyImplDecl *ObjCImplDecl:: 557fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders CarlssonFindPropertyImplDecl(IdentifierInfo *Id) const { 558fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ 5594bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson ObjCPropertyImplDecl *PID = *i; 560a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (PID->getPropertyDecl()->getIdentifier() == Id) 561a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return PID; 562fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson } 5634bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return 0; 5644bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson} 5654bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson 566fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson// getInstanceMethod - This method returns an instance method by looking in 5674bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson// the class implementation. Unlike interfaces, we don't look outside the 568fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson// implementation. 5694bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders CarlssonObjCMethodDecl *ObjCImplDecl::getInstanceMethod(Selector Sel) const { 5704bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) 5714bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if ((*I)->getSelector() == Sel) 572fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson return *I; 5734bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return NULL; 5744bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson} 575fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 576fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson// getClassMethod - This method returns an instance method by looking in 5774bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson// the class implementation. Unlike interfaces, we don't look outside the 5784bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson// implementation. 579fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders CarlssonObjCMethodDecl *ObjCImplDecl::getClassMethod(Selector Sel) const { 580fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 581fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson I != E; ++I) 582fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if ((*I)->getSelector() == Sel) 583fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson return *I; 584fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson return NULL; 5854bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson} 5864bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson 5874bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson//===----------------------------------------------------------------------===// 588a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman// ObjCImplementationDecl 589a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman//===----------------------------------------------------------------------===// 590a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 591c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris LattnerObjCImplementationDecl * 59254176fdb044312b4b77c3da6682d3575b3728d30Chris LattnerObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, 593286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson SourceLocation L, 594286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson ObjCInterfaceDecl *ClassInterface, 595286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson ObjCInterfaceDecl *SuperDecl) { 596286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl); 597286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson} 598286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 599286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson/// Destroy - Call destructors and release memory. 600286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlssonvoid ObjCImplementationDecl::Destroy(ASTContext &C) { 601286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson IVars.Destroy(C); 602286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Decl::Destroy(C); 603286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson} 604286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 605286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson//===----------------------------------------------------------------------===// 606286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson// ObjCCompatibleAliasDecl 607529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson//===----------------------------------------------------------------------===// 608529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 609529569e68d10b0fd3750fd2124faf742249b846bAnders CarlssonObjCCompatibleAliasDecl * 610286f85e791dda3634fee7f6c67f0ed92296c028fAnders CarlssonObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, 611286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson SourceLocation L, 612286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson IdentifierInfo *Id, 613286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson ObjCInterfaceDecl* AliasedClass) { 614286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass); 615286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson} 616286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 617286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson//===----------------------------------------------------------------------===// 618286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson// ObjCPropertyDecl 619286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson//===----------------------------------------------------------------------===// 620286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 621286f85e791dda3634fee7f6c67f0ed92296c028fAnders CarlssonObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC, 622286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson SourceLocation L, 623286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson IdentifierInfo *Id, 624286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType T, 625286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson PropertyControl propControl) { 626286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return new (C) ObjCPropertyDecl(DC, L, Id, T); 627286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson} 628286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 629286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 630286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson//===----------------------------------------------------------------------===// 631286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson// ObjCPropertyImplDecl 632286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson//===----------------------------------------------------------------------===// 633286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 634286f85e791dda3634fee7f6c67f0ed92296c028fAnders CarlssonObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C, 635286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson DeclContext *DC, 636286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson SourceLocation atLoc, 6373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson SourceLocation L, 638529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson ObjCPropertyDecl *property, 6393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Kind PK, 6403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson ObjCIvarDecl *ivar) { 6413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return new (C) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar); 6423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 6433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson