]> granicus.if.org Git - clang/commitdiff
[libclang] Refactor the important stuff in clang_getCursor into a cxcursor::getCursor...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 27 Sep 2011 00:30:33 +0000 (00:30 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 27 Sep 2011 00:30:33 +0000 (00:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140588 91177308-0d34-0410-b5e6-96231b3b80d8

tools/libclang/CIndex.cpp
tools/libclang/CXCursor.h

index e183de137079d69aa7d91cdf652f1faa146de9fb..f71f1530558e7c60f6949a9f35c29ac54ae3191c 100644 (file)
@@ -3489,32 +3489,10 @@ CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
   ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
   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);
-
-  // Guard against an invalid SourceLocation, or we may assert in one
-  // of the following calls.
-  if (SLoc.isInvalid())
-    return clang_getNullCursor();
+  CXCursor Result = cxcursor::getCursor(TU, SLoc);
 
   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) {
     CXFile SearchFile;
     unsigned SearchLine, SearchColumn;
@@ -3749,6 +3727,37 @@ CXSourceLocation clang_getCursorLocation(CXCursor 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) {
   if (clang_isReference(C.kind)) {
     switch (C.kind) {
index 68d09e76c1c079bfeec725d631c7ecda08c75bb0..c7051ea2f987baadf323a9cfea9eecaa01bdacf0 100644 (file)
@@ -43,6 +43,8 @@ class TemplateName;
 class TypeDecl;
   
 namespace cxcursor {
+
+CXCursor getCursor(CXTranslationUnit, SourceLocation);
   
 CXCursor MakeCXCursor(const clang::Attr *A, clang::Decl *Parent,
                       CXTranslationUnit TU);