From: Argyrios Kyrtzidis Date: Sat, 26 Jan 2013 04:52:52 +0000 (+0000) Subject: [libclang] Introduce clang_getFileUniqueID which returns a struct X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=db84e7a44dce24c3a8e4e0fc84434c00fc2da168;p=clang [libclang] Introduce clang_getFileUniqueID which returns a struct for a CXFile containing device/inode/modification time. Intended to be useful as a key associated with a unique file across an indexing session. rdar://13091837 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173559 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 6fa8296bdf..2a66e7a798 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 10 +#define CINDEX_VERSION_MINOR 11 #define CINDEX_VERSION_ENCODE(major, minor) ( \ ((major) * 10000) \ @@ -296,6 +296,24 @@ CINDEX_LINKAGE CXString clang_getFileName(CXFile SFile); */ CINDEX_LINKAGE time_t clang_getFileTime(CXFile SFile); +/** + * \brief Uniquely identifies a CXFile, that refers to the same underlying file, + * across an indexing session. + */ +typedef struct { + unsigned long long data[3]; +} CXFileUniqueID; + +/** + * \brief Retrieve the unique ID for the given \c file. + * + * \param file the file to get the ID for. + * \param outID stores the returned CXFileUniqueID. + * \returns If there was a failure getting the unique ID, returns non-zero, + * otherwise returns 0. +*/ +CINDEX_LINKAGE int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID); + /** * \brief Determine whether the given header is guarded against * multiple inclusions, either with the conventional diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 5d492417ba..a8517091ac 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -2960,6 +2960,21 @@ unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit tu, CXFile file) { .isFileMultipleIncludeGuarded(FEnt); } +int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) { + if (!file || !outID) + return 1; + +#ifdef LLVM_ON_WIN32 + return 1; // inodes not supported on windows. +#else + FileEntry *FEnt = static_cast(file); + outID->data[0] = FEnt->getDevice(); + outID->data[1] = FEnt->getInode(); + outID->data[2] = FEnt->getModificationTime(); + return 0; +#endif +} + } // end: extern "C" //===----------------------------------------------------------------------===// diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 8f3c86318c..616be4c635 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -166,6 +166,7 @@ clang_getFile clang_getFileLocation clang_getFileName clang_getFileTime +clang_getFileUniqueID clang_getFunctionTypeCallingConv clang_getIBOutletCollectionType clang_getIncludedFile