зеркало из https://github.com/microsoft/clang.git
[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:
Родитель
b0d6eaa6b6
Коммит
671436e9e2
|
@ -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,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче