[cfe-commits] r93561 - in /cfe/trunk: include/clang-c/Index.h tools/CIndex/CIndex.cpp tools/CIndex/CXCursor.cpp tools/CIndex/CXCursor.h tools/c-index-test/c-index-test.c

Douglas Gregor dgregor at apple.com
Fri Jan 15 13:56:14 PST 2010


Author: dgregor
Date: Fri Jan 15 15:56:13 2010
New Revision: 93561

URL: http://llvm.org/viewvc/llvm-project?rev=93561&view=rev
Log:
Make CXCursor's data opaque.

Modified:
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/tools/CIndex/CIndex.cpp
    cfe/trunk/tools/CIndex/CXCursor.cpp
    cfe/trunk/tools/CIndex/CXCursor.h
    cfe/trunk/tools/c-index-test/c-index-test.c

Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=93561&r1=93560&r2=93561&view=diff

==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Fri Jan 15 15:56:13 2010
@@ -137,9 +137,7 @@
 
 typedef struct {
   enum CXCursorKind kind;
-  CXDecl decl;
-  CXStmt stmt; /* expression reference */
-  CXDecl referringDecl;
+  void *data[3];
 } CXCursor;  
 
 /* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */

Modified: cfe/trunk/tools/CIndex/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=93561&r1=93560&r2=93561&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Fri Jan 15 15:56:13 2010
@@ -190,7 +190,7 @@
     if (ND->isImplicit())
       return;
 
-    CXCursor C = { CK, ND, 0, 0 };
+    CXCursor C = { CK, { ND, 0, 0 } };
     Callback(Root, C, CData);
   }
 
@@ -291,7 +291,7 @@
     if (ND->getPCHLevel() > MaxPCHLevel)
       return;
 
-    CXCursor C = { CK, ND, 0, 0 };
+    CXCursor C = { CK, { ND, 0, 0 } };
     Callback(CDecl, C, CData);
   }
 public:
