r190005 - ObjectiveC migrator: start introducing NS_XXX annotations
Fariborz Jahanian
fjahanian at apple.com
Wed Sep 4 15:49:19 PDT 2013
Author: fjahanian
Date: Wed Sep 4 17:49:19 2013
New Revision: 190005
URL: http://llvm.org/viewvc/llvm-project?rev=190005&view=rev
Log:
ObjectiveC migrator: start introducing NS_XXX annotations
to Method/functions returning ObjC objects. wip.
Modified:
cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result
Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=190005&r1=190004&r2=190005&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Wed Sep 4 17:49:19 2013
@@ -940,14 +940,23 @@ void ObjCMigrateASTConsumer::AddCFAnnota
if (!ResultAnnotated) {
RetEffect Ret = CE.getReturnValue();
const char *AnnotationString = 0;
- if (Ret.getObjKind() == RetEffect::CF && Ret.isOwned()) {
- if (Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition())
+ if (Ret.getObjKind() == RetEffect::CF) {
+ if (Ret.isOwned() &&
+ Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition())
AnnotationString = " CF_RETURNS_RETAINED";
- }
- else if (Ret.getObjKind() == RetEffect::CF && Ret.notOwned()) {
- if (Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition())
+ else if (Ret.notOwned() &&
+ Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition())
AnnotationString = " CF_RETURNS_NOT_RETAINED";
}
+ else if (Ret.getObjKind() == RetEffect::ObjC) {
+ if (Ret.isOwned() &&
+ Ctx.Idents.get("NS_RETURNS_RETAINED").hasMacroDefinition())
+ AnnotationString = " NS_RETURNS_RETAINED";
+ else if (Ret.notOwned() &&
+ Ctx.Idents.get("NS_RETURNS_NOT_RETAINED").hasMacroDefinition())
+ AnnotationString = " NS_RETURNS_NOT_RETAINED";
+ }
+
if (AnnotationString) {
edit::Commit commit(*Editor);
commit.insertAfterToken(FuncDecl->getLocEnd(), AnnotationString);
@@ -966,6 +975,12 @@ void ObjCMigrateASTConsumer::AddCFAnnota
commit.insertBefore(pd->getLocation(), "CF_CONSUMED ");
Editor->commit(commit);
}
+ else if (AE == DecRefMsg && !pd->getAttr<NSConsumedAttr>() &&
+ Ctx.Idents.get("NS_CONSUMED").hasMacroDefinition()) {
+ edit::Commit commit(*Editor);
+ commit.insertBefore(pd->getLocation(), "NS_CONSUMED ");
+ Editor->commit(commit);
+ }
}
}
@@ -979,7 +994,9 @@ ObjCMigrateASTConsumer::CF_BRIDGING_KIND
CallEffects CE = CallEffects::getEffect(FuncDecl);
bool FuncIsReturnAnnotated = (FuncDecl->getAttr<CFReturnsRetainedAttr>() ||
- FuncDecl->getAttr<CFReturnsNotRetainedAttr>());
+ FuncDecl->getAttr<CFReturnsNotRetainedAttr>() ||
+ FuncDecl->getAttr<NSReturnsRetainedAttr>() ||
+ FuncDecl->getAttr<NSReturnsNotRetainedAttr>());
// Trivial case of when funciton is annotated and has no argument.
if (FuncIsReturnAnnotated && FuncDecl->getNumParams() == 0)
@@ -1046,14 +1063,23 @@ void ObjCMigrateASTConsumer::AddCFAnnota
if (!ResultAnnotated) {
RetEffect Ret = CE.getReturnValue();
const char *AnnotationString = 0;
- if (Ret.getObjKind() == RetEffect::CF && Ret.isOwned()) {
- if (Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition())
+ if (Ret.getObjKind() == RetEffect::CF) {
+ if (Ret.isOwned() &&
+ Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition())
AnnotationString = " CF_RETURNS_RETAINED";
- }
- else if (Ret.getObjKind() == RetEffect::CF && Ret.notOwned()) {
- if (Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition())
+ else if (Ret.notOwned() &&
+ Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition())
AnnotationString = " CF_RETURNS_NOT_RETAINED";
}
+ else if (Ret.getObjKind() == RetEffect::ObjC) {
+ if (Ret.isOwned() &&
+ Ctx.Idents.get("NS_RETURNS_RETAINED").hasMacroDefinition())
+ AnnotationString = " NS_RETURNS_RETAINED";
+ else if (Ret.notOwned() &&
+ Ctx.Idents.get("NS_RETURNS_NOT_RETAINED").hasMacroDefinition())
+ AnnotationString = " NS_RETURNS_NOT_RETAINED";
+ }
+
if (AnnotationString) {
edit::Commit commit(*Editor);
commit.insertBefore(MethodDecl->getLocEnd(), AnnotationString);
@@ -1078,12 +1104,14 @@ void ObjCMigrateASTConsumer::AddCFAnnota
void ObjCMigrateASTConsumer::migrateAddMethodAnnotation(
ASTContext &Ctx,
const ObjCMethodDecl *MethodDecl) {
- if (MethodDecl->hasBody())
+ if (MethodDecl->hasBody() || MethodDecl->isImplicit())
return;
CallEffects CE = CallEffects::getEffect(MethodDecl);
bool MethodIsReturnAnnotated = (MethodDecl->getAttr<CFReturnsRetainedAttr>() ||
- MethodDecl->getAttr<CFReturnsNotRetainedAttr>());
+ MethodDecl->getAttr<CFReturnsNotRetainedAttr>() ||
+ MethodDecl->getAttr<NSReturnsRetainedAttr>() ||
+ MethodDecl->getAttr<NSReturnsNotRetainedAttr>());
// Trivial case of when funciton is annotated and has no argument.
if (MethodIsReturnAnnotated &&
@@ -1092,7 +1120,9 @@ void ObjCMigrateASTConsumer::migrateAddM
if (!MethodIsReturnAnnotated) {
RetEffect Ret = CE.getReturnValue();
- if (Ret.getObjKind() == RetEffect::CF && (Ret.isOwned() || Ret.notOwned())) {
+ if ((Ret.getObjKind() == RetEffect::CF ||
+ Ret.getObjKind() == RetEffect::ObjC) &&
+ (Ret.isOwned() || Ret.notOwned())) {
AddCFAnnotations(Ctx, CE, MethodDecl, false);
return;
}
Modified: cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result?rev=190005&r1=190004&r2=190005&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result (original)
+++ cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result Wed Sep 4 17:49:19 2013
@@ -175,15 +175,15 @@ NSFastEnumerationState;
@interface NSNumber : NSValue
- (char)charValue;
- (id)initWithInt:(int)value;
-+ (NSNumber *)numberWithInt:(int)value;
++ (NSNumber *)numberWithInt:(int)value NS_RETURNS_NOT_RETAINED;
@end
@class NSString;
@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
- (NSUInteger)count;
- (id)initWithObjects:(const id [])objects count:(NSUInteger)cnt;
-+ (instancetype)arrayWithObject:(id)anObject;
-+ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
-+ (instancetype)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1)));
++ (instancetype)arrayWithObject:(id)anObject NS_RETURNS_NOT_RETAINED;
++ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt NS_RETURNS_NOT_RETAINED;
++ (instancetype)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1))) NS_RETURNS_NOT_RETAINED;
- (id)initWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1)));
- (id)initWithArray:(NSArray *)array;
@end @interface NSArray (NSArrayCreation) + (instancetype)array;
@@ -196,19 +196,19 @@ typedef double NSTimeInterval;
@end typedef unsigned short unichar;
@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
- (NSUInteger)length;
-- (NSString *)stringByAppendingString:(NSString *)aString;
+- (NSString *)stringByAppendingString:(NSString *)aString NS_RETURNS_NOT_RETAINED;
- ( const char *)UTF8String;
- (id)initWithUTF8String:(const char *)nullTerminatedCString;
-+ (instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
++ (instancetype)stringWithUTF8String:(const char *)nullTerminatedCString NS_RETURNS_NOT_RETAINED;
@end @class NSString, NSURL, NSError;
@interface NSData : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length;
-+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;
-+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;
++ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length NS_RETURNS_NOT_RETAINED;
++ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b NS_RETURNS_NOT_RETAINED;
@end @class NSLocale, NSDate, NSCalendar, NSTimeZone, NSError, NSArray, NSMutableDictionary;
@interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
- (NSUInteger)count;
-+ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
-+ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id <NSCopying> [])keys count:(NSUInteger)cnt;
++ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys NS_RETURNS_NOT_RETAINED;
++ (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id <NSCopying> [])keys count:(NSUInteger)cnt NS_RETURNS_NOT_RETAINED;
@end
@interface NSMutableDictionary : NSDictionary - (void)removeObjectForKey:(id)aKey;
- (void)setObject:(id)anObject forKey:(id)aKey;
@@ -350,7 +350,7 @@ CF_IMPLICIT_BRIDGING_DISABLED
@interface NSMutableArray : NSObject
- (void)addObject:(id)object;
-+ (instancetype)array;
++ (instancetype)array NS_RETURNS_NOT_RETAINED;
@end
// This is how NSMakeCollectable is declared in the OS X 10.8 headers.
@@ -895,8 +895,8 @@ int RDar6320065_test() {
//===----------------------------------------------------------------------===//
@interface RDar6859457 : NSObject {}
-- (NSString*) NoCopyString;
-- (NSString*) noCopyString;
+- (NSString*) NoCopyString NS_RETURNS_NOT_RETAINED;
+- (NSString*) noCopyString NS_RETURNS_NOT_RETAINED;
@end
@implementation RDar6859457
@@ -1332,7 +1332,7 @@ void rdar7265711_b(RDar7265711 *x) {
//===----------------------------------------------------------------------===//
@interface NSCursor : NSObject
-+ (NSCursor *)dragCopyCursor;
++ (NSCursor *)dragCopyCursor NS_RETURNS_NOT_RETAINED;
@end
void rdar7306898(void) {
@@ -1368,7 +1368,7 @@ typedef NSString* MyStringTy;
- (NSString*) returnsAnOwnedCFString CF_RETURNS_RETAINED; // no-warning
- (MyStringTy) returnsAnOwnedTypedString NS_RETURNS_RETAINED; // no-warning
- (NSString*) newString NS_RETURNS_NOT_RETAINED; // no-warning
-- (NSString*) newString_auto NS_RETURNS_AUTORELEASED; // no-warning
+- (NSString*) newString_auto NS_RETURNS_AUTORELEASED NS_RETURNS_NOT_RETAINED; // no-warning
- (NSString*) newStringNoAttr;
- (int) returnsAnOwnedInt NS_RETURNS_RETAINED; // expected-warning{{'ns_returns_retained' attribute only applies to methods that return an Objective-C object}}
- (id) pseudoInit NS_CONSUMES_SELF NS_RETURNS_RETAINED;
@@ -1443,7 +1443,7 @@ void testattr4() {
- (CFDateRef) returnsCFRetainedAsCF CF_RETURNS_RETAINED;
- (CFDateRef) newCFRetainedAsCF CF_RETURNS_NOT_RETAINED;
- (CFDateRef) newCFRetainedAsCFNoAttr CF_RETURNS_RETAINED;
-- (NSDate*) alsoReturnsRetained;
+- (NSDate*) alsoReturnsRetained NS_RETURNS_NOT_RETAINED;
- (CFDateRef) alsoReturnsRetainedAsCF CF_RETURNS_NOT_RETAINED;
- (NSDate*) returnsNSRetained NS_RETURNS_RETAINED;
@end
@@ -1579,7 +1579,7 @@ void r8272168() {
// Test case for <rdar://problem/8356342>, which in the past triggered
// a false positive.
@interface RDar8356342
-- (NSDate*) rdar8356342:(NSDate *)inValue;
+- (NSDate*) rdar8356342:(NSDate *)inValue NS_RETURNS_NOT_RETAINED;
@end
@implementation RDar8356342
@@ -1806,7 +1806,7 @@ int IOClose(void *context);
@end
@interface radar10973977 : NSObject
-- (id<SInS>)inputS;
+- (id<SInS>)inputS NS_RETURNS_NOT_RETAINED;
- (void)reader;
@end
@@ -1825,7 +1825,7 @@ int IOClose(void *context);
// Object escapes through a selector callback: radar://11398514
extern id NSApp;
@interface MySheetController
-- (id<SInS>)inputS;
+- (id<SInS>)inputS NS_RETURNS_NOT_RETAINED;
- (void)showDoSomethingSheetAction:(id)action;
- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
@end
@@ -2090,6 +2090,6 @@ CFAttributedStringRef CFAttributedCreate
@interface Action
@property(nonatomic) SEL action;
- at property(nonatomic, unsafe_unretained) id target;
+ at property(nonatomic, unsafe_unretained) id target NS_RETURNS_NOT_RETAINED;
@end
More information about the cfe-commits
mailing list