diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/CIndex/CIndex.cpp | 25 | ||||
-rw-r--r-- | tools/CIndex/CIndex.exports | 1 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 26 |
3 files changed, 39 insertions, 13 deletions
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 82f7fb8e2b..a0b49c4169 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -67,6 +67,9 @@ public: break; } } + void VisitVarDecl(VarDecl *ND) { + Call(CXCursor_VarDecl, ND); + } void VisitFunctionDecl(FunctionDecl *ND) { Call(ND->isThisDeclarationADefinition() ? CXCursor_FunctionDefn : CXCursor_FunctionDecl, ND); @@ -95,6 +98,9 @@ class CDeclVisitor : public DeclVisitor<CDeclVisitor> { CXClientData CData; void Call(enum CXCursorKind CK, NamedDecl *ND) { + // Disable the callback when the context is equal to the visiting decl. + if (CDecl == ND) + return; CXCursor C = { CK, ND }; Callback(CDecl, C, CData); } @@ -129,17 +135,28 @@ public: void VisitFieldDecl(FieldDecl *ND) { Call(CXCursor_FieldDecl, ND); } + void VisitVarDecl(VarDecl *ND) { + Call(CXCursor_VarDecl, ND); + } + void VisitParmVarDecl(ParmVarDecl *ND) { + Call(CXCursor_ParmDecl, ND); + } void VisitObjCPropertyDecl(ObjCPropertyDecl *ND) { Call(CXCursor_ObjCPropertyDecl, ND); } void VisitObjCIvarDecl(ObjCIvarDecl *ND) { Call(CXCursor_ObjCIvarDecl, ND); } + void VisitFunctionDecl(FunctionDecl *ND) { + if (ND->isThisDeclarationADefinition()) { + VisitDeclContext(dyn_cast<DeclContext>(ND)); + } + } void VisitObjCMethodDecl(ObjCMethodDecl *ND) { if (ND->getBody()) { Call(ND->isInstanceMethod() ? CXCursor_ObjCInstanceMethodDefn : CXCursor_ObjCClassMethodDefn, ND); - // FIXME: load body. + VisitDeclContext(dyn_cast<DeclContext>(ND)); } else Call(ND->isInstanceMethod() ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl, ND); @@ -167,6 +184,12 @@ CXTranslationUnit clang_createTranslationUnit( return ASTUnit::LoadFromPCHFile(astName, CXXIdx->getFileManager(), &ErrMsg); } +const char *clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) +{ + assert(CTUnit && "Passed null CXTranslationUnit"); + ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit); + return CXXUnit->getOriginalSourceFileName().c_str(); +} void clang_loadTranslationUnit(CXTranslationUnit CTUnit, CXTranslationUnitIterator callback, diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports index 3f87a82b3a..7c9660b4d0 100644 --- a/tools/CIndex/CIndex.exports +++ b/tools/CIndex/CIndex.exports @@ -19,3 +19,4 @@ _clang_isReference _clang_isDefinition _clang_getCursorSpelling _clang_getCursorKindSpelling +_clang_getTranslationUnitSpelling diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 2d2be158d0..8df2fc261d 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -3,25 +3,27 @@ #include "clang-c/Index.h" #include <stdio.h> +static void PrintCursor(CXCursor Cursor) { + printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), + clang_getCursorSpelling(Cursor)); + printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), + clang_getCursorLine(Cursor), + clang_getCursorColumn(Cursor)); +} + static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter) { - if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { - printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), - clang_getCursorSpelling(Cursor)); - printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), - clang_getCursorLine(Cursor), - clang_getCursorColumn(Cursor)); - } + printf("%s: ", clang_getDeclSpelling(Dcl)); + if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) + PrintCursor(Cursor); } + static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor, CXClientData Filter) { + printf("%s: ", clang_getTranslationUnitSpelling(Unit)); if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { - printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), - clang_getCursorSpelling(Cursor)); - printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), - clang_getCursorLine(Cursor), - clang_getCursorColumn(Cursor)); + PrintCursor(Cursor); clang_loadDeclaration(Cursor.decl, DeclVisitor, 0); } |