diff options
author | Steve Naroff <snaroff@apple.com> | 2008-12-03 00:56:33 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-12-03 00:56:33 +0000 |
commit | f326f4056ebbbc239dd01f6170897bbead6cee0b (patch) | |
tree | a328566dcc98b73f48c74a78e24db4480e4f76f1 | |
parent | b43a689520a2de0619acc58854c6920993e13325 (diff) | |
download | bcm5719-llvm-f326f4056ebbbc239dd01f6170897bbead6cee0b.tar.gz bcm5719-llvm-f326f4056ebbbc239dd01f6170897bbead6cee0b.zip |
More support for rewriting property getter/setters.
llvm-svn: 60450
-rw-r--r-- | clang/Driver/RewriteObjC.cpp | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/clang/Driver/RewriteObjC.cpp b/clang/Driver/RewriteObjC.cpp index 06a4a5caed8..f558d7d9309 100644 --- a/clang/Driver/RewriteObjC.cpp +++ b/clang/Driver/RewriteObjC.cpp @@ -104,6 +104,9 @@ namespace { llvm::DenseMap<BlockExpr *, std::string> RewrittenBlockExprs; + // This maps a synthesized message expr back to the original property. + llvm::DenseMap<Stmt *, ObjCPropertyRefExpr *> PropMsgExprs; + FunctionDecl *CurFunctionDef; VarDecl *GlobalVarDecl; @@ -193,6 +196,8 @@ namespace { Stmt *RewriteFunctionBodyOrGlobalInitializer(Stmt *S); Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp); Stmt *RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, SourceLocation OrigStart); + Stmt *RewritePropertyRefExpr(ObjCPropertyRefExpr *PropRefExpr); + Stmt *RewritePropertySetter(BinaryOperator *BinOp, ObjCPropertyRefExpr *PRE); Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp); Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp); Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp); @@ -650,7 +655,7 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID, // Synthesize an explicit cast to initialize the ivar. // FIXME: deal with code generation implications for various property // attributes (copy, retain, nonatomic). - // See objc-act.c:objc_synthesize_new_getter() for details. + // See objc-act.c:objc_synthesize_new_setter() for details. Setr += getIvarAccessString(ClassDecl, OID) + " = "; Setr += OID->getNameAsCString(); Setr += "; }"; @@ -984,6 +989,35 @@ void RewriteObjC::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) { ReplaceText(ClassDecl->getAtEndLoc(), 0, "// ", 3); } +Stmt *RewriteObjC::RewritePropertySetter(BinaryOperator *BinOp, + ObjCPropertyRefExpr *PRE) { + // FIXME: Fill in the transform. + return BinOp; +} + +Stmt *RewriteObjC::RewritePropertyRefExpr(ObjCPropertyRefExpr *PropRefExpr) { + // Synthesize a ObjCMessageExpr from a ObjCPropertyRefExpr. + // This allows us to reuse all the fun and games in SynthMessageExpr(). + ObjCMessageExpr *MsgExpr; + ObjCPropertyDecl *PDecl = PropRefExpr->getProperty(); + + MsgExpr = new ObjCMessageExpr(PropRefExpr->getBase(), + PDecl->getGetterName(), PDecl->getType(), + PDecl->getGetterMethodDecl(), + SourceLocation(), SourceLocation(), + 0, 0); + + Stmt *ReplacingStmt = SynthMessageExpr(MsgExpr); + + // Now do the actual rewrite. + ReplaceStmt(PropRefExpr, ReplacingStmt); + PropMsgExprs[ReplacingStmt] = PropRefExpr; + + // delete PropRefExpr; elsewhere... + delete MsgExpr; + return ReplacingStmt; +} + Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, SourceLocation OrigStart) { ObjCIvarDecl *D = IV->getDecl(); @@ -3986,6 +4020,15 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) { if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S)) return RewriteObjCIvarRefExpr(IvarRefExpr, OrigStmtRange.getBegin()); + if (ObjCPropertyRefExpr *PropRefExpr = dyn_cast<ObjCPropertyRefExpr>(S)) + return RewritePropertyRefExpr(PropRefExpr); + + if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) { + if (BinOp->isAssignmentOp()) { + if (ObjCPropertyRefExpr *PRE = PropMsgExprs[BinOp->getLHS()]) + return RewritePropertySetter(BinOp, PRE); + } + } if (ObjCSelectorExpr *AtSelector = dyn_cast<ObjCSelectorExpr>(S)) return RewriteAtSelector(AtSelector); |