[cfe-commits] r80529 - in /cfe/trunk: clang.xcodeproj/project.pbxproj include/clang-c/Index.h tools/CIndex/CIndex.cpp tools/CIndex/CIndex.exports tools/c-index-test/c-index-test.c

Steve Naroff snaroff at apple.com
Sun Aug 30 17:59:04 PDT 2009


Author: snaroff
Date: Sun Aug 30 19:59:03 2009
New Revision: 80529

URL: http://llvm.org/viewvc/llvm-project?rev=80529&view=rev
Log:
More fleshing out the C-based indexing API (under construction).

Modified:
    cfe/trunk/clang.xcodeproj/project.pbxproj
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/tools/CIndex/CIndex.cpp
    cfe/trunk/tools/CIndex/CIndex.exports
    cfe/trunk/tools/c-index-test/c-index-test.c

Modified: cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=80529&r1=80528&r2=80529&view=diff

==============================================================================
--- cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/trunk/clang.xcodeproj/project.pbxproj Sun Aug 30 19:59:03 2009
@@ -111,6 +111,7 @@
 		9012911D1048068D0083456D /* ASTUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9012911C1048068D0083456D /* ASTUnit.cpp */; };
 		90129121104812F90083456D /* CIndex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9012911F104812F90083456D /* CIndex.cpp */; };
 		906BF4B00F83BA2E001071FA /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 906BF4AF0F83BA2E001071FA /* ConvertUTF.c */; };
+		90F9EFAA104ABDED00D09A15 /* c-index-test.c in Sources */ = {isa = PBXBuildFile; fileRef = 90F9EFA9104ABDED00D09A15 /* c-index-test.c */; };
 		90FD6D7B103C3D49005F5B73 /* Analyzer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 90FD6D6D103C3D49005F5B73 /* Analyzer.cpp */; };
 		90FD6D7C103C3D49005F5B73 /* ASTLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 90FD6D6E103C3D49005F5B73 /* ASTLocation.cpp */; };
 		90FD6D7D103C3D49005F5B73 /* DeclReferenceMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 90FD6D70103C3D49005F5B73 /* DeclReferenceMap.cpp */; };
