Author: akirtzidis Date: Tue Sep 18 08:02:56 2018 New Revision: 342484 URL: http://llvm.org/viewvc/llvm-project?rev=342484&view=rev Log: [index] Enhance indexing for module references
* Create a USR for the occurrences of the 'module' symbol kind * Record module references for each identifier in an import declaration Added: cfe/trunk/test/Index/Core/Inputs/module/SubModA.h cfe/trunk/test/Index/Core/Inputs/module/SubSubModA.h Modified: cfe/trunk/include/clang/Index/IndexDataConsumer.h cfe/trunk/include/clang/Index/USRGeneration.h cfe/trunk/lib/Index/IndexingAction.cpp cfe/trunk/lib/Index/IndexingContext.cpp cfe/trunk/lib/Index/USRGeneration.cpp cfe/trunk/test/Index/Core/Inputs/module/module.modulemap cfe/trunk/test/Index/Core/index-with-module.m cfe/trunk/tools/c-index-test/core_main.cpp cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp cfe/trunk/tools/libclang/CXIndexDataConsumer.h Modified: cfe/trunk/include/clang/Index/IndexDataConsumer.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexDataConsumer.h?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/include/clang/Index/IndexDataConsumer.h (original) +++ cfe/trunk/include/clang/Index/IndexDataConsumer.h Tue Sep 18 08:02:56 2018 @@ -50,7 +50,12 @@ public: SourceLocation Loc); /// \returns true to continue indexing, or false to abort. + /// + /// This will be called for each module reference in an import decl. + /// For "@import MyMod.SubMod", there will be a call for 'MyMod' with the + /// 'reference' role, and a call for 'SubMod' with the 'declaration' role. virtual bool handleModuleOccurence(const ImportDecl *ImportD, + const Module *Mod, SymbolRoleSet Roles, SourceLocation Loc); virtual void finish() {} Modified: cfe/trunk/include/clang/Index/USRGeneration.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/USRGeneration.h?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/include/clang/Index/USRGeneration.h (original) +++ cfe/trunk/include/clang/Index/USRGeneration.h Tue Sep 18 08:02:56 2018 @@ -16,6 +16,7 @@ namespace clang { class Decl; class MacroDefinitionRecord; +class Module; class SourceLocation; class SourceManager; @@ -70,6 +71,22 @@ bool generateUSRForMacro(const MacroDefi bool generateUSRForMacro(StringRef MacroName, SourceLocation Loc, const SourceManager &SM, SmallVectorImpl<char> &Buf); +/// Generate a USR for a module, including the USR prefix. +/// \returns true on error, false on success. +bool generateFullUSRForModule(const Module *Mod, raw_ostream &OS); + +/// Generate a USR for a top-level module name, including the USR prefix. +/// \returns true on error, false on success. +bool generateFullUSRForTopLevelModuleName(StringRef ModName, raw_ostream &OS); + +/// Generate a USR fragment for a module. +/// \returns true on error, false on success. +bool generateUSRFragmentForModule(const Module *Mod, raw_ostream &OS); + +/// Generate a USR fragment for a module name. +/// \returns true on error, false on success. +bool generateUSRFragmentForModuleName(StringRef ModName, raw_ostream &OS); + } // namespace index } // namespace clang Modified: cfe/trunk/lib/Index/IndexingAction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingAction.cpp?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexingAction.cpp (original) +++ cfe/trunk/lib/Index/IndexingAction.cpp Tue Sep 18 08:02:56 2018 @@ -37,6 +37,7 @@ bool IndexDataConsumer::handleMacroOccur } bool IndexDataConsumer::handleModuleOccurence(const ImportDecl *ImportD, + const Module *Mod, SymbolRoleSet Roles, SourceLocation Loc) { return true; Modified: cfe/trunk/lib/Index/IndexingContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingContext.cpp?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexingContext.cpp (original) +++ cfe/trunk/lib/Index/IndexingContext.cpp Tue Sep 18 08:02:56 2018 @@ -80,11 +80,27 @@ bool IndexingContext::handleReference(co RefE, RefD, DC); } +static void reportModuleReferences(const Module *Mod, + ArrayRef<SourceLocation> IdLocs, + const ImportDecl *ImportD, + IndexDataConsumer &DataConsumer) { + if (!Mod) + return; + reportModuleReferences(Mod->Parent, IdLocs.drop_back(), ImportD, + DataConsumer); + DataConsumer.handleModuleOccurence(ImportD, Mod, + (SymbolRoleSet)SymbolRole::Reference, + IdLocs.back()); +} + bool IndexingContext::importedModule(const ImportDecl *ImportD) { + if (ImportD->isInvalidDecl()) + return true; + SourceLocation Loc; auto IdLocs = ImportD->getIdentifierLocs(); if (!IdLocs.empty()) - Loc = IdLocs.front(); + Loc = IdLocs.back(); else Loc = ImportD->getLocation(); @@ -108,11 +124,17 @@ bool IndexingContext::importedModule(con } } + const Module *Mod = ImportD->getImportedModule(); + if (!ImportD->isImplicit() && Mod->Parent && !IdLocs.empty()) { + reportModuleReferences(Mod->Parent, IdLocs.drop_back(), ImportD, + DataConsumer); + } + SymbolRoleSet Roles = (unsigned)SymbolRole::Declaration; if (ImportD->isImplicit()) Roles |= (unsigned)SymbolRole::Implicit; - return DataConsumer.handleModuleOccurence(ImportD, Roles, Loc); + return DataConsumer.handleModuleOccurence(ImportD, Mod, Roles, Loc); } bool IndexingContext::isTemplateImplicitInstantiation(const Decl *D) { Modified: cfe/trunk/lib/Index/USRGeneration.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/USRGeneration.cpp?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/lib/Index/USRGeneration.cpp (original) +++ cfe/trunk/lib/Index/USRGeneration.cpp Tue Sep 18 08:02:56 2018 @@ -1094,3 +1094,29 @@ bool clang::index::generateUSRForMacro(S Out << MacroName; return false; } + +bool clang::index::generateFullUSRForModule(const Module *Mod, + raw_ostream &OS) { + if (!Mod->Parent) + return generateFullUSRForTopLevelModuleName(Mod->Name, OS); + if (generateFullUSRForModule(Mod->Parent, OS)) + return true; + return generateUSRFragmentForModule(Mod, OS); +} + +bool clang::index::generateFullUSRForTopLevelModuleName(StringRef ModName, + raw_ostream &OS) { + OS << getUSRSpacePrefix(); + return generateUSRFragmentForModuleName(ModName, OS); +} + +bool clang::index::generateUSRFragmentForModule(const Module *Mod, + raw_ostream &OS) { + return generateUSRFragmentForModuleName(Mod->Name, OS); +} + +bool clang::index::generateUSRFragmentForModuleName(StringRef ModName, + raw_ostream &OS) { + OS << "@M@" << ModName; + return false; +} Added: cfe/trunk/test/Index/Core/Inputs/module/SubModA.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/Inputs/module/SubModA.h?rev=342484&view=auto ============================================================================== --- cfe/trunk/test/Index/Core/Inputs/module/SubModA.h (added) +++ cfe/trunk/test/Index/Core/Inputs/module/SubModA.h Tue Sep 18 08:02:56 2018 @@ -0,0 +1,2 @@ + +void SubModA_func(void); Added: cfe/trunk/test/Index/Core/Inputs/module/SubSubModA.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/Inputs/module/SubSubModA.h?rev=342484&view=auto ============================================================================== --- cfe/trunk/test/Index/Core/Inputs/module/SubSubModA.h (added) +++ cfe/trunk/test/Index/Core/Inputs/module/SubSubModA.h Tue Sep 18 08:02:56 2018 @@ -0,0 +1,2 @@ + +void SubSubModA_func(void); Modified: cfe/trunk/test/Index/Core/Inputs/module/module.modulemap URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/Inputs/module/module.modulemap?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/test/Index/Core/Inputs/module/module.modulemap (original) +++ cfe/trunk/test/Index/Core/Inputs/module/module.modulemap Tue Sep 18 08:02:56 2018 @@ -1 +1,11 @@ -module ModA { header "ModA.h" export * } +module ModA { + header "ModA.h" export * + + module SubModA { + header "SubModA.h" + + module SubSubModA { + header "SubSubModA.h" + } + } +} Modified: cfe/trunk/test/Index/Core/index-with-module.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-with-module.m?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/test/Index/Core/index-with-module.m (original) +++ cfe/trunk/test/Index/Core/index-with-module.m Tue Sep 18 08:02:56 2018 @@ -1,11 +1,17 @@ // RUN: rm -rf %t.mcp // RUN: c-index-test core -print-source-symbols -dump-imported-module-files -- %s -I %S/Inputs/module -fmodules -fmodules-cache-path=%t.mcp | FileCheck %s -// CHECK: [[@LINE+1]]:9 | module/C | ModA | Decl | +// CHECK: [[@LINE+1]]:9 | module/C | ModA | [[ModA_USR:c:@M@ModA]] | Decl | @import ModA; -// CHECK: [[@LINE+1]]:1 | module/C | ModA | Decl,Impl | +// CHECK: [[@LINE+1]]:1 | module/C | ModA | [[ModA_USR]] | Decl,Impl | #include "ModA.h" +@import ModA.SubModA.SubSubModA; +// CHECK: [[@LINE-1]]:9 | module/C | ModA | [[ModA_USR]] | Ref | +// CHECK: [[@LINE-2]]:14 | module/C | ModA.SubModA | c:@M@ModA@M@SubModA | Ref | +// CHECK: [[@LINE-3]]:22 | module/C | ModA.SubModA.SubSubModA | [[SubSubModA_USR:c:@M@ModA@M@SubModA@M@SubSubModA]] | Decl | +#include "SubSubModA.h" // CHECK: [[@LINE]]:1 | module/C | ModA.SubModA.SubSubModA | [[SubSubModA_USR]] | Decl,Impl | + void foo() { // CHECK: [[@LINE+1]]:3 | function/C | ModA_func | c:@F@ModA_func | {{.*}} | Ref,Call,RelCall,RelCont | rel: 1 ModA_func(); Modified: cfe/trunk/tools/c-index-test/core_main.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/tools/c-index-test/core_main.cpp (original) +++ cfe/trunk/tools/c-index-test/core_main.cpp Tue Sep 18 08:02:56 2018 @@ -74,6 +74,7 @@ static cl::opt<std::string> static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS); static void printSymbolNameAndUSR(const Decl *D, ASTContext &Ctx, raw_ostream &OS); +static void printSymbolNameAndUSR(const clang::Module *Mod, raw_ostream &OS); namespace { @@ -132,8 +133,9 @@ public: return true; } - bool handleModuleOccurence(const ImportDecl *ImportD, SymbolRoleSet Roles, - SourceLocation Loc) override { + bool handleModuleOccurence(const ImportDecl *ImportD, + const clang::Module *Mod, + SymbolRoleSet Roles, SourceLocation Loc) override { ASTContext &Ctx = ImportD->getASTContext(); SourceManager &SM = Ctx.getSourceManager(); @@ -146,7 +148,8 @@ public: printSymbolInfo(getSymbolInfo(ImportD), OS); OS << " | "; - OS << ImportD->getImportedModule()->getFullModuleName() << " | "; + printSymbolNameAndUSR(Mod, OS); + OS << " | "; printSymbolRoles(Roles, OS); OS << " |\n"; @@ -308,6 +311,12 @@ static void printSymbolNameAndUSR(const } } +static void printSymbolNameAndUSR(const clang::Module *Mod, raw_ostream &OS) { + assert(Mod); + OS << Mod->getFullModuleName() << " | "; + generateFullUSRForModule(Mod, OS); +} + //===----------------------------------------------------------------------===// // Command line processing. //===----------------------------------------------------------------------===// Modified: cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp (original) +++ cfe/trunk/tools/libclang/CXIndexDataConsumer.cpp Tue Sep 18 08:02:56 2018 @@ -222,9 +222,11 @@ bool CXIndexDataConsumer::handleDeclOccu } bool CXIndexDataConsumer::handleModuleOccurence(const ImportDecl *ImportD, + const Module *Mod, SymbolRoleSet Roles, SourceLocation Loc) { - IndexingDeclVisitor(*this, SourceLocation(), nullptr).Visit(ImportD); + if (Roles & (SymbolRoleSet)SymbolRole::Declaration) + IndexingDeclVisitor(*this, SourceLocation(), nullptr).Visit(ImportD); return !shouldAbort(); } Modified: cfe/trunk/tools/libclang/CXIndexDataConsumer.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXIndexDataConsumer.h?rev=342484&r1=342483&r2=342484&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CXIndexDataConsumer.h (original) +++ cfe/trunk/tools/libclang/CXIndexDataConsumer.h Tue Sep 18 08:02:56 2018 @@ -467,7 +467,7 @@ private: ArrayRef<index::SymbolRelation> Relations, SourceLocation Loc, ASTNodeInfo ASTNode) override; - bool handleModuleOccurence(const ImportDecl *ImportD, + bool handleModuleOccurence(const ImportDecl *ImportD, const Module *Mod, index::SymbolRoleSet Roles, SourceLocation Loc) override; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits