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
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 38b58e0..bd39925 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -410,7 +410,20 @@
= *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) {