diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-10-10 18:23:13 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-10-10 18:23:13 +0000 |
commit | 7c87b43d28f134f3902261786a62f309e99538c4 (patch) | |
tree | 078ef02f6d3a055f281ceb8b17aceb1efb5e91ed /clang | |
parent | 9b971f95909034bb380b131996650c5235685100 (diff) | |
download | bcm5719-llvm-7c87b43d28f134f3902261786a62f309e99538c4.tar.gz bcm5719-llvm-7c87b43d28f134f3902261786a62f309e99538c4.zip |
ObjectiveC migrator: For 'default' and 'shared' family of
methods, infer their self's type as their result type.
// rdar://15145218
llvm-svn: 192377
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/IdentifierTable.h | 3 | ||||
-rw-r--r-- | clang/lib/ARCMigrate/ObjCMT.cpp | 32 | ||||
-rw-r--r-- | clang/lib/Basic/IdentifierTable.cpp | 6 | ||||
-rw-r--r-- | clang/test/ARCMT/objcmt-instancetype-2.m | 2 | ||||
-rw-r--r-- | clang/test/ARCMT/objcmt-instancetype-2.m.result | 6 |
5 files changed, 41 insertions, 8 deletions
diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h index 01b8e1f3613..304ff364bfc 100644 --- a/clang/include/clang/Basic/IdentifierTable.h +++ b/clang/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/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index a1d7a978426..21ba06cc2cf 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/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/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 2c70b9933a7..500e732eef3 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/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/clang/test/ARCMT/objcmt-instancetype-2.m b/clang/test/ARCMT/objcmt-instancetype-2.m index 93db1fdec8d..fb59265c4be 100644 --- a/clang/test/ARCMT/objcmt-instancetype-2.m +++ b/clang/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/clang/test/ARCMT/objcmt-instancetype-2.m.result b/clang/test/ARCMT/objcmt-instancetype-2.m.result index 199430b7555..8837e971ad2 100644 --- a/clang/test/ARCMT/objcmt-instancetype-2.m.result +++ b/clang/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 //===----------------------------------------------------------------------===// |