]> granicus.if.org Git - clang/commitdiff
minor changes, collect the range of an expr before rewriting the subexprs
authorChris Lattner <sabre@nondot.org>
Fri, 23 May 2008 20:40:52 +0000 (20:40 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 May 2008 20:40:52 +0000 (20:40 +0000)
no functionality change.

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

Driver/RewriteObjC.cpp

index 3f4077373fa3a6f299befc46f77d1cbd9296150e..eb9d01256497bd92efcb2a188d0667c801c6f1d5 100644 (file)
@@ -165,7 +165,7 @@ namespace {
     // Expression Rewriting.
     Stmt *RewriteFunctionBodyOrGlobalInitializer(Stmt *S);
     Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
-    Stmt *RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV);
+    Stmt *RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, SourceLocation OrigStart);
     Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp);
     Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
     Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp);
@@ -813,7 +813,8 @@ void RewriteObjC::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) {
   ReplaceText(ClassDecl->getAtEndLoc(), 0, "// ", 3);
 }
 
-Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
+Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, 
+                                          SourceLocation OrigStart) {
   ObjCIvarDecl *D = IV->getDecl();
   if (CurMethodDecl) {
     if (const PointerType *pType = IV->getBase()->getType()->getAsPointerType()) {
@@ -833,21 +834,24 @@ Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
       CastExpr *castExpr = new CastExpr(castT, IV->getBase(), SourceLocation());
       // Don't forget the parens to enforce the proper binding.
-      ParenExpr *PE = new ParenExpr(SourceLocation(), SourceLocation(), castExpr);
+      ParenExpr *PE = new ParenExpr(IV->getBase()->getLocStart(),
+                                    IV->getBase()->getLocEnd(),
+                                    castExpr);
       if (IV->isFreeIvar() && 
           CurMethodDecl->getClassInterface() == iFaceDecl->getDecl()) {
-        MemberExpr *ME = new MemberExpr(PE, true, D, IV->getLocation(), D->getType());
+        MemberExpr *ME = new MemberExpr(PE, true, D, IV->getLocation(),
+                                        D->getType());
         ReplaceStmt(IV, ME);
         delete IV;
         return ME;
-      } else {
-        ReplaceStmt(IV->getBase(), PE);
-        // Cannot delete IV->getBase(), since PE points to it.
-        // Replace the old base with the cast. This is important when doing
-        // embedded rewrites. For example, [newInv->_container addObject:0].
-        IV->setBase(PE); 
-        return IV;
       }
+       
+      ReplaceStmt(IV->getBase(), PE);
+      // Cannot delete IV->getBase(), since PE points to it.
+      // Replace the old base with the cast. This is important when doing
+      // embedded rewrites. For example, [newInv->_container addObject:0].
+      IV->setBase(PE); 
+      return IV;
     }
   } else { // we are outside a method.
     assert(!IV->isFreeIvar() && "Cannot have a free standing ivar outside a method");
@@ -896,7 +900,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
     ObjCBcLabelNo.push_back(++BcLabelCount);
   }
   
-  SourceLocation OrigStmtEnd = S->getLocEnd();
+  SourceRange OrigStmtRange = S->getSourceRange();
   
   // Start by rewriting all children.
   for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end();
@@ -912,7 +916,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
     return RewriteAtEncode(AtEncode);
   
   if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S))
-    return RewriteObjCIvarRefExpr(IvarRefExpr);
+    return RewriteObjCIvarRefExpr(IvarRefExpr, OrigStmtRange.getBegin());
 
   if (ObjCSelectorExpr *AtSelector = dyn_cast<ObjCSelectorExpr>(S))
     return RewriteAtSelector(AtSelector);
@@ -955,7 +959,8 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
   
   if (ObjCForCollectionStmt *StmtForCollection = 
         dyn_cast<ObjCForCollectionStmt>(S))
-    return RewriteObjCForCollectionStmt(StmtForCollection, OrigStmtEnd);
+    return RewriteObjCForCollectionStmt(StmtForCollection, 
+                                        OrigStmtRange.getEnd());
   if (BreakStmt *StmtBreakStmt =
       dyn_cast<BreakStmt>(S))
     return RewriteBreakStmt(StmtBreakStmt);