[libclang] Refactor the important stuff in clang_getCursor into a cxcursor::getCursor(CXTranslationUnit, SourceLocation) function.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140588 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2011-09-27 00:30:33 +00:00
Родитель b0d6eaa6b6
Коммит 671436e9e2
2 изменённых файлов: 34 добавлений и 23 удалений

Просмотреть файл

@ -3489,32 +3489,10 @@ CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
ASTUnit::ConcurrencyCheck Check(*CXXUnit); ASTUnit::ConcurrencyCheck Check(*CXXUnit);
// Translate the given source location to make it point at the beginning of
// the token under the cursor.
SourceLocation SLoc = cxloc::translateSourceLocation(Loc); SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
CXCursor Result = cxcursor::getCursor(TU, SLoc);
// Guard against an invalid SourceLocation, or we may assert in one
// of the following calls.
if (SLoc.isInvalid())
return clang_getNullCursor();
bool Logging = getenv("LIBCLANG_LOGGING"); bool Logging = getenv("LIBCLANG_LOGGING");
SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
CXXUnit->getASTContext().getLangOptions());
CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
if (SLoc.isValid()) {
// FIXME: Would be great to have a "hint" cursor, then walk from that
// hint cursor upward until we find a cursor whose source range encloses
// the region of interest, rather than starting from the translation unit.
GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
CXCursor Parent = clang_getTranslationUnitCursor(TU);
CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
/*VisitPreprocessorLast=*/true,
SourceLocation(SLoc));
CursorVis.VisitChildren(Parent);
}
if (Logging) { if (Logging) {
CXFile SearchFile; CXFile SearchFile;
unsigned SearchLine, SearchColumn; unsigned SearchLine, SearchColumn;
@ -3749,6 +3727,37 @@ CXSourceLocation clang_getCursorLocation(CXCursor C) {
} // end extern "C" } // end extern "C"
CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
assert(TU);
// Guard against an invalid SourceLocation, or we may assert in one
// of the following calls.
if (SLoc.isInvalid())
return clang_getNullCursor();
ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
// Translate the given source location to make it point at the beginning of
// the token under the cursor.
SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
CXXUnit->getASTContext().getLangOptions());
CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
if (SLoc.isValid()) {
// FIXME: Would be great to have a "hint" cursor, then walk from that
// hint cursor upward until we find a cursor whose source range encloses
// the region of interest, rather than starting from the translation unit.
GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
CXCursor Parent = clang_getTranslationUnitCursor(TU);
CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
/*VisitPreprocessorLast=*/true,
SourceLocation(SLoc));
CursorVis.VisitChildren(Parent);
}
return Result;
}
static SourceRange getRawCursorExtent(CXCursor C) { static SourceRange getRawCursorExtent(CXCursor C) {
if (clang_isReference(C.kind)) { if (clang_isReference(C.kind)) {
switch (C.kind) { switch (C.kind) {

Просмотреть файл

@ -44,6 +44,8 @@ class TypeDecl;
namespace cxcursor { namespace cxcursor {
CXCursor getCursor(CXTranslationUnit, SourceLocation);
CXCursor MakeCXCursor(const clang::Attr *A, clang::Decl *Parent, CXCursor MakeCXCursor(const clang::Attr *A, clang::Decl *Parent,
CXTranslationUnit TU); CXTranslationUnit TU);
CXCursor MakeCXCursor(clang::Decl *D, CXTranslationUnit TU, CXCursor MakeCXCursor(clang::Decl *D, CXTranslationUnit TU,