diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-07-10 21:30:22 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-07-10 21:30:22 +0000 |
commit | 56f48d09f8cdb458de7d148e9449e6ccbb6e679a (patch) | |
tree | 1811a0e19dbc00415365cf8a86614ff468347d1c /clang/lib/Edit | |
parent | ef99752e69be2ae98b3113c4089f30152f0b9ff2 (diff) | |
download | bcm5719-llvm-56f48d09f8cdb458de7d148e9449e6ccbb6e679a.tar.gz bcm5719-llvm-56f48d09f8cdb458de7d148e9449e6ccbb6e679a.zip |
ObjC migrator: Improve on hueristics.
migrate to 'copy attribute if Object
class implements NSCopying otherwise
assume implied 'strong'. Remove
lifetime qualifier on property as it has
moved to property's attribute. Added TODO
comment for future work by poking into
setter implementation.
llvm-svn: 186037
Diffstat (limited to 'clang/lib/Edit')
-rw-r--r-- | clang/lib/Edit/RewriteObjCFoundationAPI.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp index e257a0b6f1c..8d24003d942 100644 --- a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp +++ b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp @@ -358,23 +358,38 @@ bool edit::rewriteToObjCLiteralSyntax(const ObjCMessageExpr *Msg, bool edit::rewriteToObjCProperty(const ObjCMethodDecl *Getter, const ObjCMethodDecl *Setter, const NSAPI &NS, Commit &commit) { + ASTContext &Context = NS.getASTContext(); std::string PropertyString = "@property"; const ParmVarDecl *argDecl = *Setter->param_begin(); - QualType ArgType = argDecl->getType(); + QualType ArgType = Context.getCanonicalType(argDecl->getType()); Qualifiers::ObjCLifetime propertyLifetime = ArgType.getObjCLifetime(); if (ArgType->isObjCRetainableType() && propertyLifetime == Qualifiers::OCL_Strong) { - PropertyString += "(copy)"; + if (const ObjCObjectPointerType *ObjPtrTy = + ArgType->getAs<ObjCObjectPointerType>()) { + ObjCInterfaceDecl *IDecl = ObjPtrTy->getObjectType()->getInterface(); + if (IDecl && + IDecl->lookupNestedProtocol(&Context.Idents.get("NSCopying"))) + PropertyString += "(copy)"; + } } else if (propertyLifetime == Qualifiers::OCL_Weak) + // TODO. More precise determination of 'weak' attribute requires + // looking into setter's implementation for backing weak ivar. PropertyString += "(weak)"; else PropertyString += "(unsafe_unretained)"; - - QualType PropQT = Getter->getResultType(); + + // strip off any ARC lifetime qualifier. + QualType CanResultTy = Context.getCanonicalType(Getter->getResultType()); + if (CanResultTy.getQualifiers().hasObjCLifetime()) { + Qualifiers Qs = CanResultTy.getQualifiers(); + Qs.removeObjCLifetime(); + CanResultTy = Context.getQualifiedType(CanResultTy.getUnqualifiedType(), Qs); + } PropertyString += " "; - PropertyString += PropQT.getAsString(NS.getASTContext().getPrintingPolicy()); + PropertyString += CanResultTy.getAsString(Context.getPrintingPolicy()); PropertyString += " "; PropertyString += Getter->getNameAsString(); commit.replace(CharSourceRange::getCharRange(Getter->getLocStart(), |