diff options
-rw-r--r-- | include/clang-c/Index.h | 58 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 19 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 48 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 6 |
4 files changed, 131 insertions, 0 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index c2b1f25f83..f7a319b5f2 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3205,6 +3205,64 @@ CINDEX_LINKAGE CXComment clang_Cursor_getParsedComment(CXCursor C); */ /** + * \defgroup CINDEX_MODULE Module introspection + * + * The functions in this group provide access to information about modules. + * + * @{ + */ + +typedef void *CXModule; + +/** + * \brief Given a CXCursor_ModuleImportDecl cursor, return the associated module. + */ +CINDEX_LINKAGE CXModule clang_Cursor_getModule(CXCursor C); + +/** + * \param Module object. + * + * \returns the parent of a sub-module or NULL if the given module is top-level, + * e.g. for 'std.vector' it will return the 'std' module. + */ +CINDEX_LINKAGE CXModule clang_Module_getParent(CXModule); + +/** + * \param Module object. + * + * \returns the name of the module, e.g. for the 'std.vector' sub-module it + * will return "vector". + */ +CINDEX_LINKAGE CXString clang_Module_getName(CXModule); + +/** + * \param Module object. + * + * \returns the full name of the module, e.g. "std.vector". + */ +CINDEX_LINKAGE CXString clang_Module_getFullName(CXModule); + +/** + * \param Module object. + * + * \returns the number of top level headers associated with this module. + */ +CINDEX_LINKAGE unsigned clang_Module_getNumTopLevelHeaders(CXModule); + +/** + * \param Module object. + * + * \param Index top level header index (zero-based). + * + * \returns the specified top level header associated with the module. + */ +CINDEX_LINKAGE CXFile clang_Module_getTopLevelHeader(CXModule, unsigned Index); + +/** + * @} + */ + +/** * \defgroup CINDEX_COMMENT Comment AST introspection * * The routines in this group provide access to information in the diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index f4efa900cb..caa50d0167 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1956,6 +1956,25 @@ static int inspect_cursor_at(int argc, const char **argv) { if (clang_Cursor_isDynamicCall(Cursor)) printf(" Dynamic-call"); + { + CXModule mod = clang_Cursor_getModule(Cursor); + CXString name; + unsigned i, numHeaders; + if (mod) { + name = clang_Module_getFullName(mod); + numHeaders = clang_Module_getNumTopLevelHeaders(mod); + printf(" ModuleName=%s Headers(%d):", + clang_getCString(name), numHeaders); + clang_disposeString(name); + for (i = 0; i < numHeaders; ++i) { + CXFile file = clang_Module_getTopLevelHeader(mod, i); + CXString filename = clang_getFileName(file); + printf("\n%s", clang_getCString(filename)); + clang_disposeString(filename); + } + } + } + if (completionString != NULL) { printf("\nCompletion string: "); print_completion_string(completionString, stdout); diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index abe3eea4af..3543a39f7a 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -5834,6 +5834,54 @@ CXComment clang_Cursor_getParsedComment(CXCursor C) { return cxcomment::createCXComment(FC, getCursorTU(C)); } +CXModule clang_Cursor_getModule(CXCursor C) { + if (C.kind == CXCursor_ModuleImportDecl) { + if (ImportDecl *ImportD = dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) + return ImportD->getImportedModule(); + } + + return 0; +} + +CXModule clang_Module_getParent(CXModule CXMod) { + if (!CXMod) + return 0; + Module *Mod = static_cast<Module*>(CXMod); + return Mod->Parent; +} + +CXString clang_Module_getName(CXModule CXMod) { + if (!CXMod) + return createCXString(""); + Module *Mod = static_cast<Module*>(CXMod); + return createCXString(Mod->Name); +} + +CXString clang_Module_getFullName(CXModule CXMod) { + if (!CXMod) + return createCXString(""); + Module *Mod = static_cast<Module*>(CXMod); + return createCXString(Mod->getFullModuleName()); +} + +unsigned clang_Module_getNumTopLevelHeaders(CXModule CXMod) { + if (!CXMod) + return 0; + Module *Mod = static_cast<Module*>(CXMod); + return Mod->TopHeaders.size(); +} + +CXFile clang_Module_getTopLevelHeader(CXModule CXMod, unsigned Index) { + if (!CXMod) + return 0; + Module *Mod = static_cast<Module*>(CXMod); + + if (Index < Mod->TopHeaders.size()) + return const_cast<FileEntry *>(Mod->TopHeaders[Index]); + + return 0; +} + } // end: extern "C" //===----------------------------------------------------------------------===// diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 610bd91c6a..ec77fafa7b 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -15,6 +15,12 @@ clang_Cursor_getSpellingNameRange clang_Cursor_getTranslationUnit clang_Cursor_isDynamicCall clang_Cursor_isNull +clang_Cursor_getModule +clang_Module_getParent +clang_Module_getName +clang_Module_getFullName +clang_Module_getNumTopLevelHeaders +clang_Module_getTopLevelHeader clang_IndexAction_create clang_IndexAction_dispose clang_Range_isNull |