diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:07:40 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:07:40 +0000 | 
| commit | bfef399519ca9b8a4b4c6b563253bad7e0eeffe0 (patch) | |
| tree | df8df0b0067b381eab470a3b8f28d14a552a6340 /lib/AST/DeclObjC.cpp | |
| parent | 6a0372513edbc473b538d2f724efac50405d6fef (diff) | |
Diffstat (limited to 'lib/AST/DeclObjC.cpp')
| -rw-r--r-- | lib/AST/DeclObjC.cpp | 86 | 
1 files changed, 64 insertions, 22 deletions
| diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 4ddbb22199b2..b2b5b70197b7 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -441,6 +441,17 @@ ObjCInterfaceDecl *ObjCInterfaceDecl::lookupInheritedClass(    return NULL;  } +ObjCProtocolDecl * +ObjCInterfaceDecl::lookupNestedProtocol(IdentifierInfo *Name) { +  for (ObjCInterfaceDecl::all_protocol_iterator P = +       all_referenced_protocol_begin(), PE = all_referenced_protocol_end(); +       P != PE; ++P) +    if ((*P)->lookupProtocolNamed(Name)) +      return (*P); +  ObjCInterfaceDecl *SuperClass = getSuperClass(); +  return SuperClass ? SuperClass->lookupNestedProtocol(Name) : NULL; +} +  /// lookupMethod - This method returns an instance/class method by looking in  /// the class, its categories, and its super classes (using a linear search).  /// When argument category "C" is specified, any implicit method found @@ -627,23 +638,29 @@ ObjCMethodDecl *ObjCMethodDecl::getNextRedeclaration() {    Decl *CtxD = cast<Decl>(getDeclContext()); -  if (ObjCInterfaceDecl *IFD = dyn_cast<ObjCInterfaceDecl>(CtxD)) { -    if (ObjCImplementationDecl *ImplD = Ctx.getObjCImplementation(IFD)) -      Redecl = ImplD->getMethod(getSelector(), isInstanceMethod()); - -  } else if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(CtxD)) { -    if (ObjCCategoryImplDecl *ImplD = Ctx.getObjCImplementation(CD)) -      Redecl = ImplD->getMethod(getSelector(), isInstanceMethod()); - -  } else if (ObjCImplementationDecl *ImplD = -               dyn_cast<ObjCImplementationDecl>(CtxD)) { -    if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) -      Redecl = IFD->getMethod(getSelector(), isInstanceMethod()); - -  } else if (ObjCCategoryImplDecl *CImplD = -               dyn_cast<ObjCCategoryImplDecl>(CtxD)) { -    if (ObjCCategoryDecl *CatD = CImplD->getCategoryDecl()) -      Redecl = CatD->getMethod(getSelector(), isInstanceMethod()); +  if (!CtxD->isInvalidDecl()) { +    if (ObjCInterfaceDecl *IFD = dyn_cast<ObjCInterfaceDecl>(CtxD)) { +      if (ObjCImplementationDecl *ImplD = Ctx.getObjCImplementation(IFD)) +        if (!ImplD->isInvalidDecl()) +          Redecl = ImplD->getMethod(getSelector(), isInstanceMethod()); + +    } else if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(CtxD)) { +      if (ObjCCategoryImplDecl *ImplD = Ctx.getObjCImplementation(CD)) +        if (!ImplD->isInvalidDecl()) +          Redecl = ImplD->getMethod(getSelector(), isInstanceMethod()); + +    } else if (ObjCImplementationDecl *ImplD = +                 dyn_cast<ObjCImplementationDecl>(CtxD)) { +      if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) +        if (!IFD->isInvalidDecl()) +          Redecl = IFD->getMethod(getSelector(), isInstanceMethod()); + +    } else if (ObjCCategoryImplDecl *CImplD = +                 dyn_cast<ObjCCategoryImplDecl>(CtxD)) { +      if (ObjCCategoryDecl *CatD = CImplD->getCategoryDecl()) +        if (!CatD->isInvalidDecl()) +          Redecl = CatD->getMethod(getSelector(), isInstanceMethod()); +    }    }    if (!Redecl && isRedeclaration()) { @@ -1062,7 +1079,7 @@ ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id,    : ObjCContainerDecl(ObjCInterface, DC, Id, CLoc, atLoc),      TypeForDecl(0), Data()  { -  setPreviousDeclaration(PrevDecl); +  setPreviousDecl(PrevDecl);    // Copy the 'data' pointer over.    if (PrevDecl) @@ -1308,7 +1325,8 @@ ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC,                                     SourceLocation IdLoc, IdentifierInfo *Id,                                     QualType T, TypeSourceInfo *TInfo,                                     AccessControl ac, Expr *BW, -                                   bool synthesized) { +                                   bool synthesized, +                                   bool backingIvarReferencedInAccessor) {    if (DC) {      // Ivar's can only appear in interfaces, implementations (via synthesized      // properties), and class extensions (via direct declaration, or synthesized @@ -1336,13 +1354,13 @@ ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC,    }    return new (C) ObjCIvarDecl(DC, StartLoc, IdLoc, Id, T, TInfo, -                              ac, BW, synthesized); +                              ac, BW, synthesized, backingIvarReferencedInAccessor);  }  ObjCIvarDecl *ObjCIvarDecl::CreateDeserialized(ASTContext &C, unsigned ID) {    void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ObjCIvarDecl));    return new (Mem) ObjCIvarDecl(0, SourceLocation(), SourceLocation(), 0, -                                QualType(), 0, ObjCIvarDecl::None, 0, false); +                                QualType(), 0, ObjCIvarDecl::None, 0, false, false);  }  const ObjCInterfaceDecl *ObjCIvarDecl::getContainingInterface() const { @@ -1401,7 +1419,7 @@ ObjCProtocolDecl::ObjCProtocolDecl(DeclContext *DC, IdentifierInfo *Id,                                     ObjCProtocolDecl *PrevDecl)    : ObjCContainerDecl(ObjCProtocol, DC, Id, nameLoc, atStartLoc), Data()  { -  setPreviousDeclaration(PrevDecl); +  setPreviousDecl(PrevDecl);    if (PrevDecl)      Data = PrevDecl->Data;  } @@ -1493,6 +1511,30 @@ void ObjCProtocolDecl::collectPropertiesToImplement(PropertyMap &PM,    }  } +     +void ObjCProtocolDecl::collectInheritedProtocolProperties( +                                                const ObjCPropertyDecl *Property, +                                                ProtocolPropertyMap &PM) const { +  if (const ObjCProtocolDecl *PDecl = getDefinition()) { +    bool MatchFound = false; +    for (ObjCProtocolDecl::prop_iterator P = PDecl->prop_begin(), +         E = PDecl->prop_end(); P != E; ++P) { +      ObjCPropertyDecl *Prop = *P; +      if (Prop == Property) +        continue; +      if (Prop->getIdentifier() == Property->getIdentifier()) { +        PM[PDecl] = Prop; +        MatchFound = true; +        break; +      } +    } +    // Scan through protocol's protocols which did not have a matching property. +    if (!MatchFound) +      for (ObjCProtocolDecl::protocol_iterator PI = PDecl->protocol_begin(), +           E = PDecl->protocol_end(); PI != E; ++PI) +        (*PI)->collectInheritedProtocolProperties(Property, PM); +  } +}  //===----------------------------------------------------------------------===//  // ObjCCategoryDecl | 
