Implement source/line/column hooks.

llvm-svn: 80585
This commit is contained in:
Steve Naroff 2009-08-31 14:26:51 +00:00
parent 3c62f5095a
commit 772c1a4574
3 changed files with 37 additions and 10 deletions

View File

@ -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 <sourcefile.langsuffix> -o <sourcefile.ast>".
"clang -S -Xclang -emit-pch <sourcefile.langsuffix> -o <sourcefile.ast>".
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.

View File

@ -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 <cstdio>
using namespace clang;
@ -208,17 +209,39 @@ unsigned clang_isDeclaration(enum CXCursorKind K)
{
return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;
}
unsigned clang_getCursorLine(CXCursor)
unsigned clang_getCursorLine(CXCursor C)
{
return 0;
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.
return SourceMgr.getSpellingLineNumber(SLoc);
}
unsigned clang_getCursorColumn(CXCursor)
unsigned clang_getCursorColumn(CXCursor C)
{
return 0;
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.
return SourceMgr.getSpellingColumnNumber(SLoc);
}
const char *clang_getCursorSource(CXCursor)
const char *clang_getCursorSource(CXCursor C)
{
return "";
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.
return SourceMgr.getBufferName(SLoc);
}
// If CXCursorKind == Cursor_Reference, then this will return the referenced declaration.

View File

@ -3,9 +3,13 @@
#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));
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));
}
}
/*