Objective-C SDK modernizer. Modernize to use

property-dot-syntax when receiver is 'super'. 
rdar://19140267

llvm-svn: 223846
This commit is contained in:
Fariborz Jahanian 2014-12-09 22:36:47 +00:00
parent b32bf14c2a
commit df833a4918
3 changed files with 56 additions and 6 deletions

View File

@ -242,7 +242,8 @@ namespace {
const NSAPI &NS, edit::Commit &commit,
const ParentMap *PMap) {
if (!Msg || Msg->isImplicit() ||
Msg->getReceiverKind() != ObjCMessageExpr::Instance)
(Msg->getReceiverKind() != ObjCMessageExpr::Instance &&
Msg->getReceiverKind() != ObjCMessageExpr::SuperInstance))
return false;
const ObjCMethodDecl *Method = Msg->getMethodDecl();
if (!Method)
@ -260,12 +261,17 @@ namespace {
return false;
SourceRange MsgRange = Msg->getSourceRange();
bool ReceiverIsSuper =
(Msg->getReceiverKind() == ObjCMessageExpr::SuperInstance);
// for 'super' receiver is nullptr.
const Expr *receiver = Msg->getInstanceReceiver();
bool NeedsParen = subscriptOperatorNeedsParens(receiver);
bool NeedsParen =
ReceiverIsSuper ? false : subscriptOperatorNeedsParens(receiver);
bool IsGetter = (Msg->getNumArgs() == 0);
if (IsGetter) {
// Find space location range between receiver expression and getter method.
SourceLocation BegLoc = receiver->getLocEnd();
SourceLocation BegLoc =
ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getLocEnd();
BegLoc = PP.getLocForEndOfToken(BegLoc);
SourceLocation EndLoc = Msg->getSelectorLoc(0);
SourceRange SpaceRange(BegLoc, EndLoc);
@ -285,9 +291,8 @@ namespace {
commit.replace(SourceRange(MsgRange.getBegin(), MsgRange.getBegin()), "");
commit.replace(SourceRange(MsgRange.getEnd(), MsgRange.getEnd()), "");
} else {
SourceRange ReceiverRange = receiver->getSourceRange();
if (NeedsParen)
commit.insertWrap("(", ReceiverRange, ")");
commit.insertWrap("(", receiver->getSourceRange(), ")");
std::string PropertyDotString = ".";
PropertyDotString += Prop->getName();
PropertyDotString += " =";
@ -295,7 +300,8 @@ namespace {
const Expr *RHS = Args[0];
if (!RHS)
return false;
SourceLocation BegLoc = ReceiverRange.getEnd();
SourceLocation BegLoc =
ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getLocEnd();
BegLoc = PP.getLocForEndOfToken(BegLoc);
SourceLocation EndLoc = RHS->getLocStart();
EndLoc = EndLoc.getLocWithOffset(-1);

View File

@ -37,3 +37,25 @@ P* fun();
- (P*) MethodReturnsPObj { return 0; }
@end
// rdar://19140267
@interface Sub : P
@end
@implementation Sub
- (int) Meth : (P*)array {
[super setCount : 100];
[super setCount : [array count]];
[[super PropertyReturnsPObj] setCount : [array count]];
[super setCount : (i1+i2*i3 - 100)];
return [super count] -
[(P*)0 count] + [array count] +
[fun() count] -
[[super PropertyReturnsPObj] count] +
[self->obj count];
}
@end

View File

@ -37,3 +37,25 @@ P* fun();
- (P*) MethodReturnsPObj { return 0; }
@end
// rdar://19140267
@interface Sub : P
@end
@implementation Sub
- (int) Meth : (P*)array {
super.count = 100;
super.count = array.count;
super.PropertyReturnsPObj.count = array.count;
super.count = (i1+i2*i3 - 100);
return super.count -
((P*)0).count + array.count +
fun().count -
super.PropertyReturnsPObj.count +
self->obj.count;
}
@end