summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/IdentifierTable.h5
-rw-r--r--lib/ARCMigrate/ObjCMT.cpp80
-rw-r--r--lib/Basic/IdentifierTable.cpp8
-rw-r--r--test/ARCMT/objcmt-instancetype-2.m.result76
-rw-r--r--test/ARCMT/objcmt-instancetype.m.result2
5 files changed, 30 insertions, 141 deletions
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h
index 0bc13e6555..8e12b972ed 100644
--- a/include/clang/Basic/IdentifierTable.h
+++ b/include/clang/Basic/IdentifierTable.h
@@ -586,7 +586,10 @@ enum ObjCInstanceTypeFamily {
OIT_None,
OIT_Array,
OIT_Dictionary,
- OIT_MemManage
+ OIT_MemManage,
+ OIT_NSString,
+ OIT_NSSet,
+ OIT_NSURL
};
/// \brief Smart pointer class that efficiently represents Objective-C method
diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp
index 62f3c6b7e7..2b2f9224e9 100644
--- a/lib/ARCMigrate/ObjCMT.cpp
+++ b/lib/ARCMigrate/ObjCMT.cpp
@@ -41,8 +41,6 @@ class ObjCMigrateASTConsumer : public ASTConsumer {
void migrateInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl);
void migrateMethodInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl,
ObjCMethodDecl *OM);
- void migrateFactoryMethod(ASTContext &Ctx, ObjCContainerDecl *CDecl,
- ObjCMethodDecl *OM);
public:
std::string MigrateDir;
@@ -551,34 +549,13 @@ void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
Editor->commit(commit);
}
-static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC,
- ObjCMethodDecl *OM) {
- SourceRange R;
- std::string ClassString;
- if (TypeSourceInfo *TSInfo = OM->getResultTypeSourceInfo()) {
- TypeLoc TL = TSInfo->getTypeLoc();
- R = SourceRange(TL.getBeginLoc(), TL.getEndLoc());
- ClassString = "instancetype";
- }
- else {
- R = SourceRange(OM->getLocStart(), OM->getLocStart());
- ClassString = OM->isInstanceMethod() ? '-' : '+';
- ClassString += " (instancetype)";
- }
- edit::Commit commit(*ASTC.Editor);
- commit.replace(R, ClassString);
- ASTC.Editor->commit(commit);
-}
-
void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx,
ObjCContainerDecl *CDecl,
ObjCMethodDecl *OM) {
ObjCInstanceTypeFamily OIT_Family =
Selector::getInstTypeMethodFamily(OM->getSelector());
- if (OIT_Family == OIT_None) {
- migrateFactoryMethod(Ctx, CDecl, OM);
+ if (OIT_Family == OIT_None)
return;
- }
std::string ClassName;
switch (OIT_Family) {
case OIT_Array:
@@ -604,11 +581,24 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx,
IDecl = ImpDecl->getClassInterface();
}
if (!IDecl ||
- !IDecl->lookupInheritedClass(&Ctx.Idents.get(ClassName))) {
- migrateFactoryMethod(Ctx, CDecl, OM);
+ !IDecl->lookupInheritedClass(&Ctx.Idents.get(ClassName)))
return;
+
+ SourceRange R;
+ std::string ClassString;
+ if (TypeSourceInfo *TSInfo = OM->getResultTypeSourceInfo()) {
+ TypeLoc TL = TSInfo->getTypeLoc();
+ R = SourceRange(TL.getBeginLoc(), TL.getEndLoc());
+ ClassString = "instancetype";
+ }
+ else {
+ R = SourceRange(OM->getLocStart(), OM->getLocStart());
+ ClassString = OM->isInstanceMethod() ? '-' : '+';
+ ClassString += " (instancetype)";
}
- ReplaceWithInstancetype(*this, OM);
+ edit::Commit commit(*Editor);
+ commit.replace(R, ClassString);
+ Editor->commit(commit);
}
void ObjCMigrateASTConsumer::migrateInstanceType(ASTContext &Ctx,
@@ -622,42 +612,6 @@ void ObjCMigrateASTConsumer::migrateInstanceType(ASTContext &Ctx,
}
}
-void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx,
- ObjCContainerDecl *CDecl,
- ObjCMethodDecl *OM) {
- if (OM->isInstanceMethod() || !OM->getResultType()->isObjCIdType())
- return;
-
- // Candidate factory methods are + (id) NaMeXXX : ... which belong to a class
- // NSYYYNamE with matching names be at least 3 characters long.
- ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
- if (!IDecl) {
- if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CDecl))
- IDecl = CatDecl->getClassInterface();
- else if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(CDecl))
- IDecl = ImpDecl->getClassInterface();
- }
- if (!IDecl)
- return;
-
- StringRef ClassName = IDecl->getName();
- if (!ClassName.startswith("NS"))
- return;
-
- ClassName = ClassName.lower();
- IdentifierInfo *MethodIdName = OM->getSelector().getIdentifierInfoForSlot(0);
- StringRef MethodName = MethodIdName->getName();
- StringRef MethodNamePrefix = MethodName.substr(0, 3).lower();
- size_t Ix = ClassName.rfind(MethodNamePrefix);
- if (Ix == StringRef::npos)
- return;
- StringRef ClassNamePostfix = ClassName.substr(Ix);
- MethodName = MethodName.lower();
- if (!MethodName.startswith(ClassNamePostfix))
- return;
- ReplaceWithInstancetype(*this, OM);
-}
-
namespace {
class RewritesReceiver : public edit::EditsReceiver {
diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp
index 3572930903..96d9e56b6c 100644
--- a/lib/Basic/IdentifierTable.cpp
+++ b/lib/Basic/IdentifierTable.cpp
@@ -474,6 +474,14 @@ ObjCInstanceTypeFamily Selector::getInstTypeMethodFamily(Selector sel) {
case 'r':
if (startsWithWord(name, "retain")) return OIT_MemManage;
break;
+ case 's':
+ if (startsWithWord(name, "string")) return OIT_NSString;
+ else
+ if (startsWithWord(name, "set")) return OIT_NSSet;
+ break;
+ case 'U':
+ if (startsWithWord(name, "URL")) return OIT_NSURL;
+ break;
default:
break;
}
diff --git a/test/ARCMT/objcmt-instancetype-2.m.result b/test/ARCMT/objcmt-instancetype-2.m.result
deleted file mode 100644
index ba66480653..0000000000
--- a/test/ARCMT/objcmt-instancetype-2.m.result
+++ /dev/null
@@ -1,76 +0,0 @@
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11
-// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
-// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result
-
-typedef unsigned int NSUInteger;
-typedef int NSInteger;
-typedef char BOOL;
-@class NSData, NSError, NSProtocolChecker, NSObject;
-@class NSPortNameServer, NSTimeZone;
-
-@interface NSMutableString
-@end
-
-@interface NSString @end
-
-@class NSString, NSURL;
-@interface NSString (NSStringDeprecated)
-+ (instancetype)stringWithContentsOfFile:(NSString *)path __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" )));
-+ (instancetype)stringWithContentsOfURL:(NSURL *)url __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" )));
-+ (instancetype)stringWithCString:(const char *)bytes length:(NSUInteger)length __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" )));
-+ (instancetype)stringWithCString:(const char *)bytes __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" )));
-@end
-
-
-typedef enum NSURLBookmarkResolutionOptions {
- Bookmark
-} NSURLBookmarkResolutionOptions;
-
-@interface NSURL
-+ (instancetype)URLWithString:(NSString *)URLString;
-+ (instancetype)URLWithString:(NSString *)URLString relativeToURL:(NSURL *)baseURL;
-+ (instancetype)URLByResolvingBookmarkData:(NSData *)bookmarkData options:(NSURLBookmarkResolutionOptions)options relativeToURL:(NSURL *)relativeURL bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)error __attribute__((availability(macosx,introduced=10.6)));
-@end
-
-@class NSDictionary;
-@interface NSError
-+ (instancetype)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict;
-@end
-
-
-@interface NSMutableString (NSMutableStringExtensionMethods)
-+ (instancetype)stringWithCapacity:(NSUInteger)capacity;
-@end
-
-@interface NSMutableData
-+ (instancetype)dataWithCapacity:(NSUInteger)aNumItems;
-+ (instancetype)dataWithLength:(NSUInteger)length;
-@end
-
-@interface NSMutableDictionary @end
-
-@interface NSMutableDictionary (NSSharedKeySetDictionary)
-+ (instancetype )dictionaryWithSharedKeySet:(id)keyset __attribute__((availability(macosx,introduced=10.8)));
-@end
-
-@interface NSProtocolChecker
-+ (instancetype)protocolCheckerWithTarget:(NSObject *)anObject protocol:(Protocol *)aProtocol;
-@end
-
-@interface NSConnection
-+ (instancetype)connectionWithRegisteredName:(NSString *)name host:(NSString *)hostName;
-+ (instancetype)connectionWithRegisteredName:(NSString *)name host:(NSString *)hostName usingNameServer:(NSPortNameServer *)server;
-@end
-
-@interface NSDate
-+ (instancetype)dateWithString:(NSString *)aString __attribute__((availability(macosx,introduced=10.4)));
-@end
-
-@interface NSCalendarDate : NSDate
-+ (instancetype)calendarDate __attribute__((availability(macosx,introduced=10.4)));
-+ (instancetype)dateWithString:(NSString *)description calendarFormat:(NSString *)format locale:(id)locale __attribute__((availability(macosx,introduced=10.4)));
-+ (instancetype)dateWithString:(NSString *)description calendarFormat:(NSString *)format __attribute__((availability(macosx,introduced=10.4)));
-+ (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
-
diff --git a/test/ARCMT/objcmt-instancetype.m.result b/test/ARCMT/objcmt-instancetype.m.result
index ad8fcaeb9b..7bc554faed 100644
--- a/test/ARCMT/objcmt-instancetype.m.result
+++ b/test/ARCMT/objcmt-instancetype.m.result
@@ -11,7 +11,7 @@ typedef signed char BOOL;
@end
@interface NSString : NSObject
-+ (instancetype)stringWithString:(NSString *)string;
++ (id)stringWithString:(NSString *)string;
- (instancetype)initWithString:(NSString *)aString;
@end