зеркало из https://github.com/microsoft/clang-1.git
[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:
Родитель
37f2f52fbc
Коммит
3da76bfbd2
|
@ -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();
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче