[libclang] When indexing, invoke the importedASTFile for PCH files as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165161 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2012-10-03 21:05:51 +00:00
Родитель 37f2f52fbc
Коммит 3da76bfbd2
5 изменённых файлов: 66 добавлений и 1 удалений

Просмотреть файл

@ -623,6 +623,9 @@ public:
/// \returns true if the iteration was complete or false if it was aborted. /// \returns true if the iteration was complete or false if it was aborted.
bool visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn); bool visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn);
/// \brief Get the PCH file if one was included.
const FileEntry *getPCHFile();
llvm::MemoryBuffer *getBufferForFile(StringRef Filename, llvm::MemoryBuffer *getBufferForFile(StringRef Filename,
std::string *ErrorStr = 0); std::string *ErrorStr = 0);

Просмотреть файл

@ -2816,6 +2816,42 @@ bool ASTUnit::visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn) {
return true; return true;
} }
namespace {
struct PCHLocatorInfo {
serialization::ModuleFile *Mod;
PCHLocatorInfo() : Mod(0) {}
};
}
static bool PCHLocator(serialization::ModuleFile &M, void *UserData) {
PCHLocatorInfo &Info = *static_cast<PCHLocatorInfo*>(UserData);
switch (M.Kind) {
case serialization::MK_Module:
return true; // skip dependencies.
case serialization::MK_PCH:
Info.Mod = &M;
return true; // found it.
case serialization::MK_Preamble:
return false; // look in dependencies.
case serialization::MK_MainFile:
return false; // look in dependencies.
}
return true;
}
const FileEntry *ASTUnit::getPCHFile() {
if (!Reader)
return 0;
PCHLocatorInfo Info;
Reader->getModuleManager().visit(PCHLocator, &Info);
if (Info.Mod)
return Info.Mod->File;
return 0;
}
void ASTUnit::PreambleData::countLines() const { void ASTUnit::PreambleData::countLines() const {
NumLines = 0; NumLines = 0;
if (empty()) if (empty())

Просмотреть файл

@ -197,13 +197,20 @@ public:
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) { StringRef InFile) {
PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
// We usually disable the preprocessing record for indexing even if the // We usually disable the preprocessing record for indexing even if the
// original preprocessing options had it enabled. Now that the indexing // original preprocessing options had it enabled. Now that the indexing
// Preprocessor has been created (without a preprocessing record), re-enable // Preprocessor has been created (without a preprocessing record), re-enable
// the option in case modules are enabled, so that the detailed record // the option in case modules are enabled, so that the detailed record
// option can be propagated when the module file is generated. // option can be propagated when the module file is generated.
if (CI.getLangOpts().Modules && EnablePPDetailedRecordForModules) if (CI.getLangOpts().Modules && EnablePPDetailedRecordForModules)
CI.getPreprocessorOpts().DetailedRecord = true; PPOpts.DetailedRecord = true;
if (!PPOpts.ImplicitPCHInclude.empty()) {
IndexCtx.importedPCH(
CI.getFileManager().getFile(PPOpts.ImplicitPCHInclude));
}
IndexCtx.setASTContext(CI.getASTContext()); IndexCtx.setASTContext(CI.getASTContext());
Preprocessor &PP = CI.getPreprocessor(); Preprocessor &PP = CI.getPreprocessor();
@ -536,6 +543,9 @@ static void clang_indexTranslationUnit_Impl(void *UserData) {
ASTUnit::ConcurrencyCheck Check(*Unit); ASTUnit::ConcurrencyCheck Check(*Unit);
if (const FileEntry *PCHFile = Unit->getPCHFile())
IndexCtx->importedPCH(PCHFile);
FileManager &FileMgr = Unit->getFileManager(); FileManager &FileMgr = Unit->getFileManager();
if (Unit->getOriginalSourceFileName().empty()) if (Unit->getOriginalSourceFileName().empty())

Просмотреть файл

@ -273,6 +273,21 @@ void IndexingContext::importedModule(const ImportDecl *ImportD) {
(void)astFile; (void)astFile;
} }
void IndexingContext::importedPCH(const FileEntry *File) {
if (!CB.importedASTFile)
return;
CXIdxImportedASTFileInfo Info = {
(CXFile)File,
getIndexLoc(SourceLocation()),
/*isModule=*/false,
/*isImplicit=*/false,
/*moduleName=*/NULL
};
CXIdxClientASTFile astFile = CB.importedASTFile(ClientData, &Info);
(void)astFile;
}
void IndexingContext::startedTranslationUnit() { void IndexingContext::startedTranslationUnit() {
CXIdxClientContainer idxCont = 0; CXIdxClientContainer idxCont = 0;
if (CB.startedTranslationUnit) if (CB.startedTranslationUnit)

Просмотреть файл

@ -383,6 +383,7 @@ public:
bool isImport, bool isAngled); bool isImport, bool isAngled);
void importedModule(const ImportDecl *ImportD); void importedModule(const ImportDecl *ImportD);
void importedPCH(const FileEntry *File);
void startedTranslationUnit(); void startedTranslationUnit();