/**
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);
//
// 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));
_clang_getCursorKind
_clang_getCursorLine
_clang_getCursorSource
+_clang_getCursorWithHint
_clang_getDeclarationName
_clang_getDeclSpelling
_clang_getDeclLine
_clang_createTranslationUnit
_clang_createTranslationUnitFromSourceFile
_clang_disposeTranslationUnit
+_clang_initCXLookupHint
_clang_isDeclaration
_clang_isReference
_clang_isDefinition
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) {