[cfe-commits] r165020 - in /cfe/trunk: include/clang-c/Index.h tools/c-index-test/c-index-test.c tools/libclang/IndexDecl.cpp tools/libclang/Indexing.cpp tools/libclang/IndexingContext.cpp tools/libclang/IndexingContext.h
Argyrios Kyrtzidis
akyrtzi at gmail.com
Tue Oct 2 09:10:38 PDT 2012
Author: akirtzidis
Date: Tue Oct 2 11:10:38 2012
New Revision: 165020
URL: http://llvm.org/viewvc/llvm-project?rev=165020&view=rev
Log:
[libclang] Implement the importedASTFile indexing callback to provide
info about imported modules.
Modified:
cfe/trunk/include/clang-c/Index.h
cfe/trunk/tools/c-index-test/c-index-test.c
cfe/trunk/tools/libclang/IndexDecl.cpp
cfe/trunk/tools/libclang/Indexing.cpp
cfe/trunk/tools/libclang/IndexingContext.cpp
cfe/trunk/tools/libclang/IndexingContext.h
Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Tue Oct 2 11:10:38 2012
@@ -4921,16 +4921,35 @@
* \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 @@
*
* 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 *);
Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Tue Oct 2 11:10:38 2012
@@ -2349,6 +2349,24 @@
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 @@
index_diagnostic,
index_enteredMainFile,
index_ppIncludedFile,
- 0, /*importedASTFile*/
+ index_importedASTFile,
index_startedTranslationUnit,
index_indexDeclaration,
index_indexEntityReference
Modified: cfe/trunk/tools/libclang/IndexDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexDecl.cpp?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/IndexDecl.cpp (original)
+++ cfe/trunk/tools/libclang/IndexDecl.cpp Tue Oct 2 11:10:38 2012
@@ -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 @@
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
Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Tue Oct 2 11:10:38 2012
@@ -73,6 +73,12 @@
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);
Modified: cfe/trunk/tools/libclang/IndexingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/IndexingContext.cpp (original)
+++ cfe/trunk/tools/libclang/IndexingContext.cpp Tue Oct 2 11:10:38 2012
@@ -253,6 +253,27 @@
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)
Modified: cfe/trunk/tools/libclang/IndexingContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.h?rev=165020&r1=165019&r2=165020&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/IndexingContext.h (original)
+++ cfe/trunk/tools/libclang/IndexingContext.h Tue Oct 2 11:10:38 2012
@@ -382,6 +382,10 @@
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);
More information about the cfe-commits
mailing list