@@ -412,14 +412,13 @@
                                             NamedDecl *ND) {
   if (clang_isReference(C.kind)) {
     
-    if (Decl *D = static_cast<Decl*>(C.referringDecl))
+    if (Decl *D = getCursorReferringDecl(C))
       return D->getLocation();
     
     switch (C.kind) {
     case CXCursor_ObjCClassRef: {
       if (isa<ObjCInterfaceDecl>(ND)) {
-        // FIXME: This is a hack (storing the parent decl in the stmt slot).
-        NamedDecl *parentDecl = static_cast<NamedDecl *>(C.stmt);
+        NamedDecl *parentDecl = getCursorInterfaceParent(C);
         return parentDecl->getLocation();
       }
       ObjCCategoryDecl *OID = dyn_cast<ObjCCategoryDecl>(ND);
@@ -437,16 +436,14 @@
       return OID->getLocation();
     }
     case CXCursor_ObjCSelectorRef: {
-      ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(
-        static_cast<Stmt *>(C.stmt));
+      ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(getCursorStmt(C));
       assert(OME && "clang_getCursorLine(): Missing message expr");
       return OME->getLeftLoc(); /* FIXME: should be a range */
     }
     case CXCursor_VarRef:
     case CXCursor_FunctionRef:
     case CXCursor_EnumConstantRef: {
-      DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
-        static_cast<Stmt *>(C.stmt));
+      DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(getCursorStmt(C));
       assert(DRE && "clang_getCursorLine(): Missing decl ref expr");
       return DRE->getLocation();
     }
@@ -868,9 +865,8 @@
 
 extern "C" {
 CXString clang_getCursorSpelling(CXCursor C) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
-
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
+  assert(ND && "CXCursor has null decl");
   if (clang_isReference(C.kind)) {
     switch (C.kind) {
     case CXCursor_ObjCSuperClassRef: {
@@ -894,8 +890,7 @@
       return CIndexer::createCXString(OID->getIdentifier()->getNameStart());
     }
     case CXCursor_ObjCSelectorRef: {
-      ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(
-        static_cast<Stmt *>(C.stmt));
+      ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(getCursorStmt(C));
       assert(OME && "clang_getCursorLine(): Missing message expr");
       return CIndexer::createCXString(OME->getSelector().getAsString().c_str(),
                                       true);
@@ -903,8 +898,7 @@
     case CXCursor_VarRef:
     case CXCursor_FunctionRef:
     case CXCursor_EnumConstantRef: {
-      DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
-        static_cast<Stmt *>(C.stmt));
+      DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(getCursorStmt(C));
       assert(DRE && "clang_getCursorLine(): Missing decl ref expr");
       return CIndexer::createCXString(DRE->getDecl()->getIdentifier()
                                       ->getNameStart());
@@ -913,7 +907,7 @@
       return CIndexer::createCXString("<not implemented>");
     }
   }
-  return clang_getDeclSpelling(C.decl);
+  return clang_getDeclSpelling(getCursorDecl(C));
 }
 
 const char *clang_getCursorKindSpelling(enum CXCursorKind Kind) {
@@ -993,11 +987,11 @@
     }
     if (ALoc.isNamedRef()) {
       if (isa<ObjCInterfaceDecl>(Dcl)) {
-        CXCursor C = { CXCursor_ObjCClassRef, Dcl, ALoc.getParentDecl(), 0 };
+        CXCursor C = { CXCursor_ObjCClassRef, { Dcl, ALoc.getParentDecl(), 0 }};
         return C;
       }
       if (isa<ObjCProtocolDecl>(Dcl)) {
-        CXCursor C = { CXCursor_ObjCProtocolRef, Dcl, ALoc.getParentDecl(), 0 };
+        CXCursor C = {CXCursor_ObjCProtocolRef, {Dcl, ALoc.getParentDecl(), 0}};
         return C;
       }
     }
@@ -1011,8 +1005,7 @@
 }
 
 unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
-  return X.kind == Y.kind && X.decl == Y.decl && X.stmt == Y.stmt &&
-         X.referringDecl == Y.referringDecl;
+  return X == Y;
 }
 
 CXCursor clang_getCursorFromDecl(CXDecl AnonDecl) {
@@ -1043,24 +1036,24 @@
 
 CXDecl clang_getCursorDecl(CXCursor C) {
   if (clang_isDeclaration(C.kind))
-    return C.decl;
+    return getCursorDecl(C);
 
   if (clang_isReference(C.kind)) {
-    if (C.stmt) {
+    if (getCursorStmt(C)) {
       if (C.kind == CXCursor_ObjCClassRef ||
           C.kind == CXCursor_ObjCProtocolRef)
-        return static_cast<Stmt *>(C.stmt);
+        return getCursorStmt(C);
       else
-        return getDeclFromExpr(static_cast<Stmt *>(C.stmt));
+        return getDeclFromExpr(getCursorStmt(C));
     } else
-      return C.decl;
+      return getCursorDecl(C);
   }
   return 0;
 }
 
 unsigned clang_getCursorLine(CXCursor C) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  assert(getCursorDecl(C) && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
 
   SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
@@ -1068,8 +1061,8 @@
 }
   
 unsigned clang_getCursorColumn(CXCursor C) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  assert(getCursorDecl(C) && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
   
   SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
@@ -1077,8 +1070,8 @@
 }
 
 const char *clang_getCursorSource(CXCursor C) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  assert(getCursorDecl(C) && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
   
   SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
@@ -1100,8 +1093,8 @@
 }
 
 CXFile clang_getCursorSourceFile(CXCursor C) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  assert(getCursorDecl(C) && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
   
   return (void *)
@@ -1116,8 +1109,8 @@
                                           unsigned *startColumn,
                                           unsigned *endLine,
                                           unsigned *endColumn) {
-  assert(C.decl && "CXCursor has null decl");
-  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  assert(getCursorDecl(C) && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
   FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
   CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
   

Modified: cfe/trunk/tools/CIndex/CXCursor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CXCursor.cpp?rev=93561&r1=93560&r2=93561&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CXCursor.cpp (original)
+++ cfe/trunk/tools/CIndex/CXCursor.cpp Fri Jan 15 15:56:13 2010
@@ -13,17 +13,46 @@
 
 #include "CXCursor.h"
 #include "clang/AST/Decl.h"
+#include "clang/AST/DeclObjC.h"
+#include "clang/AST/Expr.h"
 
 using namespace clang;
 
 CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D) {
-  CXCursor C = { K, D, 0, 0 };
+  CXCursor C = { K, { D, 0, 0 } };
   return C;  
 }
 
 CXCursor cxcursor::MakeCXCursor(CXCursorKind K, Decl *D, Stmt *S) {
   assert(clang_isReference(K));
-  CXCursor C = { K, D, S, 0 };
+  CXCursor C = { K, { D, S, 0 } };
   return C;  
 }
 
+Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
+  return (Decl *)Cursor.data[0];
+}
+
+Expr *cxcursor::getCursorExpr(CXCursor Cursor) {
+  return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
+}
+
+Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
+  return (Stmt *)Cursor.data[1];
+}
+
+Decl *cxcursor::getCursorReferringDecl(CXCursor Cursor) {
+  return (Decl *)Cursor.data[2];
+}
+
+NamedDecl *cxcursor::getCursorInterfaceParent(CXCursor Cursor) {
+  assert(Cursor.kind == CXCursor_ObjCClassRef);
+  assert(isa<ObjCInterfaceDecl>(getCursorDecl(Cursor)));
+  // FIXME: This is a hack (storing the parent decl in the stmt slot).
+  return static_cast<NamedDecl *>(Cursor.data[1]);
+}
+
+bool cxcursor::operator==(CXCursor X, CXCursor Y) {
+  return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
+         X.data[2] == Y.data[2];
+}
\ No newline at end of file

Modified: cfe/trunk/tools/CIndex/CXCursor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CXCursor.h?rev=93561&r1=93560&r2=93561&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CXCursor.h (original)
+++ cfe/trunk/tools/CIndex/CXCursor.h Fri Jan 15 15:56:13 2010
@@ -19,6 +19,8 @@
 namespace clang {
 
 class Decl;
+class Expr;
+class NamedDecl;
 class Stmt;
 
 namespace cxcursor {
@@ -26,6 +28,18 @@
 CXCursor MakeCXCursor(CXCursorKind K, clang::Decl *D);  
 CXCursor MakeCXCursor(CXCursorKind K, clang::Decl *D, clang::Stmt *S);
 
+Decl *getCursorDecl(CXCursor Cursor);
+Expr *getCursorExpr(CXCursor Cursor);
+Stmt *getCursorStmt(CXCursor Cursor);
+Decl *getCursorReferringDecl(CXCursor Cursor);
+NamedDecl *getCursorInterfaceParent(CXCursor Cursor);
+  
+bool operator==(CXCursor X, CXCursor Y);
+  
+inline bool operator!=(CXCursor X, CXCursor Y) {
+  return !(X == Y);
+}
+
 }} // end namespace: clang::cxcursor
 
 #endif

Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=93561&r1=93560&r2=93561&view=diff

==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Fri Jan 15 15:56:13 2010
@@ -111,11 +111,11 @@
           basename(clang_getCString(string)));
     clang_disposeString(string);
     
-    PrintDeclExtent(Cursor.decl);
+    PrintDeclExtent(Cursor.data[0]);
 
     printf("\n");
     
-    clang_loadDeclaration(Cursor.decl, DeclVisitor, 0);
+    clang_loadDeclaration(Cursor.data[0], DeclVisitor, 0);
   }
 }
 