@@ -509,6 +510,7 @@
 		9063F22A0F9E911F002F7251 /* TemplateKinds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TemplateKinds.h; sourceTree = "<group>"; };
 		906BF4AE0F83BA16001071FA /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = "<group>"; };
 		906BF4AF0F83BA2E001071FA /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = "<group>"; };
+		90F9EFA9104ABDED00D09A15 /* c-index-test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "c-index-test.c"; path = "tools/c-index-test/c-index-test.c"; sourceTree = "<group>"; };
 		90FB99DE0F98FB1D008F9415 /* DeclContextInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DeclContextInternals.h; path = clang/AST/DeclContextInternals.h; sourceTree = "<group>"; };
 		90FB99DF0F98FB1D008F9415 /* DeclVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DeclVisitor.h; path = clang/AST/DeclVisitor.h; sourceTree = "<group>"; };
 		90FB99E00F98FB1D008F9415 /* ExternalASTSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExternalASTSource.h; path = clang/AST/ExternalASTSource.h; sourceTree = "<group>"; };
@@ -1042,6 +1044,14 @@
 			name = CIndex;
 			sourceTree = "<group>";
 		};
+		90F9EFA8104ABDC400D09A15 /* c-index-test */ = {
+			isa = PBXGroup;
+			children = (
+				90F9EFA9104ABDED00D09A15 /* c-index-test.c */,
+			);
+			name = "c-index-test";
+			sourceTree = "<group>";
+		};
 		90FD6D5E103C3D03005F5B73 /* Index */ = {
 			isa = PBXGroup;
 			children = (
@@ -1481,6 +1491,7 @@
 		DEDFE61F0F7B3AE10035BD10 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				90F9EFA8104ABDC400D09A15 /* c-index-test */,
 				9012911E104812DA0083456D /* CIndex */,
 				90FD6DB4103D9763005F5B73 /* index-test */,
 				DEDFE6200F7B3AE90035BD10 /* clang-cc */,
@@ -1867,6 +1878,7 @@
 				90FD6DB6103D977E005F5B73 /* index-test.cpp in Sources */,
 				9012911D1048068D0083456D /* ASTUnit.cpp in Sources */,
 				90129121104812F90083456D /* CIndex.cpp in Sources */,
+				90F9EFAA104ABDED00D09A15 /* c-index-test.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

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

==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Sun Aug 30 19:59:03 2009
@@ -37,41 +37,46 @@
 
 typedef void *CXTranslationUnit;  /* A translation unit instance. */
 
-typedef void *CXCursor;  /* An opaque cursor into the CXTranslationUnit. */
+typedef void *CXDecl;    /* A specific declaration within a translation unit. */
 
 /* Cursors represent declarations and references (provides line/column info). */
-enum CXCursorKind {  
- CXCursor_Declaration,
- CXCursor_Reference,
- CXCursor_ObjC_ClassRef,
- CXCursor_ObjC_ProtocolRef,
- CXCursor_ObjC_MessageRef,
- CXCursor_ObjC_SelectorRef
+enum CXCursorKind {
+ CXCursor_Invalid                       = 0,
+ 
+ /* Declarations */
+ CXCursor_FirstDecl                     = 1,
+ CXCursor_TypedefDecl                   = 1,
+ CXCursor_EnumDecl                      = 2,
+ CXCursor_EnumConstantDecl              = 3,
+ CXCursor_RecordDecl                    = 4, /* struct/union/class */
+ CXCursor_FieldDecl                     = 5,
+ CXCursor_FunctionDecl                  = 6,
+ CXCursor_VarDecl                       = 7,
+ CXCursor_ParmDecl                      = 8,
+ CXCursor_ObjCInterfaceDecl             = 9,
+ CXCursor_ObjCCategoryDecl              = 10,
+ CXCursor_ObjCProtocolDecl              = 11,
+ CXCursor_ObjCPropertyDecl              = 12,
+ CXCursor_ObjCIvarDecl                  = 13,
+ CXCursor_ObjCMethodDecl                = 14,
+ CXCursor_LastDecl                      = 14,
+ 
+ /* References */
+ CXCursor_FirstRef                      = 19,
+ CXCursor_ObjCClassRef                  = 19,            
+ CXCursor_ObjCProtocolRef               = 20,
+ CXCursor_ObjCMessageRef                = 21,
+ CXCursor_ObjCSelectorRef               = 22,
+ CXCursor_LastRef                       = 23
 };
 
-typedef void *CXDecl;    /* A specific declaration within a translation unit. */
-
-enum CXDeclKind {  /* The various kinds of declarations. */
- CXDecl_any,
- CXDecl_typedef,
- CXDecl_enum,
- CXDecl_enum_constant,
- CXDecl_record,
- CXDecl_field,
- CXDecl_function,
- CXDecl_variable,
- CXDecl_parameter,
- CXDecl_ObjC_interface,
- CXDecl_ObjC_category,
- CXDecl_ObjC_protocol,
- CXDecl_ObjC_property,
- CXDecl_ObjC_instance_variable,
- CXDecl_ObjC_instance_method,
- CXDecl_ObjC_class_method,
- CXDecl_ObjC_category_implementation,
- CXDecl_ObjC_class_implementation,
- CXDecl_ObjC_property_implementation
-};
+/* A cursor into the CXTranslationUnit. */
+typedef struct {
+  enum CXCursorKind kind;
+  CXDecl decl;
+  
+  /* FIXME: Handle references. */
+} CXCursor;  
 
 /* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */
 typedef void *CXEntity;     
@@ -99,9 +104,8 @@
      clang_loadTranslationUnit(CXTranslationUnit, printObjCInterfaceNames);
    }
 */
-void clang_loadTranslationUnit(
-  CXTranslationUnit, void (*callback)(CXTranslationUnit, CXCursor)
-);
+typedef void (*CXTranslationUnitIterator)(CXTranslationUnit, CXCursor);
+void clang_loadTranslationUnit(CXTranslationUnit, CXTranslationUnitIterator);
 
 /*
    Usage: clang_loadDeclaration(). Will load the declaration, issuing a 
@@ -128,7 +132,9 @@
      }
    }
 */
-void clang_loadDeclaration(CXDecl, void (*callback)(CXDecl, CXCursor));
+typedef void (*CXDeclIterator)(CXTranslationUnit, CXDecl, void *clientData);
+
+void clang_loadDeclaration(CXDecl, CXDeclIterator);
 
 /*
  * CXEntity Operations.
@@ -141,7 +147,6 @@
  */
 CXCursor clang_getCursorFromDecl(CXDecl);
 CXEntity clang_getEntityFromDecl(CXDecl);
-enum CXDeclKind clang_getDeclKind(CXDecl);
 const char *clang_getDeclSpelling(CXDecl);
 /*
  * CXCursor Operations.
@@ -150,10 +155,12 @@
                          unsigned line, unsigned column);
 
 enum CXCursorKind clang_getCursorKind(CXCursor);
+unsigned clang_isDeclaration(enum CXCursorKind);
 
 unsigned clang_getCursorLine(CXCursor);
 unsigned clang_getCursorColumn(CXCursor);
 const char *clang_getCursorSource(CXCursor);
+const char *clang_getKindSpelling(enum CXCursorKind Kind);
 
 /*
  * If CXCursorKind == Cursor_Reference, then this will return the referenced declaration.

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

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Sun Aug 30 19:59:03 2009
@@ -21,6 +21,68 @@
 using namespace clang;
 using namespace idx;
 
+namespace {
+
+// Translation Unit Visitor.
+class TUVisitor : public DeclVisitor<TUVisitor> {
+  CXTranslationUnit TUnit;
+  CXTranslationUnitIterator Callback;
+public:
+  TUVisitor(CXTranslationUnit CTU, CXTranslationUnitIterator cback) : 
+    TUnit(CTU), Callback(cback) {}
+  
+  void VisitTranslationUnitDecl(TranslationUnitDecl *D) {
+    VisitDeclContext(dyn_cast<DeclContext>(D));
+  }
+  void VisitDeclContext(DeclContext *DC) {
+    for (DeclContext::decl_iterator
+           I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I)
+      Visit(*I);
+  }
+  void VisitTypedefDecl(TypedefDecl *ND) {
+    CXCursor C = { CXCursor_TypedefDecl, ND };
+    Callback(TUnit, C);
+  }
+  void VisitTagDecl(TagDecl *ND) {
+    CXCursor C = { ND->isEnum() ? CXCursor_EnumDecl : CXCursor_RecordDecl, ND };
+    Callback(TUnit, C);
+  }
+  void VisitFunctionDecl(FunctionDecl *ND) {
+    CXCursor C = { CXCursor_FunctionDecl, ND };
+    Callback(TUnit, C);
+  }
+  void VisitObjCInterfaceDecl(ObjCInterfaceDecl *ND) {
+    CXCursor C = { CXCursor_ObjCInterfaceDecl, ND };
+    Callback(TUnit, C);
+  }
+  void VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
+    CXCursor C = { CXCursor_ObjCCategoryDecl, ND };
+    Callback(TUnit, C);
+  }
+  void VisitObjCProtocolDecl(ObjCProtocolDecl *ND) {
+    CXCursor C = { CXCursor_ObjCProtocolDecl, ND };
+    Callback(TUnit, C);
+  }
+};
+
+// Top-level declaration visitor.
+class TLDeclVisitor : public DeclVisitor<TLDeclVisitor> {
+public:
+  void VisitDeclContext(DeclContext *DC) {
+    for (DeclContext::decl_iterator
+           I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I)
+      Visit(*I);
+  }
+  void VisitEnumConstantDecl(EnumConstantDecl *ND) {
+  }
+  void VisitFieldDecl(FieldDecl *ND) {
+  }
+  void VisitObjCIvarDecl(ObjCIvarDecl *ND) {
+  }
+};
+
+}
+
 extern "C" {
 
 CXIndex clang_createIndex() 
@@ -40,33 +102,19 @@
   return ASTUnit::LoadFromPCHFile(astName, CXXIdx->getFileManager(), &ErrMsg);
 }
 
-namespace {
-
-class IdxVisitor : public DeclVisitor<IdxVisitor> {
-public:
-  void VisitNamedDecl(NamedDecl *ND) {
-    printf("NamedDecl (%s:", ND->getDeclKindName());
-    if (ND->getIdentifier())
-      printf("%s)\n", ND->getIdentifier()->getName());
-    else
-      printf("<no name>)\n");
-  }
-};
-
-}
 
 void clang_loadTranslationUnit(
-  CXTranslationUnit CTUnit, void (*callback)(CXTranslationUnit, CXCursor))
+  CXTranslationUnit CTUnit, CXTranslationUnitIterator callback)
 {
   assert(CTUnit && "Passed null CXTranslationUnit");
   ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit);
   ASTContext &Ctx = CXXUnit->getASTContext();
   
-  IdxVisitor DVisit;
+  TUVisitor DVisit(CTUnit, callback);
   DVisit.Visit(Ctx.getTranslationUnitDecl());
 }
 
-void clang_loadDeclaration(CXDecl, void (*callback)(CXDecl, CXCursor))
+void clang_loadDeclaration(CXDecl, CXDeclIterator)
 {
 }
 
@@ -106,34 +154,60 @@
 //
 CXCursor clang_getCursorFromDecl(CXDecl)
 {
-  return 0;
+  return CXCursor();
 }
 CXEntity clang_getEntityFromDecl(CXDecl)
 {
   return 0;
 }
-enum CXDeclKind clang_getDeclKind(CXDecl)
-{
-  return CXDecl_any;
-}
-const char *clang_getDeclSpelling(CXDecl)
+const char *clang_getDeclSpelling(CXDecl AnonDecl)
 {
-  return "";
+  assert(AnonDecl && "Passed null CXDecl");
+  NamedDecl *ND = static_cast<NamedDecl *>(AnonDecl);
+  if (ND->getIdentifier())
+    return ND->getIdentifier()->getName();
+  else
+    return "";
+}
+const char *clang_getKindSpelling(enum CXCursorKind Kind)
+{
+  switch (Kind) {
+   case CXCursor_FunctionDecl: return "FunctionDecl";
+   case CXCursor_TypedefDecl: return "TypedefDecl";
+   case CXCursor_EnumDecl: return "EnumDecl";
+   case CXCursor_EnumConstantDecl: return "EnumConstantDecl";
+   case CXCursor_RecordDecl: return "RecordDecl";
+   case CXCursor_FieldDecl: return "FieldDecl";
+   case CXCursor_VarDecl: return "VarDecl";
+   case CXCursor_ParmDecl: return "ParmDecl";
+   case CXCursor_ObjCInterfaceDecl: return "ObjCInterfaceDecl";
+   case CXCursor_ObjCCategoryDecl: return "ObjCCategoryDecl";
+   case CXCursor_ObjCProtocolDecl: return "ObjCProtocolDecl";
+   case CXCursor_ObjCPropertyDecl: return "ObjCPropertyDecl";
+   case CXCursor_ObjCIvarDecl: return "ObjCIvarDecl";
+   case CXCursor_ObjCMethodDecl: return "ObjCMethodDecl";
+   default: return "<not implemented>";
+  }
 }
+
 //
 // CXCursor Operations.
 //
 CXCursor clang_getCursor(CXTranslationUnit, const char *source_name, 
                          unsigned line, unsigned column)
 {
-  return 0;
+  return CXCursor();
 }
 
 CXCursorKind clang_getCursorKind(CXCursor)
 {
-  return CXCursor_Declaration;
+  return CXCursor_Invalid;
 }
 
+unsigned clang_isDeclaration(enum CXCursorKind K)
+{
+  return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;
+}
 unsigned clang_getCursorLine(CXCursor)
 {
   return 0;

Modified: cfe/trunk/tools/CIndex/CIndex.exports
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.exports?rev=80529&r1=80528&r2=80529&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.exports (original)
+++ cfe/trunk/tools/CIndex/CIndex.exports Sun Aug 30 19:59:03 2009
@@ -7,7 +7,6 @@
 _clang_getCursorLine
 _clang_getCursorSource
 _clang_getDeclarationName
-_clang_getDeclKind
 _clang_getDeclSpelling
 _clang_getEntity
 _clang_getEntityFromDecl
@@ -15,3 +14,5 @@
 _clang_loadDeclaration
 _clang_loadTranslationUnit
 _clang_createTranslationUnit
+_clang_isDeclaration
+_clang_getKindSpelling

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=80529&r1=80528&r2=80529&view=diff

==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Sun Aug 30 19:59:03 2009
@@ -1,5 +1,12 @@
 
 #include "clang-c/Index.h"
+#include <stdio.h>
+
+static void PrintDecls(CXTranslationUnit Unit, CXCursor Cursor) {
+ if (clang_isDeclaration(Cursor.kind))
+   printf("%s => %s\n", clang_getKindSpelling(Cursor.kind),
+                        clang_getDeclSpelling(Cursor.decl));
+}
 
 /*
  * First sign of life:-)
@@ -7,6 +14,6 @@
 int main(int argc, char **argv) {
   CXIndex Idx = clang_createIndex();
   CXTranslationUnit TU = clang_createTranslationUnit(Idx, argv[1]);
-  clang_loadTranslationUnit(TU, 0);
+  clang_loadTranslationUnit(TU, PrintDecls);
   return 1;
 }





More information about the cfe-commits mailing list