From: Fariborz Jahanian Date: Fri, 2 Aug 2013 20:54:18 +0000 (+0000) Subject: ObjectiveC migrator: Add another family of factory X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d3794e06a63578093bd71c3c2520bd01e6197a3;p=clang ObjectiveC migrator: Add another family of factory methods which can be migrated to instancetype. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187672 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 0bc13e6555..4a54728dff 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -586,7 +586,8 @@ enum ObjCInstanceTypeFamily { OIT_None, OIT_Array, OIT_Dictionary, - OIT_MemManage + OIT_MemManage, + OIT_Singleton }; /// \brief Smart pointer class that efficiently represents Objective-C method diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index bd1f57f9f8..706a4ec106 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -42,7 +42,8 @@ class ObjCMigrateASTConsumer : public ASTConsumer { void migrateMethodInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl, ObjCMethodDecl *OM); void migrateFactoryMethod(ASTContext &Ctx, ObjCContainerDecl *CDecl, - ObjCMethodDecl *OM); + ObjCMethodDecl *OM, + ObjCInstanceTypeFamily OIT_Family = OIT_None); public: std::string MigrateDir; @@ -575,12 +576,12 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, ObjCMethodDecl *OM) { ObjCInstanceTypeFamily OIT_Family = Selector::getInstTypeMethodFamily(OM->getSelector()); - if (OIT_Family == OIT_None) { - migrateFactoryMethod(Ctx, CDecl, OM); - return; - } + std::string ClassName; switch (OIT_Family) { + case OIT_None: + migrateFactoryMethod(Ctx, CDecl, OM); + return; case OIT_Array: ClassName = "NSArray"; break; @@ -590,7 +591,8 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, case OIT_MemManage: ClassName = "NSObject"; break; - default: + case OIT_Singleton: + migrateFactoryMethod(Ctx, CDecl, OM, OIT_Singleton); return; } if (!OM->getResultType()->isObjCIdType()) @@ -624,7 +626,8 @@ void ObjCMigrateASTConsumer::migrateInstanceType(ASTContext &Ctx, void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx, ObjCContainerDecl *CDecl, - ObjCMethodDecl *OM) { + ObjCMethodDecl *OM, + ObjCInstanceTypeFamily OIT_Family) { if (OM->isInstanceMethod() || !OM->getResultType()->isObjCIdType()) return; @@ -647,6 +650,19 @@ void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx, IdentifierInfo *MethodIdName = OM->getSelector().getIdentifierInfoForSlot(0); std::string MethodName = MethodIdName->getName(); + if (OIT_Family == OIT_Singleton) { + StringRef STRefMethodName(MethodName); + size_t len = 0; + if (STRefMethodName.startswith("standard")) + len = strlen("standard"); + else if (STRefMethodName.startswith("shared")) + len = strlen("shared"); + else if (STRefMethodName.startswith("default")) + len = strlen("default"); + else + return; + MethodName = STRefMethodName.substr(len); + } std::string MethodNameSubStr = MethodName.substr(0, 3); StringRef MethodNamePrefix(MethodNameSubStr); std::string StringLoweredMethodNamePrefix = MethodNamePrefix.lower(); diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp index 3572930903..b1a22eea7e 100644 --- a/lib/Basic/IdentifierTable.cpp +++ b/lib/Basic/IdentifierTable.cpp @@ -467,6 +467,7 @@ ObjCInstanceTypeFamily Selector::getInstTypeMethodFamily(Selector sel) { break; case 'd': if (startsWithWord(name, "dictionary")) return OIT_Dictionary; + if (startsWithWord(name, "default")) return OIT_Singleton; break; case 'i': if (startsWithWord(name, "init")) return OIT_MemManage; @@ -474,6 +475,10 @@ ObjCInstanceTypeFamily Selector::getInstTypeMethodFamily(Selector sel) { case 'r': if (startsWithWord(name, "retain")) return OIT_MemManage; break; + case 's': + if (startsWithWord(name, "shared") || + startsWithWord(name, "standard")) + return OIT_Singleton; default: break; } diff --git a/test/ARCMT/objcmt-instancetype-2.m b/test/ARCMT/objcmt-instancetype-2.m index aff99984dc..325f2217a7 100644 --- a/test/ARCMT/objcmt-instancetype-2.m +++ b/test/ARCMT/objcmt-instancetype-2.m @@ -74,3 +74,14 @@ typedef enum NSURLBookmarkResolutionOptions { + (id)dateWithYear:(NSInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second timeZone:(NSTimeZone *)aTimeZone __attribute__((availability(macosx,introduced=10.4))); @end +@interface NSUserDefaults ++ (id) standardUserDefaults; +@end + +@interface NSNotificationCenter ++ (id) defaultCenter; +@end + +@interface UIApplication ++ (id)sharedApplication; +@end diff --git a/test/ARCMT/objcmt-instancetype-2.m.result b/test/ARCMT/objcmt-instancetype-2.m.result index ba66480653..7077f45489 100644 --- a/test/ARCMT/objcmt-instancetype-2.m.result +++ b/test/ARCMT/objcmt-instancetype-2.m.result @@ -74,3 +74,14 @@ typedef enum NSURLBookmarkResolutionOptions { + (instancetype)dateWithYear:(NSInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second timeZone:(NSTimeZone *)aTimeZone __attribute__((availability(macosx,introduced=10.4))); @end +@interface NSUserDefaults ++ (instancetype) standardUserDefaults; +@end + +@interface NSNotificationCenter ++ (instancetype) defaultCenter; +@end + +@interface UIApplication ++ (instancetype)sharedApplication; +@end