]> granicus.if.org Git - clang/commitdiff
Start issuing callback for references (add some predicates, refactor some code).
authorSteve Naroff <snaroff@apple.com>
Wed, 2 Sep 2009 18:26:48 +0000 (18:26 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 2 Sep 2009 18:26:48 +0000 (18:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80810 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
tools/CIndex/CIndex.cpp
tools/CIndex/CIndex.exports
tools/c-index-test/c-index-test.c

index 0b605d512ed946787258111736b2603736456fa0..9efa791e89f2d75b61b3493bf1089ef65a5a06eb 100644 (file)
@@ -71,11 +71,11 @@ enum CXCursorKind {
    
  /* References */
  CXCursor_FirstRef                      = 40,
- CXCursor_ObjCClassRef                  = 41,            
- CXCursor_ObjCProtocolRef               = 42,
- CXCursor_ObjCMessageRef                = 43,
- CXCursor_ObjCSelectorRef               = 44,
- CXCursor_LastRef                       = 44
+ CXCursor_ObjCSuperClassRef             = 40,            
+ CXCursor_ObjCProtocolRef               = 41,
+ CXCursor_ObjCMessageRef                = 42,
+ CXCursor_ObjCSelectorRef               = 43,
+ CXCursor_LastRef                       = 43
 };
 
 /* A cursor into the CXTranslationUnit. */
@@ -167,11 +167,15 @@ CXCursor clang_getCursor(CXTranslationUnit, const char *source_name,
 
 enum CXCursorKind clang_getCursorKind(CXCursor);
 unsigned clang_isDeclaration(enum CXCursorKind);
+unsigned clang_isReference(enum CXCursorKind);
+unsigned clang_isDefinition(enum CXCursorKind);
 
 unsigned clang_getCursorLine(CXCursor);
 unsigned clang_getCursorColumn(CXCursor);
 const char *clang_getCursorSource(CXCursor);
-const char *clang_getKindSpelling(enum CXCursorKind Kind);
+const char *clang_getCursorSpelling(CXCursor);
+
+const char *clang_getCursorKindSpelling(enum CXCursorKind Kind); /* for debug */
 
 /*
  * If CXCursorKind == Cursor_Reference, then this will return the referenced declaration.
index 5242de2360f6fe1f61a8570e77de3df2d462b824..f2af27cd65a7b8abec1c707106c443e58c06c9b2 100644 (file)
@@ -103,6 +103,10 @@ public:
     CDecl(C), Callback(cback), CData(D) {}
     
   void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
+    // Issue callbacks for super class and protocols.
+    if (D->getSuperClass())
+      Call(CXCursor_ObjCSuperClassRef, D);
+
     VisitDeclContext(dyn_cast<DeclContext>(D));
   }
   void VisitTagDecl(TagDecl *D) {
@@ -241,7 +245,26 @@ const char *clang_getDeclSpelling(CXDecl AnonDecl)
   else 
     return "";
 }
-const char *clang_getKindSpelling(enum CXCursorKind Kind)
+
+const char *clang_getCursorSpelling(CXCursor C)
+{
+  assert(C.decl && "CXCursor has null decl");
+  NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
+  
+  if (clang_isReference(C.kind)) {
+    switch (C.kind) {
+      case CXCursor_ObjCSuperClassRef:
+        ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(ND);
+        assert(OID && "clang_getCursorLine(): Missing interface decl");
+        return OID->getSuperClass()->getIdentifier()->getName();
+      default:
+        return "<not implemented>";
+    }
+  }
+  return clang_getDeclSpelling(C.decl);
+}
+
+const char *clang_getCursorKindSpelling(enum CXCursorKind Kind)
 {
   switch (Kind) {
    case CXCursor_FunctionDecl: return "FunctionDecl";
@@ -266,6 +289,7 @@ const char *clang_getKindSpelling(enum CXCursorKind Kind)
    case CXCursor_ObjCClassMethodDefn: return "ObjCClassMethodDefn";
    case CXCursor_ObjCClassDefn: return "ObjCClassDefn";
    case CXCursor_ObjCCategoryDefn: return "ObjCCategoryDefn";
+   case CXCursor_ObjCSuperClassRef: return "ObjCSuperClassRef";
    default: return "<not implemented>";
   }
 }
@@ -289,37 +313,65 @@ unsigned clang_isDeclaration(enum CXCursorKind K)
   return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;
 }
 
+unsigned clang_isReference(enum CXCursorKind K)
+{
+  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
+}
+
+unsigned clang_isDefinition(enum CXCursorKind K)
+{
+  return K >= CXCursor_FirstDefn && K <= CXCursor_LastDefn;
+}
+
+static SourceLocation getLocationFromCursor(CXCursor C, 
+                                            SourceManager &SourceMgr,
+                                            NamedDecl *ND) {
+  SourceLocation SLoc;
+  if (clang_isReference(C.kind)) {
+    switch (C.kind) {
+      case CXCursor_ObjCSuperClassRef:
+        ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(ND);
+        assert(OID && "clang_getCursorLine(): Missing interface decl");
+        SLoc = OID->getSuperClassLoc();
+        break;
+      default:
+        break;
+    }
+  } else { // We have a declaration or a definition.
+    SLoc = ND->getLocation();
+    if (SLoc.isInvalid())
+      return SourceLocation();
+    SLoc = SourceMgr.getSpellingLoc(SLoc); // handles macro instantiations.
+  }
+  return SLoc;
+}
+
 unsigned clang_getCursorLine(CXCursor C)
 {
   assert(C.decl && "CXCursor has null decl");
   NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
-  SourceLocation SLoc = ND->getLocation();
-  if (SLoc.isInvalid())
-    return 0;
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
-  SLoc = SourceMgr.getSpellingLoc(SLoc); // handles macro instantiations.
+  
+  SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
   return SourceMgr.getSpellingLineNumber(SLoc);
 }
+
 unsigned clang_getCursorColumn(CXCursor C)
 {
   assert(C.decl && "CXCursor has null decl");
   NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
-  SourceLocation SLoc = ND->getLocation();
-  if (SLoc.isInvalid())
-    return 0;
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
-  SLoc = SourceMgr.getSpellingLoc(SLoc); // handles macro instantiations.
+  
+  SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
   return SourceMgr.getSpellingColumnNumber(SLoc);
 }
 const char *clang_getCursorSource(CXCursor C) 
 {
   assert(C.decl && "CXCursor has null decl");
   NamedDecl *ND = static_cast<NamedDecl *>(C.decl);
-  SourceLocation SLoc = ND->getLocation();
-  if (SLoc.isInvalid())
-    return "<invalid source location>";
   SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
-  SLoc = SourceMgr.getSpellingLoc(SLoc); // handles macro instantiations.
+  
+  SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
   return SourceMgr.getBufferName(SLoc);
 }
 
index ac18cc8e3259378221df1c5a00243cee4b8a102b..3f87a82b3a14fca0ca1586dc397a6ab477da30d5 100644 (file)
@@ -15,4 +15,7 @@ _clang_loadDeclaration
 _clang_loadTranslationUnit
 _clang_createTranslationUnit
 _clang_isDeclaration
-_clang_getKindSpelling
+_clang_isReference
+_clang_isDefinition
+_clang_getCursorSpelling
+_clang_getCursorKindSpelling
index d96468f8c4572d56a6ed3af0b702fcc6369013ef..20511ec80158dcd64cb3313151e1c2c28ab140e4 100644 (file)
@@ -6,8 +6,8 @@
 static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter) 
 {
   if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) {
-    printf("%s => %s", clang_getKindSpelling(Cursor.kind),
-                       clang_getDeclSpelling(Cursor.decl));
+    printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind),
+                       clang_getCursorSpelling(Cursor));
     printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor),
                             clang_getCursorLine(Cursor),
                             clang_getCursorColumn(Cursor));
@@ -17,8 +17,8 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor,
                                    CXClientData Filter) 
 {
   if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) {
-    printf("%s => %s", clang_getKindSpelling(Cursor.kind),
-                       clang_getDeclSpelling(Cursor.decl));
+    printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind),
+                       clang_getCursorSpelling(Cursor));
     printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor),
                             clang_getCursorLine(Cursor),
                             clang_getCursorColumn(Cursor));