From 3c6e5ce3776eaddaf4bcdf5da6c00ec4e6829d83 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 28 Aug 2013 21:23:00 +0000 Subject: [PATCH] ObjectiveC migrator: In suggesting 'instancetype' use clang's hasRelatedResultType() as it knows of methods which have related result type by default. Such methods do not need a redundant 'instancetype'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189520 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ARCMigrate/ObjCMT.cpp | 13 +++++++++-- test/ARCMT/objcmt-arc-cf-annotations.m.result | 16 +++++++------- test/ARCMT/objcmt-instancetype-2.m.result | 2 +- test/ARCMT/objcmt-instancetype.m.result | 22 +++++++++---------- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index 6f230577df..9b9d6aa10d 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -660,6 +660,11 @@ static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC, void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl, ObjCMethodDecl *OM) { + // bail out early and do not suggest 'instancetype' when the method already + // has a related result type, + if (OM->hasRelatedResultType()) + return; + ObjCInstanceTypeFamily OIT_Family = Selector::getInstTypeMethodFamily(OM->getSelector()); @@ -668,11 +673,15 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, case OIT_None: migrateFactoryMethod(Ctx, CDecl, OM); return; + case OIT_Array: + ClassName = "NSArray"; + break; + case OIT_Dictionary: + ClassName = "NSDictionary"; + break; // For methods where Clang automatically infers instancetype from the selector // (e.g., all -init* methods), we should not suggest "instancetype" because it // is redundant, - case OIT_Array: - case OIT_Dictionary: case OIT_MemManage: return; case OIT_Singleton: diff --git a/test/ARCMT/objcmt-arc-cf-annotations.m.result b/test/ARCMT/objcmt-arc-cf-annotations.m.result index 2c013301f5..a0fab2c24e 100644 --- a/test/ARCMT/objcmt-arc-cf-annotations.m.result +++ b/test/ARCMT/objcmt-arc-cf-annotations.m.result @@ -181,12 +181,12 @@ NSFastEnumerationState; @interface NSArray : NSObject - (NSUInteger)count; - (id)initWithObjects:(const id [])objects count:(NSUInteger)cnt; -+ (id)arrayWithObject:(id)anObject; -+ (id)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt; -+ (id)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1))); ++ (instancetype)arrayWithObject:(id)anObject; ++ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt; ++ (instancetype)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1))); - (id)initWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1))); - (id)initWithArray:(NSArray *)array; -@end @interface NSArray (NSArrayCreation) + (id)array; +@end @interface NSArray (NSArrayCreation) + (instancetype)array; @end @interface NSAutoreleasePool : NSObject { } - (void)drain; @@ -207,12 +207,12 @@ typedef double NSTimeInterval; @end @class NSLocale, NSDate, NSCalendar, NSTimeZone, NSError, NSArray, NSMutableDictionary; @interface NSDictionary : NSObject - (NSUInteger)count; -+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; -+ (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(NSUInteger)cnt; ++ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; ++ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(NSUInteger)cnt; @end @interface NSMutableDictionary : NSDictionary - (void)removeObjectForKey:(id)aKey; - (void)setObject:(id)anObject forKey:(id)aKey; -@end @interface NSMutableDictionary (NSMutableDictionaryCreation) + (id)dictionaryWithCapacity:(NSUInteger)numItems; +@end @interface NSMutableDictionary (NSMutableDictionaryCreation) + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems; @end typedef double CGFloat; struct CGSize { }; @@ -350,7 +350,7 @@ CF_IMPLICIT_BRIDGING_DISABLED @interface NSMutableArray : NSObject - (void)addObject:(id)object; -+ (id)array; ++ (instancetype)array; @end // This is how NSMakeCollectable is declared in the OS X 10.8 headers. diff --git a/test/ARCMT/objcmt-instancetype-2.m.result b/test/ARCMT/objcmt-instancetype-2.m.result index 434f026f55..b6bd05adeb 100644 --- a/test/ARCMT/objcmt-instancetype-2.m.result +++ b/test/ARCMT/objcmt-instancetype-2.m.result @@ -51,7 +51,7 @@ typedef enum NSURLBookmarkResolutionOptions { @interface NSMutableDictionary @end @interface NSMutableDictionary (NSSharedKeySetDictionary) -+ (id )dictionaryWithSharedKeySet:(id)keyset __attribute__((availability(macosx,introduced=10.8))); ++ (instancetype )dictionaryWithSharedKeySet:(id)keyset __attribute__((availability(macosx,introduced=10.8))); @end @interface NSProtocolChecker diff --git a/test/ARCMT/objcmt-instancetype.m.result b/test/ARCMT/objcmt-instancetype.m.result index b8c3fb6ec7..6303232ba6 100644 --- a/test/ARCMT/objcmt-instancetype.m.result +++ b/test/ARCMT/objcmt-instancetype.m.result @@ -21,11 +21,11 @@ typedef signed char BOOL; @end @interface NSArray (NSArrayCreation) -+ (id)array; -+ (id)arrayWithObject:(id)anObject; -+ (id)arrayWithObjects:(const id [])objects count:(unsigned long)cnt; -+ (id)arrayWithObjects:(id)firstObj, ...; -+ arrayWithArray:(NSArray *)array; ++ (instancetype)array; ++ (instancetype)arrayWithObject:(id)anObject; ++ (instancetype)arrayWithObjects:(const id [])objects count:(unsigned long)cnt; ++ (instancetype)arrayWithObjects:(id)firstObj, ...; ++ (instancetype) arrayWithArray:(NSArray *)array; - (id)initWithObjects:(const id [])objects count:(unsigned long)cnt; - (id)initWithObjects:(id)firstObj, ...; @@ -44,12 +44,12 @@ typedef signed char BOOL; @end @interface NSDictionary (NSDictionaryCreation) -+ (id)dictionary; -+ (id)dictionaryWithObject:(id)object forKey:(id)key; -+ (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt; -+ dictionaryWithObjectsAndKeys:(id)firstObject, ...; -+ (id)dictionaryWithDictionary:(NSDictionary *)dict; -+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; ++ (instancetype)dictionary; ++ (instancetype)dictionaryWithObject:(id)object forKey:(id)key; ++ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt; ++ (instancetype) dictionaryWithObjectsAndKeys:(id)firstObject, ...; ++ (instancetype)dictionaryWithDictionary:(NSDictionary *)dict; ++ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; - (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt; - (id)initWithObjectsAndKeys:(id)firstObject, ...; -- 2.40.0