Skip to content

Commit

Permalink
[libclang] Add clang_File_tryGetRealPathName
Browse files Browse the repository at this point in the history
Summary:
clang_getFileName() may return a path relative to WorkingDir.
On Arch Linux, during clang_indexTranslationUnit(), clang_getFileName() on
CXIdxIncludedIncludedFileInfo::file may return
"/../lib64/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/string",
for `#include <string>`.

I presume WorkingDir is somehow changed to /usr/lib or /usr/include and
clang_getFileName() returns a path relative to WorkingDir.

clang_File_tryGetRealPathName() returns "/usr/include/c++/7.3.0/string"
which is more useful for the indexer in this case.

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D42893

llvm-svn: 329515
  • Loading branch information
MaskRay committed Apr 7, 2018
1 parent 6b65523 commit e46ac5f
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 0 deletions.
7 changes: 7 additions & 0 deletions clang/include/clang-c/Index.h
Expand Up @@ -424,6 +424,13 @@ CINDEX_LINKAGE const char *clang_getFileContents(CXTranslationUnit tu,
*/
CINDEX_LINKAGE int clang_File_isEqual(CXFile file1, CXFile file2);

/**
* \brief Returns the real path name of \c file.
*
* An empty string may be returned. Use \c clang_getFileName() in that case.
*/
CINDEX_LINKAGE CXString clang_File_tryGetRealPathName(CXFile file);

/**
* @}
*/
Expand Down
8 changes: 8 additions & 0 deletions clang/tools/libclang/CIndex.cpp
Expand Up @@ -4249,6 +4249,14 @@ int clang_File_isEqual(CXFile file1, CXFile file2) {
return FEnt1->getUniqueID() == FEnt2->getUniqueID();
}

CXString clang_File_tryGetRealPathName(CXFile SFile) {
if (!SFile)
return cxstring::createNull();

FileEntry *FEnt = static_cast<FileEntry *>(SFile);
return cxstring::createRef(FEnt->tryGetRealPathName());
}

//===----------------------------------------------------------------------===//
// CXCursor Operations.
//===----------------------------------------------------------------------===//
Expand Down
1 change: 1 addition & 0 deletions clang/tools/libclang/libclang.exports
Expand Up @@ -46,6 +46,7 @@ clang_Cursor_isVariadic
clang_Cursor_getModule
clang_Cursor_getStorageClass
clang_File_isEqual
clang_File_tryGetRealPathName
clang_Module_getASTFile
clang_Module_getParent
clang_Module_getName
Expand Down
15 changes: 15 additions & 0 deletions clang/unittests/libclang/LibclangTest.cpp
Expand Up @@ -482,6 +482,21 @@ class LibclangReparseTest : public LibclangParseTest {
}
};

TEST_F(LibclangReparseTest, FileName) {
std::string CppName = "main.cpp";
WriteFile(CppName, "int main() {}");
ClangTU = clang_parseTranslationUnit(Index, CppName.c_str(), nullptr, 0,
nullptr, 0, TUFlags);
CXFile cxf = clang_getFile(ClangTU, CppName.c_str());

CXString cxname = clang_getFileName(cxf);
ASSERT_TRUE(strstr(clang_getCString(cxname), CppName.c_str()));
clang_disposeString(cxname);

cxname = clang_File_tryGetRealPathName(cxf);
ASSERT_TRUE(strstr(clang_getCString(cxname), CppName.c_str()));
clang_disposeString(cxname);
}

TEST_F(LibclangReparseTest, Reparse) {
const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;";
Expand Down

0 comments on commit e46ac5f

Please sign in to comment.