From: Ted Kremenek Date: Thu, 22 Oct 2009 17:22:53 +0000 (+0000) Subject: Split clang_getCursor() into clang_getCursor() and clang_getCursorWithHint(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fbcb2b716bee88c754684bd189913ed9f8c09086;p=clang Split clang_getCursor() into clang_getCursor() and clang_getCursorWithHint(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 644b2e2941..44cbe0efff 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -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); diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index e6e63b8ef1..cbc3085a27 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -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(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)); diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports index ea647b46a6..e9d44a0dc9 100644 --- a/tools/CIndex/CIndex.exports +++ b/tools/CIndex/CIndex.exports @@ -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 diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index b458216f70..5cbc2fae53 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -60,9 +60,13 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor, curColumn = 1; } else if (*startBuf != '\t') curColumn++; + + CXLookupHint hint; + clang_initCXLookupHint(&hint); + hint.decl = Cursor.decl; - Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor), - curLine, curColumn, 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) {