@@ -152,7 +152,7 @@
       printf("// %s: %s:%d:%d: ", FileCheckPrefix, GetCursorSource(Ref),
              curLine, curColumn);
       PrintCursor(Ref);
-      string = clang_getDeclSpelling(Ref.decl);
+      string = clang_getDeclSpelling(Ref.data[0]);
       printf(" [Context:%s]\n", clang_getCString(string));
       clang_disposeString(string);
     }
@@ -166,13 +166,13 @@
 
 static void USRDeclVisitor(CXDecl D, CXCursor C, CXClientData Filter) {
   if (!Filter || (C.kind == *(enum CXCursorKind *)Filter)) {
-    CXString USR = clang_getDeclUSR(C.decl);
+    CXString USR = clang_getDeclUSR(C.data[0]);
     if (!USR.Spelling) {
       clang_disposeString(USR);
       return;
     }
     printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C), USR.Spelling);
-    PrintDeclExtent(C.decl);
+    PrintDeclExtent(C.data[0]);
     printf("\n");
     clang_disposeString(USR);
   }
@@ -180,9 +180,9 @@
 
 static void USRVisitor(CXTranslationUnit Unit, CXCursor Cursor,
                        CXClientData Filter) {  
-  if (Cursor.decl) {
+  if (Cursor.data[0]) {
     /* USRDeclVisitor(Unit, Cursor.decl, Cursor, Filter);*/
-    clang_loadDeclaration(Cursor.decl, USRDeclVisitor, 0);
+    clang_loadDeclaration(Cursor.data[0], USRDeclVisitor, 0);
   }
 }
 





More information about the cfe-commits mailing list