[cfe-commits] r159783 - in /cfe/trunk: lib/Edit/RewriteObjCFoundationAPI.cpp test/ARCMT/objcmt-subscripting-literals.m test/ARCMT/objcmt-subscripting-literals.m.result
Argyrios Kyrtzidis
akyrtzi at gmail.com
Thu Jul 5 14:49:51 PDT 2012
Author: akirtzidis
Date: Thu Jul 5 16:49:51 2012
New Revision: 159783
URL: http://llvm.org/viewvc/llvm-project?rev=159783&view=rev
Log:
[objcmt] Allow migrating to subscripting syntax for other classes
(apart from NSDictionary/NSArray) that implement objectForKey:/objectAtIndex/etc.
and the subscripting methods as well.
Part of rdar://11734969
Modified:
cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m
cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result
Modified: cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp?rev=159783&r1=159782&r2=159783&view=diff
==============================================================================
--- cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp (original)
+++ cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp Thu Jul 5 16:49:51 2012
@@ -94,6 +94,15 @@
// rewriteToObjCSubscriptSyntax.
//===----------------------------------------------------------------------===//
+static bool canRewriteToSubscriptSyntax(const ObjCInterfaceDecl *IFace,
+ Selector subscriptSel) {
+ if (const ObjCMethodDecl *MD = IFace->lookupInstanceMethod(subscriptSel)) {
+ if (!MD->isUnavailable())
+ return true;
+ }
+ return false;
+}
+
static bool subscriptOperatorNeedsParens(const Expr *FullExpr);
static void maybePutParensOnReceiver(const Expr *Receiver, Commit &commit) {
@@ -129,7 +138,8 @@
const ObjCMessageExpr *Msg,
const NSAPI &NS,
Commit &commit) {
- if (!IFace->lookupInstanceMethod(NS.getObjectAtIndexedSubscriptSelector()))
+ if (!canRewriteToSubscriptSyntax(IFace,
+ NS.getObjectAtIndexedSubscriptSelector()))
return false;
return rewriteToSubscriptGetCommon(Msg, commit);
}
@@ -138,7 +148,8 @@
const ObjCMessageExpr *Msg,
const NSAPI &NS,
Commit &commit) {
- if (!IFace->lookupInstanceMethod(NS.getObjectForKeyedSubscriptSelector()))
+ if (!canRewriteToSubscriptSyntax(IFace,
+ NS.getObjectForKeyedSubscriptSelector()))
return false;
return rewriteToSubscriptGetCommon(Msg, commit);
}
@@ -147,13 +158,15 @@
const ObjCMessageExpr *Msg,
const NSAPI &NS,
Commit &commit) {
+ if (!canRewriteToSubscriptSyntax(IFace,
+ NS.getSetObjectAtIndexedSubscriptSelector()))
+ return false;
+
if (Msg->getNumArgs() != 2)
return false;
const Expr *Rec = Msg->getInstanceReceiver();
if (!Rec)
return false;
- if (!IFace->lookupInstanceMethod(NS.getSetObjectAtIndexedSubscriptSelector()))
- return false;
SourceRange MsgRange = Msg->getSourceRange();
SourceRange RecRange = Rec->getSourceRange();
@@ -179,13 +192,15 @@
const ObjCMessageExpr *Msg,
const NSAPI &NS,
Commit &commit) {
+ if (!canRewriteToSubscriptSyntax(IFace,
+ NS.getSetObjectForKeyedSubscriptSelector()))
+ return false;
+
if (Msg->getNumArgs() != 2)
return false;
const Expr *Rec = Msg->getInstanceReceiver();
if (!Rec)
return false;
- if (!IFace->lookupInstanceMethod(NS.getSetObjectForKeyedSubscriptSelector()))
- return false;
SourceRange MsgRange = Msg->getSourceRange();
SourceRange RecRange = Rec->getSourceRange();
@@ -220,26 +235,21 @@
const_cast<ObjCMethodDecl *>(Method));
if (!IFace)
return false;
- IdentifierInfo *II = IFace->getIdentifier();
Selector Sel = Msg->getSelector();
- if (II == NS.getNSClassId(NSAPI::ClassId_NSArray) &&
- Sel == NS.getNSArraySelector(NSAPI::NSArr_objectAtIndex))
+ if (Sel == NS.getNSArraySelector(NSAPI::NSArr_objectAtIndex))
return rewriteToArraySubscriptGet(IFace, Msg, NS, commit);
- if (II == NS.getNSClassId(NSAPI::ClassId_NSDictionary) &&
- Sel == NS.getNSDictionarySelector(NSAPI::NSDict_objectForKey))
+ if (Sel == NS.getNSDictionarySelector(NSAPI::NSDict_objectForKey))
return rewriteToDictionarySubscriptGet(IFace, Msg, NS, commit);
if (Msg->getNumArgs() != 2)
return false;
- if (II == NS.getNSClassId(NSAPI::ClassId_NSMutableArray) &&
- Sel == NS.getNSArraySelector(NSAPI::NSMutableArr_replaceObjectAtIndex))
+ if (Sel == NS.getNSArraySelector(NSAPI::NSMutableArr_replaceObjectAtIndex))
return rewriteToArraySubscriptSet(IFace, Msg, NS, commit);
- if (II == NS.getNSClassId(NSAPI::ClassId_NSMutableDictionary) &&
- Sel == NS.getNSDictionarySelector(NSAPI::NSMutableDict_setObjectForKey))
+ if (Sel == NS.getNSDictionarySelector(NSAPI::NSMutableDict_setObjectForKey))
return rewriteToDictionarySubscriptSet(IFace, Msg, NS, commit);
return false;
Modified: cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m?rev=159783&r1=159782&r2=159783&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m (original)
+++ cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m Thu Jul 5 16:49:51 2012
@@ -169,3 +169,45 @@
arr = [NSArray arrayWithObjects: globStr, str, nil];
arr = [NSArray arrayWithObject:globStr];
}
+
+ at interface Custom : NSObject
+- (id)objectAtIndex:(unsigned long)index;
+ at end
+
+ at interface Custom (Extended)
+- (id)objectAtIndexedSubscript:(unsigned)idx;
+ at end
+
+ at interface MutableCustom : Custom
+- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
+ at end
+
+ at interface MutableCustom (Extended)
+- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx;
+ at end
+
+ at interface CustomUnavail : NSObject
+- (id)objectAtIndex:(unsigned long)index;
+ at end
+
+ at interface CustomUnavail (Extended)
+- (id)objectAtIndexedSubscript:(unsigned)idx __attribute__((unavailable));
+ at end
+
+ at interface MutableCustomUnavail : CustomUnavail
+- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
+ at end
+
+ at interface MutableCustomUnavail (Extended)
+- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx __attribute__((unavailable));
+ at end
+
+void test2() {
+ MutableCustom *mutc;
+ id o = [mutc objectAtIndex:4];
+ [mutc replaceObjectAtIndex:2 withObject:@"val"];
+
+ MutableCustomUnavail *mutcunaval;
+ o = [mutcunaval objectAtIndex:4];
+ [mutcunaval replaceObjectAtIndex:2 withObject:@"val"];
+}
Modified: cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result?rev=159783&r1=159782&r2=159783&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result (original)
+++ cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result Thu Jul 5 16:49:51 2012
@@ -169,3 +169,45 @@
arr = @[(id)globStr, str];
arr = @[(id)globStr];
}
+
+ at interface Custom : NSObject
+- (id)objectAtIndex:(unsigned long)index;
+ at end
+
+ at interface Custom (Extended)
+- (id)objectAtIndexedSubscript:(unsigned)idx;
+ at end
+
+ at interface MutableCustom : Custom
+- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
+ at end
+
+ at interface MutableCustom (Extended)
+- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx;
+ at end
+
+ at interface CustomUnavail : NSObject
+- (id)objectAtIndex:(unsigned long)index;
+ at end
+
+ at interface CustomUnavail (Extended)
+- (id)objectAtIndexedSubscript:(unsigned)idx __attribute__((unavailable));
+ at end
+
+ at interface MutableCustomUnavail : CustomUnavail
+- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
+ at end
+
+ at interface MutableCustomUnavail (Extended)
+- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx __attribute__((unavailable));
+ at end
+
+void test2() {
+ MutableCustom *mutc;
+ id o = mutc[4];
+ mutc[2] = @"val";
+
+ MutableCustomUnavail *mutcunaval;
+ o = [mutcunaval objectAtIndex:4];
+ [mutcunaval replaceObjectAtIndex:2 withObject:@"val"];
+}
More information about the cfe-commits
mailing list