diff options
Diffstat (limited to 'clang/lib/AST/DeclObjC.cpp')
-rw-r--r-- | clang/lib/AST/DeclObjC.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index 528b52fe5d5..cb58ad482e1 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -398,12 +398,39 @@ void ObjCInterfaceDecl::getDesignatedInitializers( for (instmeth_iterator I = IFace->instmeth_begin(), E = IFace->instmeth_end(); I != E; ++I) { const ObjCMethodDecl *MD = *I; - if (MD->getMethodFamily() == OMF_init && - MD->hasAttr<ObjCDesignatedInitializerAttr>()) + if (MD->isThisDeclarationADesignatedInitializer()) Methods.push_back(MD); } } +bool ObjCInterfaceDecl::isDesignatedInitializer(Selector Sel, + const ObjCMethodDecl **InitMethod) const { + assert(hasDefinition()); + if (data().ExternallyCompleted) + LoadExternalDefinition(); + + const ObjCInterfaceDecl *IFace = this; + while (IFace) { + if (IFace->data().HasDesignatedInitializers) + break; + IFace = IFace->getSuperClass(); + } + + if (!IFace) + return false; + + if (const ObjCMethodDecl *MD = IFace->lookupMethod(Sel, /*isInstance=*/true, + /*shallowCategoryLookup=*/true, + /*followSuper=*/false)) { + if (MD->isThisDeclarationADesignatedInitializer()) { + if (InitMethod) + *InitMethod = MD; + return true; + } + } + return false; +} + void ObjCInterfaceDecl::allocateDefinitionData() { assert(!hasDefinition() && "ObjC class already has a definition"); Data.setPointer(new (getASTContext()) DefinitionData()); @@ -623,6 +650,20 @@ ObjCMethodDecl *ObjCMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) { Selector(), QualType(), 0, 0); } +bool ObjCMethodDecl::isThisDeclarationADesignatedInitializer() const { + return getMethodFamily() == OMF_init && + hasAttr<ObjCDesignatedInitializerAttr>(); +} + +bool ObjCMethodDecl::isDesignatedInitializerForTheInterface() const { + const DeclContext *DC = getDeclContext(); + if (isa<ObjCProtocolDecl>(DC)) + return false; + if (const ObjCInterfaceDecl *ID = getClassInterface()) + return ID->isDesignatedInitializer(getSelector()); + return false; +} + Stmt *ObjCMethodDecl::getBody() const { return Body.get(getASTContext().getExternalSource()); } |