aboutsummaryrefslogtreecommitdiff
path: root/tools/libclang/CIndex.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-12-21 19:07:48 +0000
committerDouglas Gregor <dgregor@apple.com>2010-12-21 19:07:48 +0000
commit32038bb8486a1f31e8bd8e19ef388049669e9ed2 (patch)
treee1dcb49741a62a51d203767635aad12096b4d75c /tools/libclang/CIndex.cpp
parent52e64c88133c6c3153208f216d53112db5c09e8b (diff)
When determining which preprocessed entities to traverse in libclang,
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
Diffstat (limited to 'tools/libclang/CIndex.cpp')
-rw-r--r--tools/libclang/CIndex.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 38b58e0068..bd39925dad 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -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) {