summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang-c/Index.h21
-rw-r--r--clang/tools/CIndex/CIndex.cpp17
-rw-r--r--clang/tools/CIndex/CIndex.exports2
-rw-r--r--clang/tools/c-index-test/c-index-test.c8
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) {
OpenPOWER on IntegriCloud