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