summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-10-10 18:23:13 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-10-10 18:23:13 +0000
commit7c87b43d28f134f3902261786a62f309e99538c4 (patch)
tree078ef02f6d3a055f281ceb8b17aceb1efb5e91ed /clang
parent9b971f95909034bb380b131996650c5235685100 (diff)
downloadbcm5719-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.h3
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp32
-rw-r--r--clang/lib/Basic/IdentifierTable.cpp6
-rw-r--r--clang/test/ARCMT/objcmt-instancetype-2.m2
-rw-r--r--clang/test/ARCMT/objcmt-instancetype-2.m.result6
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
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud