diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 37072a765824427fc22937aa9aa0d5a7f3757be7..d8c37ebd70f978b52baf563be95c5cf45c1feb5f 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3464,6 +3464,13 @@ typedef void *CXModule; */ CINDEX_LINKAGE CXModule clang_Cursor_getModule(CXCursor C); +/** + * \param Module a module object. + * + * \returns the module file where the provided module object came from. + */ +CINDEX_LINKAGE CXFile clang_Module_getASTFile(CXModule Module); + /** * \param Module a module object. * diff --git a/test/Index/annotate-module.m b/test/Index/annotate-module.m index 33ca3f83249998eb7f76796bc50866b51a89d5e7..55e21d235e7cd85034785ab962d2fab11d25d7b0 100644 --- a/test/Index/annotate-module.m +++ b/test/Index/annotate-module.m @@ -40,3 +40,10 @@ int glob; // CHECK-MOD-NEXT: Punctuation: "*" [2:5 - 2:6] VarDecl=Module_Sub:2:6 // CHECK-MOD-NEXT: Identifier: "Module_Sub" [2:6 - 2:16] VarDecl=Module_Sub:2:6 // CHECK-MOD-NEXT: Punctuation: ";" [2:16 - 2:17] + +// RUN: c-index-test -cursor-at=%s:3:11 %s -fmodules-cache-path=%t.cache -fmodules -F %S/../Modules/Inputs \ +// RUN: | FileCheck %s -check-prefix=CHECK-CURSOR + +// CHECK-CURSOR: 3:1 ModuleImport=DependsOnModule:3:1 (Definition) Extent=[3:1 - 3:24] Spelling=DependsOnModule ([3:9 - 3:24]) ModuleName=DependsOnModule ({{.*}}DependsOnModule.pcm) Headers(2): +// CHECK-CURSOR-NEXT: {{.*}}other.h +// CHECK-CURSOR-NEXT: {{.*}}DependsOnModule.h diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 3f39a78625dee764fa71decc3b5af0990a6d124a..e5752341679d5715d5d12ac1b946078452d39fb1 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -2105,14 +2105,19 @@ static int inspect_cursor_at(int argc, const char **argv) { { CXModule mod = clang_Cursor_getModule(Cursor); - CXString name; + CXFile astFile; + CXString name, astFilename; unsigned i, numHeaders; if (mod) { + astFile = clang_Module_getASTFile(mod); + astFilename = clang_getFileName(astFile); name = clang_Module_getFullName(mod); numHeaders = clang_Module_getNumTopLevelHeaders(TU, mod); - printf(" ModuleName=%s Headers(%d):", - clang_getCString(name), numHeaders); + printf(" ModuleName=%s (%s) Headers(%d):", + clang_getCString(name), clang_getCString(astFilename), + numHeaders); clang_disposeString(name); + clang_disposeString(astFilename); for (i = 0; i < numHeaders; ++i) { CXFile file = clang_Module_getTopLevelHeader(TU, mod, i); CXString filename = clang_getFileName(file); diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 0a8a06899833f34cb2acb1e6d5c595d8f0e6524b..a43c1ab7e45914848b5a52bedcf01af875fbcc41 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -6055,6 +6055,13 @@ CXModule clang_Cursor_getModule(CXCursor C) { return 0; } +CXFile clang_Module_getASTFile(CXModule CXMod) { + if (!CXMod) + return 0; + Module *Mod = static_cast<Module*>(CXMod); + return const_cast<FileEntry *>(Mod->getASTFile()); +} + CXModule clang_Module_getParent(CXModule CXMod) { if (!CXMod) return 0; diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index c7508bc5449becee2348bd9cb64665cd12b4c578..0c9912e5202ff2ac618ada3db4c642b425a215b6 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -21,6 +21,7 @@ clang_Cursor_isDynamicCall clang_Cursor_isNull clang_Cursor_isVariadic clang_Cursor_getModule +clang_Module_getASTFile clang_Module_getParent clang_Module_getName clang_Module_getFullName