[cfe-commits] r43296 - /cfe/trunk/Driver/RewriteTest.cpp

Chris Lattner sabre at nondot.org
Wed Oct 24 09:57:36 PDT 2007


Author: lattner
Date: Wed Oct 24 11:57:36 2007
New Revision: 43296

URL: http://llvm.org/viewvc/llvm-project?rev=43296&view=rev
Log:
Use Ted's new mutable child iterators to update the tree as we rewrite it.
This will make nested subexprs work.

Modified:
    cfe/trunk/Driver/RewriteTest.cpp

Modified: cfe/trunk/Driver/RewriteTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=43296&r1=43295&r2=43296&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Wed Oct 24 11:57:36 2007
@@ -49,10 +49,10 @@
     void HandleDeclInMainFile(Decl *D);
     void RewriteInclude(SourceLocation Loc);
     
-    void RewriteFunctionBody(Stmt *S);
-    void RewriteAtEncode(ObjCEncodeExpr *Exp);
+    Stmt *RewriteFunctionBody(Stmt *S);
+    Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
+    Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
     void RewriteForwardClassDecl(ObjcClassDecl *Dcl);
-    void RewriteMessageExpr(ObjCMessageExpr *Exp);
     
     void WriteObjcClassMetaData(ObjcImplementationDecl *IDecl);
     void WriteObjcMetaData();
@@ -115,7 +115,7 @@
 void RewriteTest::HandleDeclInMainFile(Decl *D) {
   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
     if (Stmt *Body = FD->getBody())
-      RewriteFunctionBody(Body);
+      FD->setBody(RewriteFunctionBody(Body));
   
   if (ObjcImplementationDecl *CI = dyn_cast<ObjcImplementationDecl>(D))
     ClassImplementation.push_back(CI);
@@ -127,12 +127,12 @@
 }
 
 
-void RewriteTest::RewriteFunctionBody(Stmt *S) {
+Stmt *RewriteTest::RewriteFunctionBody(Stmt *S) {
   // Otherwise, just rewrite all children.
   for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end();
        CI != E; ++CI)
     if (*CI)
-      RewriteFunctionBody(*CI);
+      *CI = RewriteFunctionBody(*CI);
       
   // Handle specific things.
   if (ObjCEncodeExpr *AtEncode = dyn_cast<ObjCEncodeExpr>(S))
@@ -141,19 +141,22 @@
   if (ObjCMessageExpr *MessExpr = dyn_cast<ObjCMessageExpr>(S))
     return RewriteMessageExpr(MessExpr);
   
+  // Return this stmt unmodified.
+  return S;
 }
  
-void RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) {
+Stmt *RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) {
   // Create a new string expression.
   QualType StrType = Context->getPointerType(Context->CharTy);
   Expr *Replacement = new StringLiteral("foo", 3, false, StrType, 
                                         SourceLocation(), SourceLocation());
   Rewrite.ReplaceStmt(Exp, Replacement);
-  delete Replacement;
+  delete Exp;
+  return Replacement;
 }
 
 
-void RewriteTest::RewriteMessageExpr(ObjCMessageExpr *Exp) {
+Stmt *RewriteTest::RewriteMessageExpr(ObjCMessageExpr *Exp) {
   assert(MsgSendFunctionDecl && "Can't find objc_msgSend() decl");
   //Exp->dumpPretty();
   //printf("\n");
@@ -177,6 +180,11 @@
   Rewrite.ReplaceStmt(Exp, CE);
   //Exp->dump();
   //CE->dump();
+  
+  // FIXME: Walk the operands of Exp, setting them to null before we delete Exp.
+  // This will be needed when "CE" points to the operands of Exp.
+  delete Exp;
+  return CE;
 }
 
 void RewriteTest::RewriteForwardClassDecl(ObjcClassDecl *ClassDecl) {





More information about the cfe-commits mailing list