]> granicus.if.org Git - clang/commitdiff
When determining which preprocessed entities to traverse in libclang,
authorDouglas Gregor <dgregor@apple.com>
Tue, 21 Dec 2010 19:07:48 +0000 (19:07 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 21 Dec 2010 19:07:48 +0000 (19:07 +0000)
take into account the region of interest. Otherwise, we may fail to
traverse some important preprocessed entity cursors.
Fixes <rdar://problem/8554072>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122350 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/Inputs/get-cursor-includes-1.h [new file with mode: 0644]
test/Index/Inputs/get-cursor-includes-2.h [new file with mode: 0644]
test/Index/get-cursor-includes.c [new file with mode: 0644]
tools/libclang/CIndex.cpp

diff --git a/test/Index/Inputs/get-cursor-includes-1.h b/test/Index/Inputs/get-cursor-includes-1.h
new file mode 100644 (file)
index 0000000..48439d2
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef GET_CURSOR_INCLUDES_1_H
+#define GET_CURSOR_INCLUDES_1_H
+
+extern int blah;
+
+#endif // GET_CURSOR_INCLUDES_1_H
diff --git a/test/Index/Inputs/get-cursor-includes-2.h b/test/Index/Inputs/get-cursor-includes-2.h
new file mode 100644 (file)
index 0000000..cf95c18
--- /dev/null
@@ -0,0 +1,2 @@
+#include "get-cursor-includes-1.h"
+#include "get-cursor-includes-1.h"
diff --git a/test/Index/get-cursor-includes.c b/test/Index/get-cursor-includes.c
new file mode 100644 (file)
index 0000000..68d64f1
--- /dev/null
@@ -0,0 +1,7 @@
+#include "get-cursor-includes-2.h"
+#include "get-cursor-includes-2.h"
+
+// RUN: c-index-test -write-pch %t.h.pch -I%S/Inputs -Xclang -detailed-preprocessing-record %S/Inputs/get-cursor-includes-2.h
+// RUN: c-index-test -cursor-at=%S/Inputs/get-cursor-includes-2.h:1:5 -I%S/Inputs -include %t.h %s | FileCheck %s
+
+// CHECK: inclusion directive=get-cursor-includes-1.h
index 38b58e0068eefae2920903be5a30fa6424c3edc4..bd39925dadef259973ce3f6ec921b2e2397d7c78 100644 (file)
@@ -410,7 +410,20 @@ CursorVisitor::getPreprocessedEntities() {
     = *AU->getPreprocessor().getPreprocessingRecord();
   
   bool OnlyLocalDecls
-    = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
+    = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); 
+  
+  if (OnlyLocalDecls && RegionOfInterest.isValid()) {
+    // If we would only look at local declarations but we have a region of 
+    // interest, check whether that region of interest is in the main file.
+    // If not, we should traverse all declarations.
+    // FIXME: My kingdom for a proper binary search approach to finding
+    // cursors!
+    std::pair<FileID, unsigned> Location
+      = AU->getSourceManager().getDecomposedInstantiationLoc(
+                                                   RegionOfInterest.getBegin());
+    if (Location.first != AU->getSourceManager().getMainFileID())
+      OnlyLocalDecls = false;
+  }
   
   PreprocessingRecord::iterator StartEntity, EndEntity;
   if (OnlyLocalDecls) {