[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