Split clang_getCursor() into clang_getCursor() and clang_getCursorWithHint().

llvm-svn: 84873
This commit is contained in:
Ted Kremenek 2009-10-22 17:22:53 +00:00
parent 8de31d0e80
commit a96b72a4ca
4 changed files with 39 additions and 9 deletions

View File

@ -251,13 +251,24 @@ const char *clang_getDeclSource(CXDecl);
/**
Usage: clang_getCursor() will translate a source/line/column position
into an AST cursor (to derive semantic information from the source code).
If 'RelativeToDecl' is NULL, the entire translation unit will be searched.
Note that searching the entire translation unit can be slow.
Otherwise, the "search" for the AST cursor will start at 'RelativeToDecl'.
*/
CXCursor clang_getCursor(CXTranslationUnit, const char *source_name,
unsigned line, unsigned column,
CXDecl RelativeToDecl);
unsigned line, unsigned column);
/**
Usage: clang_getCursorWithHint() provides the same functionality as
clang_getCursor() except that it takes an option 'hint' argument.
The 'hint' is a temporary CXLookupHint object (whose lifetime is managed by
the caller) that should be initialized with clang_initCXLookupHint().
FIXME: Add a better comment once getCursorWithHint() has more functionality.
*/
typedef CXCursor CXLookupHint;
CXCursor clang_getCursorWithHint(CXTranslationUnit, const char *source_name,
unsigned line, unsigned column,
CXLookupHint *hint);
void clang_initCXLookupHint(CXLookupHint *hint);
enum CXCursorKind clang_getCursorKind(CXCursor);
unsigned clang_isDeclaration(enum CXCursorKind);

View File

@ -695,13 +695,26 @@ static enum CXCursorKind TranslateKind(Decl *D) {
//
// CXCursor Operations.
//
void clang_initCXLookupHint(CXLookupHint *hint) {
memset(hint, 0, sizeof(*hint));
}
CXCursor clang_getCursor(CXTranslationUnit CTUnit, const char *source_name,
unsigned line, unsigned column,
CXDecl RelativeToDecl)
unsigned line, unsigned column) {
return clang_getCursorWithHint(CTUnit, source_name, line, column, NULL);
}
CXCursor clang_getCursorWithHint(CXTranslationUnit CTUnit,
const char *source_name,
unsigned line, unsigned column,
CXLookupHint *hint)
{
assert(CTUnit && "Passed null CXTranslationUnit");
ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit);
// FIXME: Make this better.
CXDecl RelativeToDecl = hint ? hint->decl : NULL;
FileManager &FMgr = CXXUnit->getFileManager();
const FileEntry *File = FMgr.getFile(source_name,
source_name+strlen(source_name));

View File

@ -7,6 +7,7 @@ _clang_getCursorFromDecl
_clang_getCursorKind
_clang_getCursorLine
_clang_getCursorSource
_clang_getCursorWithHint
_clang_getDeclarationName
_clang_getDeclSpelling
_clang_getDeclLine
@ -20,6 +21,7 @@ _clang_loadTranslationUnit
_clang_createTranslationUnit
_clang_createTranslationUnitFromSourceFile
_clang_disposeTranslationUnit
_clang_initCXLookupHint
_clang_isDeclaration
_clang_isReference
_clang_isDefinition

View File

@ -61,8 +61,12 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor,
} else if (*startBuf != '\t')
curColumn++;
Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor),
curLine, curColumn, Cursor.decl);
CXLookupHint hint;
clang_initCXLookupHint(&hint);
hint.decl = Cursor.decl;
Ref = clang_getCursorWithHint(Unit, clang_getCursorSource(Cursor),
curLine, curColumn, &hint);
if (Ref.kind == CXCursor_NoDeclFound) {
/* Nothing found here; that's fine. */
} else if (Ref.kind != CXCursor_FunctionDecl) {