diff options
-rw-r--r-- | clang/include/clang-c/Index.h | 21 | ||||
-rw-r--r-- | clang/tools/CIndex/CIndex.cpp | 17 | ||||
-rw-r--r-- | clang/tools/CIndex/CIndex.exports | 2 | ||||
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 8 |
4 files changed, 39 insertions, 9 deletions
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 644b2e29412..44cbe0efff8 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/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/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index e6e63b8ef18..cbc3085a27e 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/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<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)); diff --git a/clang/tools/CIndex/CIndex.exports b/clang/tools/CIndex/CIndex.exports index ea647b46a62..e9d44a0dc91 100644 --- a/clang/tools/CIndex/CIndex.exports +++ b/clang/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/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index b458216f70d..5cbc2fae53f 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/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) { |