diff options
author | Erik Verbruggen <erikjv@me.com> | 2017-12-06 09:02:52 +0000 |
---|---|---|
committer | Erik Verbruggen <erikjv@me.com> | 2017-12-06 09:02:52 +0000 |
commit | 0a795a46dcfa5d1e413d5ee1fafda620dedeeee1 (patch) | |
tree | afdea0c7f5dfa777783607f0802add8bb6c3e1f4 | |
parent | e792818a7bc14878111ee3145ca030e24109a4f1 (diff) |
[libclang] Add function to get the buffer for a file
This can be used by clients in conjunction with an offset returned by
e.g. clang_getFileLocation. Now those clients do not need to also
open/read the file.
Differential Revision: https://reviews.llvm.org/D40643
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@319881 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 17 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 21 |
2 files changed, 37 insertions, 1 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index fe0e70b4f4..1204d6a5d8 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -32,7 +32,7 @@ * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable. */ #define CINDEX_VERSION_MAJOR 0 -#define CINDEX_VERSION_MINOR 43 +#define CINDEX_VERSION_MINOR 44 #define CINDEX_VERSION_ENCODE(major, minor) ( \ ((major) * 10000) \ @@ -404,6 +404,21 @@ CINDEX_LINKAGE CXFile clang_getFile(CXTranslationUnit tu, const char *file_name); /** + * \brief Retrieve the buffer associated with the given file. + * + * \param tu the translation unit + * + * \param file the file for which to retrieve the buffer. + * + * \param size [out] if non-NULL, will be set to the size of the buffer. + * + * \returns a pointer to the buffer in memory that holds the contents of + * \p file, or a NULL pointer when the file is not loaded. + */ +CINDEX_LINKAGE const char *clang_getFileContents(CXTranslationUnit tu, + CXFile file, size_t *size); + +/** * \brief Returns non-zero if the \c file1 and \c file2 point to the same file, * or they are both NULL. */ diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index b2edd42cb0..49a1726ac5 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -4162,6 +4162,27 @@ CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { return const_cast<FileEntry *>(FMgr.getFile(file_name)); } +const char *clang_getFileContents(CXTranslationUnit TU, CXFile file, + size_t *size) { + if (isNotUsableTU(TU)) { + LOG_BAD_TU(TU); + return nullptr; + } + + const SourceManager &SM = cxtu::getASTUnit(TU)->getSourceManager(); + FileID fid = SM.translateFile(static_cast<FileEntry *>(file)); + bool Invalid = true; + llvm::MemoryBuffer *buf = SM.getBuffer(fid, &Invalid); + if (Invalid) { + if (size) + *size = 0; + return nullptr; + } + if (size) + *size = buf->getBufferSize(); + return buf->getBufferStart(); +} + unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) { if (isNotUsableTU(TU)) { |