From f334b4e3eda5a39f041fe13f805dbb53535daa2f Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Wed, 2 Sep 2009 18:26:48 +0000 Subject: [PATCH] Start issuing callback for references (add some predicates, refactor some code). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80810 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang-c/Index.h | 16 ++++--- tools/CIndex/CIndex.cpp | 78 +++++++++++++++++++++++++------ tools/CIndex/CIndex.exports | 5 +- tools/c-index-test/c-index-test.c | 8 ++-- 4 files changed, 83 insertions(+), 24 deletions(-) diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 0b605d512e..9efa791e89 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -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. diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 5242de2360..f2af27cd65 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -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(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(C.decl); + + if (clang_isReference(C.kind)) { + switch (C.kind) { + case CXCursor_ObjCSuperClassRef: + ObjCInterfaceDecl *OID = dyn_cast(ND); + assert(OID && "clang_getCursorLine(): Missing interface decl"); + return OID->getSuperClass()->getIdentifier()->getName(); + default: + return ""; + } + } + 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 ""; } } @@ -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(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(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(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(C.decl); - SourceLocation SLoc = ND->getLocation(); - if (SLoc.isInvalid()) - return ""; SourceManager &SourceMgr = ND->getASTContext().getSourceManager(); - SLoc = SourceMgr.getSpellingLoc(SLoc); // handles macro instantiations. + + SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND); return SourceMgr.getBufferName(SLoc); } diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports index ac18cc8e32..3f87a82b3a 100644 --- a/tools/CIndex/CIndex.exports +++ b/tools/CIndex/CIndex.exports @@ -15,4 +15,7 @@ _clang_loadDeclaration _clang_loadTranslationUnit _clang_createTranslationUnit _clang_isDeclaration -_clang_getKindSpelling +_clang_isReference +_clang_isDefinition +_clang_getCursorSpelling +_clang_getCursorKindSpelling diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index d96468f8c4..20511ec801 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -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)); -- 2.50.1