From: Fariborz Jahanian Date: Tue, 16 Jul 2013 21:59:42 +0000 (+0000) Subject: ObjectiveC migrator. If a class implements a protocol's X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d8bfb3e52567b86add4bfa931023f2e2a291499;p=clang ObjectiveC migrator. If a class implements a protocol's properties, then class conforms to that protocol. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186460 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index dd21026458..ab4aa0e085 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -250,17 +250,22 @@ ClassImplementsAllMethodsAndProperties(ASTContext &Ctx, if (Property->getPropertyImplementation() == ObjCPropertyDecl::Optional) continue; DeclContext::lookup_const_result R = IDecl->lookup(Property->getDeclName()); - if (R.size() == 0) - return false; - for (unsigned I = 0, N = R.size(); I != N; ++I) { - if (ObjCPropertyDecl *ClassProperty = dyn_cast(R[0])) { - if (ClassProperty->getPropertyAttributes() - != Property->getPropertyAttributes()) - return false; - if (!Ctx.hasSameType(ClassProperty->getType(), Property->getType())) + if (R.size() == 0) { + // Relax the rule and look into class's implementation for a synthesize + // or dynamic declaration. Class is implementing a property coming from + // another protocol. This still makes the target protocol as conforming. + if (!ImpDecl->FindPropertyImplDecl( + Property->getDeclName().getAsIdentifierInfo())) + return false; + } + else if (ObjCPropertyDecl *ClassProperty = dyn_cast(R[0])) { + if ((ClassProperty->getPropertyAttributes() + != Property->getPropertyAttributes()) || + !Ctx.hasSameType(ClassProperty->getType(), Property->getType())) return false; - } } + else + return false; } // At this point, all required properties in this protocol conform to those // declared in the class. diff --git a/test/ARCMT/objcmt-protocol-conformance.m b/test/ARCMT/objcmt-protocol-conformance.m index 2ad8a659fa..3ef2eff13f 100644 --- a/test/ARCMT/objcmt-protocol-conformance.m +++ b/test/ARCMT/objcmt-protocol-conformance.m @@ -46,3 +46,18 @@ - (id) Meth1: (double) arg { return 0; } @end +// Test5 - conforms to P3 because it implement's P3's property. +@protocol P3 +@property (copy) id Prop; +@end + +@protocol P4 +@property (copy) id Prop; +@end + +@interface Test5 : NSObject +@end + +@implementation Test5 +@synthesize Prop=_XXX; +@end diff --git a/test/ARCMT/objcmt-protocol-conformance.m.result b/test/ARCMT/objcmt-protocol-conformance.m.result index 71fa3b1b06..11bf784728 100644 --- a/test/ARCMT/objcmt-protocol-conformance.m.result +++ b/test/ARCMT/objcmt-protocol-conformance.m.result @@ -46,3 +46,18 @@ - (id) Meth1: (double) arg { return 0; } @end +// Test5 - conforms to P3 because it implement's P3's property. +@protocol P3 +@property (copy) id Prop; +@end + +@protocol P4 +@property (copy) id Prop; +@end + +@interface Test5 : NSObject +@end + +@implementation Test5 +@synthesize Prop=_XXX; +@end