]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/AST/DeclObjC.cpp
Import Clang r74788.
[FreeBSD/FreeBSD.git] / lib / AST / DeclObjC.cpp
1 //===--- DeclObjC.cpp - ObjC Declaration AST Node Implementation ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Objective-C related Decl classes.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/AST/DeclObjC.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/Stmt.h"
17 #include "llvm/ADT/STLExtras.h"
18 using namespace clang;
19
20 //===----------------------------------------------------------------------===//
21 // ObjCListBase
22 //===----------------------------------------------------------------------===//
23
24 void ObjCListBase::Destroy(ASTContext &Ctx) {
25   Ctx.Deallocate(List);
26   NumElts = 0;
27   List = 0;
28 }
29
30 void ObjCListBase::set(void *const* InList, unsigned Elts, ASTContext &Ctx) {
31   assert(List == 0 && "Elements already set!");
32   if (Elts == 0) return;  // Setting to an empty list is a noop.
33   
34   
35   List = new (Ctx) void*[Elts];
36   NumElts = Elts;
37   memcpy(List, InList, sizeof(void*)*Elts);
38 }
39
40
41 //===----------------------------------------------------------------------===//
42 // ObjCInterfaceDecl
43 //===----------------------------------------------------------------------===//
44
45 /// getIvarDecl - This method looks up an ivar in this ContextDecl.
46 ///
47 ObjCIvarDecl *
48 ObjCContainerDecl::getIvarDecl(IdentifierInfo *Id) const {
49   lookup_const_iterator Ivar, IvarEnd;
50   for (llvm::tie(Ivar, IvarEnd) = lookup(Id); Ivar != IvarEnd; ++Ivar) {
51     if (ObjCIvarDecl *ivar = dyn_cast<ObjCIvarDecl>(*Ivar))
52       return ivar;
53   }
54   return 0;
55 }
56
57 // Get the local instance method declared in this interface.
58 ObjCMethodDecl *
59 ObjCContainerDecl::getInstanceMethod(Selector Sel) const {
60   // Since instance & class methods can have the same name, the loop below
61   // ensures we get the correct method.
62   //
63   // @interface Whatever
64   // - (int) class_method;
65   // + (float) class_method;
66   // @end
67   //
68   lookup_const_iterator Meth, MethEnd;
69   for (llvm::tie(Meth, MethEnd) = lookup(Sel); Meth != MethEnd; ++Meth) {
70     ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth);
71     if (MD && MD->isInstanceMethod())
72       return MD;
73   }
74   return 0;
75 }
76
77 // Get the local class method declared in this interface.
78 ObjCMethodDecl *
79 ObjCContainerDecl::getClassMethod(Selector Sel) const {
80   // Since instance & class methods can have the same name, the loop below
81   // ensures we get the correct method.
82   //
83   // @interface Whatever
84   // - (int) class_method;
85   // + (float) class_method;
86   // @end
87   //
88   lookup_const_iterator Meth, MethEnd;
89   for (llvm::tie(Meth, MethEnd) = lookup(Sel); Meth != MethEnd; ++Meth) {
90     ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth);
91     if (MD && MD->isClassMethod())
92       return MD;
93   }
94   return 0;
95 }
96
97 /// FindPropertyDeclaration - Finds declaration of the property given its name
98 /// in 'PropertyId' and returns it. It returns 0, if not found.
99 /// FIXME: Convert to DeclContext lookup...
100 ///
101 ObjCPropertyDecl *
102 ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
103   for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I)
104     if ((*I)->getIdentifier() == PropertyId)
105       return *I;
106   
107   const ObjCProtocolDecl *PID = dyn_cast<ObjCProtocolDecl>(this);
108   if (PID) {
109     for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 
110          E = PID->protocol_end(); I != E; ++I)
111       if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
112         return P;
113   }
114   
115   if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this)) {
116     // Look through categories.
117     for (ObjCCategoryDecl *Category = OID->getCategoryList();
118          Category; Category = Category->getNextClassCategory()) {
119       if (ObjCPropertyDecl *P = Category->FindPropertyDeclaration(PropertyId))
120         return P;
121     }
122     // Look through protocols.
123     for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(),
124          E = OID->protocol_end(); I != E; ++I) {
125       if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
126         return P;
127     }
128     if (OID->getSuperClass())
129       return OID->getSuperClass()->FindPropertyDeclaration(PropertyId);
130   } else if (const ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(this)) {
131     // Look through protocols.
132     for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(),
133          E = OCD->protocol_end(); I != E; ++I) {
134       if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
135         return P;
136     }
137   }
138   return 0;
139 }
140
141 ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable(IdentifierInfo *ID,
142                                               ObjCInterfaceDecl *&clsDeclared) {
143   ObjCInterfaceDecl* ClassDecl = this;
144   while (ClassDecl != NULL) {
145     if (ObjCIvarDecl *I = ClassDecl->getIvarDecl(ID)) {
146       clsDeclared = ClassDecl;
147       return I;
148     }
149     ClassDecl = ClassDecl->getSuperClass();
150   }
151   return NULL;
152 }
153
154 /// lookupInheritedClass - This method returns ObjCInterfaceDecl * of the super
155 /// class whose name is passed as argument. If it is not one of the super classes
156 /// the it returns NULL.
157 ObjCInterfaceDecl *ObjCInterfaceDecl::lookupInheritedClass(
158                                         const IdentifierInfo*ICName) {
159   ObjCInterfaceDecl* ClassDecl = this;
160   while (ClassDecl != NULL) {
161     if (ClassDecl->getIdentifier() == ICName)
162       return ClassDecl;
163     ClassDecl = ClassDecl->getSuperClass();
164   }
165   return NULL;
166 }
167
168 /// lookupInstanceMethod - This method returns an instance method by looking in
169 /// the class, its categories, and its super classes (using a linear search).
170 ObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) {
171   ObjCInterfaceDecl* ClassDecl = this;
172   ObjCMethodDecl *MethodDecl = 0;
173   
174   while (ClassDecl != NULL) {
175     if ((MethodDecl = ClassDecl->getInstanceMethod(Sel)))
176       return MethodDecl;
177       
178     // Didn't find one yet - look through protocols.
179     const ObjCList<ObjCProtocolDecl> &Protocols =
180       ClassDecl->getReferencedProtocols();
181     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
182          E = Protocols.end(); I != E; ++I)
183       if ((MethodDecl = (*I)->lookupInstanceMethod(Sel)))
184         return MethodDecl;
185     
186     // Didn't find one yet - now look through categories.
187     ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList();
188     while (CatDecl) {
189       if ((MethodDecl = CatDecl->getInstanceMethod(Sel)))
190         return MethodDecl;
191         
192       // Didn't find one yet - look through protocols.
193       const ObjCList<ObjCProtocolDecl> &Protocols =
194         CatDecl->getReferencedProtocols();
195       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
196            E = Protocols.end(); I != E; ++I)
197         if ((MethodDecl = (*I)->lookupInstanceMethod(Sel)))
198           return MethodDecl;
199       CatDecl = CatDecl->getNextClassCategory();
200     }
201     ClassDecl = ClassDecl->getSuperClass();
202   }
203   return NULL;
204 }
205
206 // lookupClassMethod - This method returns a class method by looking in the
207 // class, its categories, and its super classes (using a linear search).
208 ObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) {
209   ObjCInterfaceDecl* ClassDecl = this;
210   ObjCMethodDecl *MethodDecl = 0;
211
212   while (ClassDecl != NULL) {
213     if ((MethodDecl = ClassDecl->getClassMethod(Sel)))
214       return MethodDecl;
215
216     // Didn't find one yet - look through protocols.
217     for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(),
218          E = ClassDecl->protocol_end(); I != E; ++I)
219       if ((MethodDecl = (*I)->lookupClassMethod(Sel)))
220         return MethodDecl;
221     
222     // Didn't find one yet - now look through categories.
223     ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList();
224     while (CatDecl) {
225       if ((MethodDecl = CatDecl->getClassMethod(Sel)))
226         return MethodDecl;
227         
228       // Didn't find one yet - look through protocols.
229       const ObjCList<ObjCProtocolDecl> &Protocols =
230         CatDecl->getReferencedProtocols();
231       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
232            E = Protocols.end(); I != E; ++I)
233         if ((MethodDecl = (*I)->lookupClassMethod(Sel)))
234           return MethodDecl;
235       CatDecl = CatDecl->getNextClassCategory();
236     }
237     ClassDecl = ClassDecl->getSuperClass();
238   }
239   return NULL;
240 }
241
242
243
244 //===----------------------------------------------------------------------===//
245 // ObjCMethodDecl
246 //===----------------------------------------------------------------------===//
247
248 ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C,
249                                        SourceLocation beginLoc, 
250                                        SourceLocation endLoc,
251                                        Selector SelInfo, QualType T,
252                                        DeclContext *contextDecl,
253                                        bool isInstance,
254                                        bool isVariadic,
255                                        bool isSynthesized,
256                                        ImplementationControl impControl) {
257   return new (C) ObjCMethodDecl(beginLoc, endLoc,
258                                   SelInfo, T, contextDecl,
259                                   isInstance, 
260                                   isVariadic, isSynthesized, impControl);
261 }
262
263 void ObjCMethodDecl::Destroy(ASTContext &C) {
264   if (Body) Body->Destroy(C);
265   if (SelfDecl) SelfDecl->Destroy(C);
266   
267   for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
268     if (*I) (*I)->Destroy(C);
269
270   ParamInfo.Destroy(C);
271
272   Decl::Destroy(C);
273 }
274
275 void ObjCMethodDecl::createImplicitParams(ASTContext &Context, 
276                                           const ObjCInterfaceDecl *OID) {
277   QualType selfTy;
278   if (isInstanceMethod()) {
279     // There may be no interface context due to error in declaration
280     // of the interface (which has been reported). Recover gracefully.
281     if (OID) {
282       selfTy = Context.getObjCInterfaceType(OID);
283       selfTy = Context.getPointerType(selfTy);
284     } else {
285       selfTy = Context.getObjCIdType();
286     }
287   } else // we have a factory method.
288     selfTy = Context.getObjCClassType();
289
290   setSelfDecl(ImplicitParamDecl::Create(Context, this, SourceLocation(), 
291                                         &Context.Idents.get("self"), selfTy));
292
293   setCmdDecl(ImplicitParamDecl::Create(Context, this, SourceLocation(), 
294                                        &Context.Idents.get("_cmd"), 
295                                        Context.getObjCSelType()));
296 }
297
298
299
300 /// getSynthesizedMethodSize - Compute size of synthesized method name
301 /// as done be the rewrite.
302 ///
303 unsigned ObjCMethodDecl::getSynthesizedMethodSize() const {
304   // syntesized method name is a concatenation of -/+[class-name selector]
305   // Get length of this name.
306   unsigned length = 3;  // _I_ or _C_
307   length += getClassInterface()->getNameAsString().size()+1; // extra for _
308   if (const ObjCCategoryImplDecl *CID = 
309       dyn_cast<ObjCCategoryImplDecl>(getDeclContext()))
310     length += CID->getNameAsString().size()+1;
311   length += getSelector().getAsString().size(); // selector name
312   return length; 
313 }
314
315 ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() {
316   if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(getDeclContext()))
317     return ID;
318   if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(getDeclContext()))
319     return CD->getClassInterface();
320   if (ObjCImplementationDecl *IMD = 
321       dyn_cast<ObjCImplementationDecl>(getDeclContext()))
322     return IMD->getClassInterface();
323   if (ObjCCategoryImplDecl *CID = 
324       dyn_cast<ObjCCategoryImplDecl>(getDeclContext()))
325     return CID->getClassInterface();
326   assert(false && "unknown method context");
327   return 0;
328 }
329
330 //===----------------------------------------------------------------------===//
331 // ObjCInterfaceDecl
332 //===----------------------------------------------------------------------===//
333
334 ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
335                                              DeclContext *DC,
336                                              SourceLocation atLoc,
337                                              IdentifierInfo *Id, 
338                                              SourceLocation ClassLoc,
339                                              bool ForwardDecl, bool isInternal){
340   return new (C) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl,
341                                      isInternal);
342 }
343
344 ObjCInterfaceDecl::
345 ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id,
346                   SourceLocation CLoc, bool FD, bool isInternal)
347   : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id),
348     TypeForDecl(0), SuperClass(0),
349     CategoryList(0), ForwardDecl(FD), InternalInterface(isInternal),
350     ClassLoc(CLoc) {
351 }
352
353 void ObjCInterfaceDecl::Destroy(ASTContext &C) {  
354   for (ivar_iterator I = ivar_begin(), E = ivar_end(); I != E; ++I)
355     if (*I) (*I)->Destroy(C);
356   
357   IVars.Destroy(C);
358   // FIXME: CategoryList?
359   
360   // FIXME: Because there is no clear ownership
361   //  role between ObjCInterfaceDecls and the ObjCPropertyDecls that they
362   //  reference, we destroy ObjCPropertyDecls in ~TranslationUnit.
363   Decl::Destroy(C);
364 }
365
366
367 /// FindCategoryDeclaration - Finds category declaration in the list of
368 /// categories for this class and returns it. Name of the category is passed
369 /// in 'CategoryId'. If category not found, return 0;
370 ///
371 ObjCCategoryDecl *
372 ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const {
373   for (ObjCCategoryDecl *Category = getCategoryList();
374        Category; Category = Category->getNextClassCategory())
375     if (Category->getIdentifier() == CategoryId)
376       return Category;
377   return 0;
378 }
379
380 //===----------------------------------------------------------------------===//
381 // ObjCIvarDecl
382 //===----------------------------------------------------------------------===//
383
384 ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC,
385                                    SourceLocation L, IdentifierInfo *Id,
386                                    QualType T, AccessControl ac, Expr *BW) {
387   return new (C) ObjCIvarDecl(DC, L, Id, T, ac, BW);
388 }
389
390
391
392 //===----------------------------------------------------------------------===//
393 // ObjCAtDefsFieldDecl
394 //===----------------------------------------------------------------------===//
395
396 ObjCAtDefsFieldDecl
397 *ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
398                              IdentifierInfo *Id, QualType T, Expr *BW) {
399   return new (C) ObjCAtDefsFieldDecl(DC, L, Id, T, BW);
400 }
401
402 void ObjCAtDefsFieldDecl::Destroy(ASTContext& C) {
403   this->~ObjCAtDefsFieldDecl();
404   C.Deallocate((void *)this); 
405 }
406
407 //===----------------------------------------------------------------------===//
408 // ObjCProtocolDecl
409 //===----------------------------------------------------------------------===//
410
411 ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
412                                            SourceLocation L, 
413                                            IdentifierInfo *Id) {
414   return new (C) ObjCProtocolDecl(DC, L, Id);
415 }
416
417 void ObjCProtocolDecl::Destroy(ASTContext &C) {
418   ReferencedProtocols.Destroy(C);
419   ObjCContainerDecl::Destroy(C);
420 }
421
422 ObjCProtocolDecl *ObjCProtocolDecl::lookupProtocolNamed(IdentifierInfo *Name) {
423   ObjCProtocolDecl *PDecl = this;
424
425   if (Name == getIdentifier())
426     return PDecl;
427
428   for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
429     if ((PDecl = (*I)->lookupProtocolNamed(Name)))
430       return PDecl;
431       
432   return NULL;
433 }
434
435 // lookupInstanceMethod - Lookup a instance method in the protocol and protocols
436 // it inherited.
437 ObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) {
438   ObjCMethodDecl *MethodDecl = NULL;
439   
440   if ((MethodDecl = getInstanceMethod(Sel)))
441     return MethodDecl;
442   
443   for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
444     if ((MethodDecl = (*I)->lookupInstanceMethod(Sel)))
445       return MethodDecl;
446   return NULL;
447 }
448
449 // lookupInstanceMethod - Lookup a class method in the protocol and protocols
450 // it inherited.
451 ObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) {
452   ObjCMethodDecl *MethodDecl = NULL;
453   
454   if ((MethodDecl = getClassMethod(Sel)))
455     return MethodDecl;
456   
457   for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
458     if ((MethodDecl = (*I)->lookupClassMethod(Sel)))
459       return MethodDecl;
460   return NULL;
461 }
462
463 //===----------------------------------------------------------------------===//
464 // ObjCClassDecl
465 //===----------------------------------------------------------------------===//
466
467 ObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L, 
468                              ObjCInterfaceDecl *const *Elts, unsigned nElts,
469                              ASTContext &C)
470   : Decl(ObjCClass, DC, L) {
471   ForwardDecls.set(Elts, nElts, C);
472 }
473
474
475 ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
476                                      SourceLocation L,
477                                      ObjCInterfaceDecl *const *Elts,
478                                      unsigned nElts) {
479   return new (C) ObjCClassDecl(DC, L, Elts, nElts, C);
480 }
481
482 void ObjCClassDecl::Destroy(ASTContext &C) {
483   
484   // FIXME: There is no clear ownership policy now for referenced
485   //  ObjCInterfaceDecls.  Some of them can be forward declarations that
486   //  are never later defined (in which case the ObjCClassDecl owns them)
487   //  or the ObjCInterfaceDecl later becomes a real definition later.  Ideally
488   //  we should have separate objects for forward declarations and definitions,
489   //  obviating this problem.  Because of this situation, referenced
490   //  ObjCInterfaceDecls are destroyed in ~TranslationUnit.
491   
492   ForwardDecls.Destroy(C);
493   Decl::Destroy(C);
494 }
495
496 //===----------------------------------------------------------------------===//
497 // ObjCForwardProtocolDecl
498 //===----------------------------------------------------------------------===//
499
500 ObjCForwardProtocolDecl::
501 ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
502                         ObjCProtocolDecl *const *Elts, unsigned nElts,
503                         ASTContext &C)
504 : Decl(ObjCForwardProtocol, DC, L) { 
505   ReferencedProtocols.set(Elts, nElts, C);
506 }
507
508
509 ObjCForwardProtocolDecl *
510 ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC,
511                                 SourceLocation L, 
512                                 ObjCProtocolDecl *const *Elts,
513                                 unsigned NumElts) {
514   return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts, C);
515 }
516
517 void ObjCForwardProtocolDecl::Destroy(ASTContext &C) {
518   ReferencedProtocols.Destroy(C);
519   Decl::Destroy(C);
520 }
521
522 //===----------------------------------------------------------------------===//
523 // ObjCCategoryDecl
524 //===----------------------------------------------------------------------===//
525
526 ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,
527                                            SourceLocation L,
528                                            IdentifierInfo *Id) {
529   return new (C) ObjCCategoryDecl(DC, L, Id);
530 }
531
532 //===----------------------------------------------------------------------===//
533 // ObjCCategoryImplDecl
534 //===----------------------------------------------------------------------===//
535
536 ObjCCategoryImplDecl *
537 ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC,
538                              SourceLocation L,IdentifierInfo *Id,
539                              ObjCInterfaceDecl *ClassInterface) {
540   return new (C) ObjCCategoryImplDecl(DC, L, Id, ClassInterface);
541 }
542
543
544 void ObjCImplDecl::addPropertyImplementation(ObjCPropertyImplDecl *property) {
545   // FIXME: The context should be correct before we get here.
546   property->setLexicalDeclContext(this);
547   addDecl(property);
548 }
549
550 /// FindPropertyImplIvarDecl - This method lookup the ivar in the list of
551 /// properties implemented in this category @implementation block and returns
552 /// the implemented property that uses it.
553 ///
554 ObjCPropertyImplDecl *ObjCImplDecl::
555 FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const {
556   for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
557     ObjCPropertyImplDecl *PID = *i;
558     if (PID->getPropertyIvarDecl() &&
559         PID->getPropertyIvarDecl()->getIdentifier() == ivarId)
560       return PID;
561   }
562   return 0;
563 }
564
565 /// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl
566 /// added to the list of those properties @synthesized/@dynamic in this
567 /// category @implementation block.
568 ///
569 ObjCPropertyImplDecl *ObjCImplDecl::
570 FindPropertyImplDecl(IdentifierInfo *Id) const {
571   for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
572     ObjCPropertyImplDecl *PID = *i;
573     if (PID->getPropertyDecl()->getIdentifier() == Id)
574       return PID;
575   }
576   return 0;
577 }
578
579 // getInstanceMethod - This method returns an instance method by looking in
580 // the class implementation. Unlike interfaces, we don't look outside the
581 // implementation.
582 ObjCMethodDecl *ObjCImplDecl::getInstanceMethod(Selector Sel) const {
583   // Since instance & class methods can have the same name, the loop below
584   // ensures we get the correct method.
585   //
586   // @interface Whatever
587   // - (int) class_method;
588   // + (float) class_method;
589   // @end
590   //
591   lookup_const_iterator Meth, MethEnd;
592   for (llvm::tie(Meth, MethEnd) = lookup(Sel);
593        Meth != MethEnd; ++Meth) {
594     ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth);
595     if (MD && MD->isInstanceMethod())
596       return MD;
597   }
598   return 0;
599 }
600
601 // getClassMethod - This method returns an instance method by looking in
602 // the class implementation. Unlike interfaces, we don't look outside the
603 // implementation.
604 ObjCMethodDecl *ObjCImplDecl::getClassMethod(Selector Sel) const {
605   // Since instance & class methods can have the same name, the loop below
606   // ensures we get the correct method.
607   //
608   // @interface Whatever
609   // - (int) class_method;
610   // + (float) class_method;
611   // @end
612   //
613   lookup_const_iterator Meth, MethEnd;
614   for (llvm::tie(Meth, MethEnd) = lookup(Sel);
615        Meth != MethEnd; ++Meth) {
616     ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth);
617     if (MD && MD->isClassMethod())
618       return MD;
619   }
620   return 0;
621 }
622
623 //===----------------------------------------------------------------------===//
624 // ObjCImplementationDecl
625 //===----------------------------------------------------------------------===//
626
627 ObjCImplementationDecl *
628 ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, 
629                                SourceLocation L,
630                                ObjCInterfaceDecl *ClassInterface,
631                                ObjCInterfaceDecl *SuperDecl) {
632   return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl);
633 }
634
635 //===----------------------------------------------------------------------===//
636 // ObjCCompatibleAliasDecl
637 //===----------------------------------------------------------------------===//
638
639 ObjCCompatibleAliasDecl *
640 ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
641                                 SourceLocation L,
642                                 IdentifierInfo *Id, 
643                                 ObjCInterfaceDecl* AliasedClass) {
644   return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass);
645 }
646
647 //===----------------------------------------------------------------------===//
648 // ObjCPropertyDecl
649 //===----------------------------------------------------------------------===//
650
651 ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC,
652                                            SourceLocation L,
653                                            IdentifierInfo *Id,
654                                            QualType T,
655                                            PropertyControl propControl) {
656   return new (C) ObjCPropertyDecl(DC, L, Id, T);
657 }
658
659
660 //===----------------------------------------------------------------------===//
661 // ObjCPropertyImplDecl
662 //===----------------------------------------------------------------------===//
663
664 ObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C,
665                                                    DeclContext *DC,
666                                                    SourceLocation atLoc,
667                                                    SourceLocation L,
668                                                    ObjCPropertyDecl *property,
669                                                    Kind PK,
670                                                    ObjCIvarDecl *ivar) {
671   return new (C) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar);
672 }
673
674