summaryrefslogtreecommitdiffstats
path: root/clang/lib/Edit
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-07-10 21:30:22 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-07-10 21:30:22 +0000
commit56f48d09f8cdb458de7d148e9449e6ccbb6e679a (patch)
tree1811a0e19dbc00415365cf8a86614ff468347d1c /clang/lib/Edit
parentef99752e69be2ae98b3113c4089f30152f0b9ff2 (diff)
downloadbcm5719-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.cpp25
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(),
OpenPOWER on IntegriCloud