From 2c3e05c266de0d4c465b58ffd129bd0b31604368 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 2 Oct 2012 16:10:38 +0000 Subject: [PATCH] [libclang] Implement the importedASTFile indexing callback to provide info about imported modules. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165020 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang-c/Index.h | 27 +++++++++++++++++++++++---- tools/c-index-test/c-index-test.c | 20 +++++++++++++++++++- tools/libclang/IndexDecl.cpp | 9 +++++++++ tools/libclang/Indexing.cpp | 6 ++++++ tools/libclang/IndexingContext.cpp | 21 +++++++++++++++++++++ tools/libclang/IndexingContext.h | 4 ++++ 6 files changed, 82 insertions(+), 5 deletions(-) diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index c735781863..6ef028a077 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -4921,16 +4921,35 @@ typedef struct { * \brief Data for IndexerCallbacks#importedASTFile. */ typedef struct { + /** + * \brief Top level AST file containing the imported PCH, module or submodule. + */ CXFile file; /** - * \brief Location where the file is imported. It is useful mostly for - * modules. + * \brief Location where the file is imported. Applicable only for modules. */ CXIdxLoc loc; /** * \brief Non-zero if the AST file is a module otherwise it's a PCH. */ int isModule; + /** + * \brief Non-zero if an inclusion directive was automatically turned into + * a module import. + */ + int isIncludeDirective; + /** + * \brief The name of the file being included or the module being imported, + * as written in the source code. + */ + const char *sourceName; + /** + * \brief The actual name of the module or submodule being imported. + * The syntax is a sequence of identifiers separated by dots, e.g "std.vector" + * Applicable only for modules. + */ + const char *moduleName; + } CXIdxImportedASTFileInfo; typedef enum { @@ -5182,8 +5201,8 @@ typedef struct { * * AST files will not get indexed (there will not be callbacks to index all * the entities in an AST file). The recommended action is that, if the AST - * file is not already indexed, to block further indexing and initiate a new - * indexing job specific to the AST file. + * file is not already indexed, to initiate a new indexing job specific to + * the AST file. */ CXIdxClientASTFile (*importedASTFile)(CXClientData client_data, const CXIdxImportedASTFileInfo *); diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 85dcddd91c..28ad59e4a9 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -2349,6 +2349,24 @@ static CXIdxClientFile index_ppIncludedFile(CXClientData client_data, return (CXIdxClientFile)info->file; } +static CXIdxClientFile index_importedASTFile(CXClientData client_data, + const CXIdxImportedASTFileInfo *info) { + IndexData *index_data; + index_data = (IndexData *)client_data; + printCheck(index_data); + + printf("[importedASTFile]: "); + printCXIndexFile((CXIdxClientFile)info->file); + printf(" | loc: "); + printCXIndexLoc(info->loc, client_data); + printf(" | module name: \"%s\"", info->moduleName); + printf(" | source name: \"%s\"", info->sourceName); + printf(" | isModule: %d | isIncludeDirective: %d\n", + info->isModule, info->isIncludeDirective); + + return (CXIdxClientFile)info->file; +} + static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_data, void *reserved) { IndexData *index_data; @@ -2479,7 +2497,7 @@ static IndexerCallbacks IndexCB = { index_diagnostic, index_enteredMainFile, index_ppIncludedFile, - 0, /*importedASTFile*/ + index_importedASTFile, index_startedTranslationUnit, index_indexDeclaration, index_indexEntityReference diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 53a98f111c..65b0b16a37 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -10,6 +10,7 @@ #include "IndexingContext.h" #include "clang/AST/DeclVisitor.h" +#include "clang/Basic/Module.h" using namespace clang; using namespace cxindex; @@ -305,6 +306,14 @@ public: IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); return true; } + + bool VisitImportDecl(ImportDecl *D) { + Module *Imported = D->getImportedModule(); + if (Imported) + IndexCtx.importedModule(D->getLocation(), Imported->getFullModuleName(), + /*isIncludeDirective=*/false, Imported); + return true; + } }; } // anonymous namespace diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index c4fba96849..efae7eecd8 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -73,6 +73,12 @@ public: StringRef SearchPath, StringRef RelativePath, const Module *Imported) { + if (Imported) { + IndexCtx.importedModule(HashLoc, FileName, /*isIncludeDirective=*/true, + Imported); + return; + } + bool isImport = (IncludeTok.is(tok::identifier) && IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import); IndexCtx.ppIncludedFile(HashLoc, FileName, File, isImport, IsAngled); diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 210dc36d52..3a3c010370 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -253,6 +253,27 @@ void IndexingContext::ppIncludedFile(SourceLocation hashLoc, FileMap[File] = idxFile; } +void IndexingContext::importedModule(SourceLocation Loc, + StringRef name, bool isIncludeDirective, + const Module *module) { + if (!CB.importedASTFile) + return; + + std::string ModuleName = module->getFullModuleName(); + + ScratchAlloc SA(*this); + CXIdxImportedASTFileInfo Info = { + (CXFile)module->getASTFile(), + getIndexLoc(Loc), + /*isModule=*/true, + isIncludeDirective, + SA.toCStr(name), + ModuleName.c_str(), + }; + CXIdxClientASTFile astFile = CB.importedASTFile(ClientData, &Info); + (void)astFile; +} + void IndexingContext::startedTranslationUnit() { CXIdxClientContainer idxCont = 0; if (CB.startedTranslationUnit) diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index be21927c5b..f74dd1ad0a 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -382,6 +382,10 @@ public: StringRef filename, const FileEntry *File, bool isImport, bool isAngled); + void importedModule(SourceLocation Loc, + StringRef name, bool isIncludeDirective, + const Module *module); + void startedTranslationUnit(); void indexDecl(const Decl *D); -- 2.40.0