From: Ariel J. Bernal Date: Tue, 1 Oct 2013 14:59:00 +0000 (+0000) Subject: Fixed replacements for files with relative paths are not applied. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d11344a728c7ffab17e5557506edfbcbae18d34e;p=clang Fixed replacements for files with relative paths are not applied. Replacements were no applied when using a compilation database with paths in the compilation command relative to the compile directory. This patch makes those paths abosulte. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Tooling/Refactoring.cpp b/lib/Tooling/Refactoring.cpp index b03fb50b38..13811648ee 100644 --- a/lib/Tooling/Refactoring.cpp +++ b/lib/Tooling/Refactoring.cpp @@ -19,6 +19,8 @@ #include "clang/Rewrite/Core/Rewriter.h" #include "clang/Tooling/Refactoring.h" #include "llvm/Support/raw_os_ostream.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/Path.h" namespace clang { namespace tooling { @@ -103,7 +105,16 @@ void Replacement::setFromSourceLocation(SourceManager &Sources, const std::pair DecomposedLocation = Sources.getDecomposedLoc(Start); const FileEntry *Entry = Sources.getFileEntryForID(DecomposedLocation.first); - this->FilePath = Entry != NULL ? Entry->getName() : InvalidLocation; + + if (Entry != NULL) { + // Make FilePath absolute so replacements can be applied correctly when + // relative paths for files are used. + llvm::SmallString<256> FilePath(Entry->getName()); + llvm::error_code EC = llvm::sys::fs::make_absolute(FilePath); + // Don't change the FilePath if the file is a virtual file. + this->FilePath = EC ? FilePath.c_str() : Entry->getName(); + } else + this->FilePath = InvalidLocation; this->ReplacementRange = Range(DecomposedLocation.second, Length); this->ReplacementText = ReplacementText; } diff --git a/test/Tooling/clang-check-rel-path.cpp b/test/Tooling/clang-check-rel-path.cpp new file mode 100644 index 0000000000..23a9345b99 --- /dev/null +++ b/test/Tooling/clang-check-rel-path.cpp @@ -0,0 +1,10 @@ +// This block test a compilation database with files relative to the directory +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo '[{"directory":"%t","command":"clang++ -c test.cpp","file":"test.cpp"}]' | sed -e 's/\\/\//g' > %t/compile_commands.json +// RUN: cp "%s" "%t/test.cpp" +// RUN: not clang-check -p "%t" "%t/test.cpp" 2>&1|FileCheck %s +// FIXME: Make the above easier. + +// CHECK: C++ requires +invalid;