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

Steve Naroff snaroff at apple.com
Wed Nov 14 11:25:57 PST 2007


Author: snaroff
Date: Wed Nov 14 13:25:57 2007
New Revision: 44129

URL: http://llvm.org/viewvc/llvm-project?rev=44129&view=rev
Log:

Fairly major surgery to RewriteTest::SynthesizeObjcInternalStruct().

This allows us to handle funky stuff like...

#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
@interface NSLayoutManager : NSObject <NSCoding, NSGlyphStorage> {
#else /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */
@interface NSLayoutManager : NSObject <NSCoding> {
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */

..which now rewrites to...

#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
#ifndef _REWRITER_typedef_NSLayoutManager
#define _REWRITER_typedef_NSLayoutManager
typedef struct objc_object NSLayoutManager;
#endif

struct NSLayoutManager {
    struct NSObject _NSObject;

#else /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */
// @interface NSLayoutManager : NSObject <NSCoding> {
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */


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=44129&r1=44128&r2=44129&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Wed Nov 14 13:25:57 2007
@@ -545,15 +545,6 @@
 }
 
 void RewriteTest::RewriteInterfaceDecl(ObjcInterfaceDecl *ClassDecl) {
-
-  SourceLocation LocStart = ClassDecl->getLocStart();
-  SourceLocation LocEnd = ClassDecl->getLocEnd();
-
-  const char *startBuf = SM->getCharacterData(LocStart);
-  const char *endBuf = SM->getCharacterData(LocEnd);
-
-  endBuf += Lexer::MeasureTokenLength(LocEnd, *SM);
-
   std::string ResultStr;
   if (!ObjcForwardDecls.count(ClassDecl)) {
     // we haven't seen a forward decl - generate a typedef.
@@ -572,8 +563,6 @@
   }
   SynthesizeObjcInternalStruct(ClassDecl, ResultStr);
     
-  Rewrite.ReplaceText(LocStart, endBuf-startBuf, 
-                      ResultStr.c_str(), ResultStr.size());
   RewriteProperties(ClassDecl->getNumPropertyDecl(),
                     ClassDecl->getPropertyDecl());
   RewriteMethodDeclarations(ClassDecl->getNumInstanceMethods(),
@@ -1158,51 +1147,62 @@
   if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl)))
     return;
   
-   Result += "\nstruct ";
-   Result += CDecl->getName();
-   if (RCDecl && ObjcSynthesizedStructs.count(RCDecl)) {
-     Result += " {\n    struct ";
-     Result += RCDecl->getName();
-     Result += " _";
-     Result += RCDecl->getName();
-     Result += ";\n";
-  }
-  else
-    Result += " {";
-    
+  Result += "\nstruct ";
+  Result += CDecl->getName();
+
+  SourceLocation LocStart = CDecl->getLocStart();
+  SourceLocation LocEnd = CDecl->getLocEnd();
+  
+  const char *startBuf = SM->getCharacterData(LocStart);
+  const char *endBuf = SM->getCharacterData(LocEnd);
+  
   if (NumIvars > 0) {
-    SourceLocation LocStart = CDecl->getLocStart();
-    SourceLocation LocEnd = CDecl->getLocEnd();
-    
-    const char *startBuf = SM->getCharacterData(LocStart);
-    const char *endBuf = SM->getCharacterData(LocEnd);
-    startBuf = strchr(startBuf, '{');
-    assert((startBuf && endBuf) 
+    const char *cursor = strchr(startBuf, '{');
+    assert((cursor && endBuf) 
            && "SynthesizeObjcInternalStruct - malformed @interface");
-    startBuf++; // past '{'
-    while (startBuf < endBuf) {
-      if (*startBuf == '@') {
-        startBuf = strchr(startBuf, 'p');
+    
+    // rewrite the original header *without* disturbing the '{'
+    Rewrite.ReplaceText(LocStart, cursor-startBuf-1, 
+                        Result.c_str(), Result.size());
+    if (RCDecl && ObjcSynthesizedStructs.count(RCDecl)) {
+      Result = "\n    struct ";
+      Result += RCDecl->getName();
+      Result += " _";
+      Result += RCDecl->getName();
+      Result += ";\n";
+      
+      // insert the super class structure definition.
+      SourceLocation OnePastCurly = LocStart.getFileLocWithOffset(cursor-startBuf+1);
+      Rewrite.InsertText(OnePastCurly, Result.c_str(), Result.size());
+    }
+    cursor++; // past '{'
+    
+    // Now comment out any visibility specifiers.
+    while (cursor < endBuf) {
+      if (*cursor == '@') {
+        SourceLocation atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
+        cursor = strchr(cursor, 'p');
         // FIXME: presence of @public, etc. inside comment results in
         // this transformation as well, which is still correct c-code.
-        if (!strncmp(startBuf, "public", strlen("public"))) {
-          startBuf += strlen("public");
-          Result += "/* @public */";
-        }
-        else if (!strncmp(startBuf, "private", strlen("private"))) {
-          startBuf += strlen("private");
-          Result += "/* @private */";
-        }
-        else if (!strncmp(startBuf, "protected", strlen("protected"))) {
-          startBuf += strlen("protected");
-          Result += "/* @protected */";
-        }
+        if (!strncmp(cursor, "public", strlen("public")) ||
+            !strncmp(cursor, "private", strlen("private")) ||
+            !strncmp(cursor, "protected", strlen("private")))
+          Rewrite.InsertText(atLoc, "// ", 3);
       }
-      Result += *startBuf++;
+      cursor++;
     }
+    // Don't forget to add a ';'!!
+    Rewrite.InsertText(LocEnd.getFileLocWithOffset(1), ";", 1);
+  } else { // we don't have any instance variables - insert super struct.
+    endBuf += Lexer::MeasureTokenLength(LocEnd, *SM);
+    Result += " {\n    struct ";
+    Result += RCDecl->getName();
+    Result += " _";
+    Result += RCDecl->getName();
+    Result += ";\n};\n";
+    Rewrite.ReplaceText(LocStart, endBuf-startBuf, 
+                        Result.c_str(), Result.size());
   }
-    
-  Result += "};\n";
   // Mark this struct as having been generated.
   if (!ObjcSynthesizedStructs.insert(CDecl))
   assert(false && "struct already synthesize- SynthesizeObjcInternalStruct");





More information about the cfe-commits mailing list