From 9fcbd5e55a8029a0ca8a5d64457278ec716a8705 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 10 Oct 2013 18:23:13 +0000 Subject: [PATCH] ObjectiveC migrator: For 'default' and 'shared' family of methods, infer their self's type as their result type. // rdar://15145218 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192377 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/IdentifierTable.h | 3 ++- lib/ARCMigrate/ObjCMT.cpp | 32 +++++++++++++++++++++-- lib/Basic/IdentifierTable.cpp | 6 ++--- test/ARCMT/objcmt-instancetype-2.m | 2 ++ test/ARCMT/objcmt-instancetype-2.m.result | 6 +++-- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 01b8e1f361..304ff364bf 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -587,7 +587,8 @@ enum ObjCInstanceTypeFamily { OIT_Array, OIT_Dictionary, OIT_Singleton, - OIT_Init + OIT_Init, + OIT_ReturnsSelf }; /// \brief Smart pointer class that efficiently represents Objective-C method diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index a1d7a97842..21ba06cc2c 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -696,6 +696,28 @@ static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC, ASTC.Editor->commit(commit); } +static void ReplaceWithClasstype(const ObjCMigrateASTConsumer &ASTC, + ObjCMethodDecl *OM) { + ObjCInterfaceDecl *IDecl = OM->getClassInterface(); + SourceRange R; + std::string ClassString; + if (TypeSourceInfo *TSInfo = OM->getResultTypeSourceInfo()) { + TypeLoc TL = TSInfo->getTypeLoc(); + R = SourceRange(TL.getBeginLoc(), TL.getEndLoc()); { + ClassString = IDecl->getName(); + ClassString += "*"; + } + } + else { + R = SourceRange(OM->getLocStart(), OM->getLocStart()); + ClassString = "+ ("; + ClassString += IDecl->getName(); ClassString += "*)"; + } + edit::Commit commit(*ASTC.Editor); + commit.replace(R, ClassString); + ASTC.Editor->commit(commit); +} + void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl, ObjCMethodDecl *OM) { @@ -720,6 +742,9 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx, if (OM->getResultType()->isObjCIdType()) ReplaceWithInstancetype(*this, OM); return; + case OIT_ReturnsSelf: + migrateFactoryMethod(Ctx, CDecl, OM, OIT_ReturnsSelf); + return; } if (!OM->getResultType()->isObjCIdType()) return; @@ -965,7 +990,7 @@ void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx, return; std::string MethodName = MethodIdName->getName(); - if (OIT_Family == OIT_Singleton) { + if (OIT_Family == OIT_Singleton || OIT_Family == OIT_ReturnsSelf) { StringRef STRefMethodName(MethodName); size_t len = 0; if (STRefMethodName.startswith("standard")) @@ -991,7 +1016,10 @@ void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx, LoweredMethodName = StringLoweredMethodName; if (!LoweredMethodName.startswith(ClassNamePostfix)) return; - ReplaceWithInstancetype(*this, OM); + if (OIT_Family == OIT_ReturnsSelf) + ReplaceWithClasstype(*this, OM); + else + ReplaceWithInstancetype(*this, OM); } static bool IsVoidStarType(QualType Ty) { diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp index 2c70b9933a..500e732eef 100644 --- a/lib/Basic/IdentifierTable.cpp +++ b/lib/Basic/IdentifierTable.cpp @@ -464,12 +464,12 @@ ObjCInstanceTypeFamily Selector::getInstTypeMethodFamily(Selector sel) { if (startsWithWord(name, "array")) return OIT_Array; break; case 'd': + if (startsWithWord(name, "default")) return OIT_ReturnsSelf; if (startsWithWord(name, "dictionary")) return OIT_Dictionary; break; case 's': - if (startsWithWord(name, "shared") || - startsWithWord(name, "standard")) - return OIT_Singleton; + if (startsWithWord(name, "shared")) return OIT_ReturnsSelf; + if (startsWithWord(name, "standard")) return OIT_Singleton; case 'i': if (startsWithWord(name, "init")) return OIT_Init; default: diff --git a/test/ARCMT/objcmt-instancetype-2.m b/test/ARCMT/objcmt-instancetype-2.m index 93db1fdec8..fb59265c4b 100644 --- a/test/ARCMT/objcmt-instancetype-2.m +++ b/test/ARCMT/objcmt-instancetype-2.m @@ -80,10 +80,12 @@ typedef enum NSURLBookmarkResolutionOptions { @interface NSNotificationCenter + (id) defaultCenter; ++ sharedCenter; @end @interface UIApplication + (id)sharedApplication; ++ defaultApplication; @end //===----------------------------------------------------------------------===// diff --git a/test/ARCMT/objcmt-instancetype-2.m.result b/test/ARCMT/objcmt-instancetype-2.m.result index 199430b755..8837e971ad 100644 --- a/test/ARCMT/objcmt-instancetype-2.m.result +++ b/test/ARCMT/objcmt-instancetype-2.m.result @@ -79,11 +79,13 @@ typedef enum NSURLBookmarkResolutionOptions { @end @interface NSNotificationCenter -+ (id) defaultCenter; ++ (NSNotificationCenter*) defaultCenter; ++ (NSNotificationCenter*) sharedCenter; @end @interface UIApplication -+ (instancetype)sharedApplication; ++ (UIApplication*)sharedApplication; ++ (UIApplication*) defaultApplication; @end //===----------------------------------------------------------------------===// -- 2.40.0