Skip to content

Commit

Permalink
Fixed replacements for files with relative paths are not applied.
Browse files Browse the repository at this point in the history
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.

llvm-svn: 191776
ajbernal committed Oct 1, 2013
1 parent a9ac0e0 commit 31c181b
Showing 2 changed files with 22 additions and 1 deletion.
13 changes: 12 additions & 1 deletion clang/lib/Tooling/Refactoring.cpp
Original file line number Diff line number Diff line change
@@ -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<FileID, unsigned> 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;
}
10 changes: 10 additions & 0 deletions clang/test/Tooling/clang-check-rel-path.cpp
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 31c181b

Please sign in to comment.