From: Steve Naroff Date: Mon, 31 Aug 2009 14:26:51 +0000 (+0000) Subject: Implement source/line/column hooks. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d4d629d8a0de5112c7ae9d05c03ddbf6dcd956a;p=clang Implement source/line/column hooks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80585 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 2af3fee774..de2b5d6898 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -25,7 +25,7 @@ extern "C" { clangs PCH file (which contains AST's, or Abstract Syntax Trees). PCH files are created by the following command: - "clang -emit-pch -o ". + "clang -S -Xclang -emit-pch -o ". If the ast file format ends up diverging from the pch file format, we will need to add a new switch (-emit-ast). For now, the contents are identical. diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 9ef51b9db9..f8d223a510 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -16,6 +16,7 @@ #include "clang/Index/Indexer.h" #include "clang/AST/DeclVisitor.h" #include "clang/Basic/FileManager.h" +#include "clang/Basic/SourceManager.h" #include "clang/Frontend/ASTUnit.h" #include using namespace clang; @@ -208,17 +209,39 @@ unsigned clang_isDeclaration(enum CXCursorKind K) { return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl; } -unsigned clang_getCursorLine(CXCursor) -{ - return 0; -} -unsigned clang_getCursorColumn(CXCursor) -{ - return 0; -} -const char *clang_getCursorSource(CXCursor) -{ - return ""; + +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. + 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. + 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. + return SourceMgr.getBufferName(SLoc); } // If CXCursorKind == Cursor_Reference, then this will return the referenced declaration. diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 3126b319ef..1ef8e924bc 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -3,9 +3,13 @@ #include static void PrintDecls(CXTranslationUnit Unit, CXCursor Cursor) { - if (clang_isDeclaration(Cursor.kind)) - printf("%s => %s\n", clang_getKindSpelling(Cursor.kind), - clang_getDeclSpelling(Cursor.decl)); + if (clang_isDeclaration(Cursor.kind)) { + printf("%s => %s", clang_getKindSpelling(Cursor.kind), + clang_getDeclSpelling(Cursor.decl)); + printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), + clang_getCursorLine(Cursor), + clang_getCursorColumn(Cursor)); + } } /*