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
This commit is contained in:
Douglas Gregor 2010-12-21 19:07:48 +00:00
parent 52e64c8813
commit 32038bb848
4 changed files with 29 additions and 1 deletions

View File

@ -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

View File

@ -0,0 +1,2 @@
#include "get-cursor-includes-1.h"
#include "get-cursor-includes-1.h"

View File

@ -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

View 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) {