]> granicus.if.org Git - clang/commitdiff
Fixup more objc rwriter bug having to do with
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 11 Apr 2011 21:17:02 +0000 (21:17 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 11 Apr 2011 21:17:02 +0000 (21:17 +0000)
rewriting of blocks which have objective-c
stuff which need be rewritten as well. // rdar://9254348

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129300 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Rewrite/Rewriter.h
lib/Rewrite/RewriteObjC.cpp
lib/Rewrite/Rewriter.cpp
test/Rewriter/rewrite-block-literal-1.mm

index 252f0baf890384e790c0182a9de6d8998a5241a6..397571714ceec7777de7c671f535d1da23527017 100644 (file)
@@ -245,6 +245,10 @@ public:
   /// printer to generate the replacement code.  This returns true if the input
   /// could not be rewritten, or false if successful.
   bool ReplaceStmt(Stmt *From, Stmt *To);
+  
+  /// ConvertToString converts statement 'From' to a string using the
+  /// pretty pronter.
+  std::string ConvertToString(Stmt *From);
 
   /// getEditBuffer - This is like getRewriteBufferFor, but always returns a
   /// buffer, and allows you to write on it directly.  This is useful if you
index 298ed9a90620f35a278da59e7a9eb51f7d3d3250..ff4c5e915260a7cd755c5ac5060b3081cef8f22c 100644 (file)
@@ -5519,27 +5519,34 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
   for (Stmt::child_range CI = S->children(); CI; ++CI)
     if (*CI) {
       Stmt *newStmt;
-      Stmt *S = (*CI);
-      if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S)) {
+      Stmt *ChildStmt = (*CI);
+      if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(ChildStmt)) {
         Expr *OldBase = IvarRefExpr->getBase();
         bool replaced = false;
-        newStmt = RewriteObjCNestedIvarRefExpr(S, replaced);
+        newStmt = RewriteObjCNestedIvarRefExpr(ChildStmt, replaced);
         if (replaced) {
           if (ObjCIvarRefExpr *IRE = dyn_cast<ObjCIvarRefExpr>(newStmt))
             ReplaceStmt(OldBase, IRE->getBase());
           else
-            ReplaceStmt(S, newStmt);
+            ReplaceStmt(ChildStmt, newStmt);
         }
       }
       else
-        newStmt = RewriteFunctionBodyOrGlobalInitializer(S);
-      if (newStmt)
-        *CI = newStmt;
+        newStmt = RewriteFunctionBodyOrGlobalInitializer(ChildStmt);
+      if (newStmt) {
+          if (Expr *PropOrImplicitRefExpr = dyn_cast<Expr>(ChildStmt))
+            if (PropSetters[PropOrImplicitRefExpr] == S) {
+              S = newStmt;
+              newStmt = 0;
+            }
+        if (newStmt)
+          *CI = newStmt;
+      }
       // If dealing with an assignment with LHS being a property reference
       // expression, the entire assignment tree is rewritten into a property
       // setter messaging. This involvs the RHS too. Do not attempt to rewrite
       // RHS again.
-      if (Expr *Exp = dyn_cast<Expr>(S))
+      if (Expr *Exp = dyn_cast<Expr>(ChildStmt))
         if (isa<ObjCPropertyRefExpr>(Exp)) {
           if (PropSetters[Exp]) {
             ++CI;
@@ -5565,7 +5572,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
     PropParentMap = 0;
     ImportedLocalExternalDecls.clear();
     // Now we snarf the rewritten text and stash it away for later use.
-    std::string Str = Rewrite.getRewrittenText(BE->getSourceRange());
+    std::string Str = Rewrite.ConvertToString(BE->getBody());
     RewrittenBlockExprs[BE] = Str;
 
     Stmt *blockTranscribed = SynthBlockInitExpr(BE, InnerBlockDeclRefs);
index c4b6757bacb101998beb4e18513855ae526624d2..3d396d43e4dc08d979dcacbbac2b1724e4587420 100644 (file)
@@ -303,3 +303,10 @@ bool Rewriter::ReplaceStmt(Stmt *From, Stmt *To) {
   ReplaceText(From->getLocStart(), Size, Str);
   return false;
 }
+
+std::string Rewriter::ConvertToString(Stmt *From) {
+  std::string SStr;
+  llvm::raw_string_ostream S(SStr);
+  From->printPretty(S, 0, PrintingPolicy(*LangOpts));
+  return SStr;
+}
index 681d2ff07728e47935c13fd705a9a1847822e113..04302d17f10f139fbdaeefc47821ae2d66aaca1d 100644 (file)
@@ -16,9 +16,14 @@ typedef void (^BLOCK_TYPE)(void);
 @implementation CoreDAVTaskGroup
 - (void)_finishInitialSync {
                     CoreDAVTaskGroup *folderPost;
-                    [folderPost setCompletionBlock : (^{
-                       self.IVAR = 0;
-                    })];
+  folderPost.completionBlock = ^{
+    self.IVAR = 0;
+    [self _finishInitialSync];
+  };
+
+  [folderPost setCompletionBlock : (^{
+    self.IVAR = 0;
+  })];
 }
 @dynamic IVAR;
 - (void) setCompletionBlock : (BLOCK_TYPE) arg {}