summaryrefslogtreecommitdiffstats
path: root/clang/unittests/Tooling/RefactoringTest.cpp
diff options
context:
space:
mode:
authorAriel J. Bernal <ariel.j.bernal@intel.com>2013-10-09 16:09:23 +0000
committerAriel J. Bernal <ariel.j.bernal@intel.com>2013-10-09 16:09:23 +0000
commitee863cedc29d45c1976fcd3b9f0a5bce34097238 (patch)
tree24853d1ffbc074b5acc1b4964fb9c29eba666c1f /clang/unittests/Tooling/RefactoringTest.cpp
parentcaa435664aa4825b90579102b24a79339a57b5d4 (diff)
downloadbcm5719-llvm-ee863cedc29d45c1976fcd3b9f0a5bce34097238.tar.gz
bcm5719-llvm-ee863cedc29d45c1976fcd3b9f0a5bce34097238.zip
This patch fixes replacements that are not applied when relative paths are
specified. In particular it makes sure that relative paths for non-virtual files aren't made absolute. Added unittest test. llvm-svn: 192299
Diffstat (limited to 'clang/unittests/Tooling/RefactoringTest.cpp')
-rw-r--r--clang/unittests/Tooling/RefactoringTest.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/unittests/Tooling/RefactoringTest.cpp b/clang/unittests/Tooling/RefactoringTest.cpp
index 8c7bfa1c767..9dce26fb51c 100644
--- a/clang/unittests/Tooling/RefactoringTest.cpp
+++ b/clang/unittests/Tooling/RefactoringTest.cpp
@@ -244,6 +244,10 @@ public:
return Context.Sources.createFileID(File, SourceLocation(), SrcMgr::C_User);
}
+ StringRef getFilePath(llvm::StringRef Name) {
+ return TemporaryFiles.lookup(Name);
+ }
+
std::string getFileContentFromDisk(llvm::StringRef Name) {
std::string Path = TemporaryFiles.lookup(Name);
assert(!Path.empty());
@@ -270,6 +274,55 @@ TEST_F(FlushRewrittenFilesTest, StoresChangesOnDisk) {
getFileContentFromDisk("input.cpp"));
}
+TEST_F(FlushRewrittenFilesTest, GetFilePath) {
+ // Create a temporary file.
+ createFile("input.cpp", "line1\nline2\nline3\nline4");
+
+ StringRef FilePath = getFilePath("input.cpp");
+ StringRef TempPath = llvm::sys::path::parent_path(FilePath);
+ StringRef TempFile = llvm::sys::path::filename(FilePath);
+
+ // Save current path.
+ SmallString<512> CurrentPath;
+ llvm::sys::fs::current_path(CurrentPath);
+
+ // Change directory to the temporary directory.
+ EXPECT_FALSE(chdir(TempPath.str().c_str()));
+ llvm::sys::fs::current_path(CurrentPath);
+
+ // Get a FileEntry from the current directory.
+ FileManager Files((FileSystemOptions()));
+ const FileEntry *Entry = Files.getFile(TempFile);
+ ASSERT_TRUE(Entry != NULL);
+
+ // We expect to get just the filename and "." in the FileEntry
+ // since paths are relative to the current directory.
+ EXPECT_EQ(TempFile, Entry->getName());
+ EXPECT_STREQ(".", Entry->getDir()->getName());
+
+ FileID ID = Context.Sources.createFileID(Entry, SourceLocation(),
+ SrcMgr::C_User);
+
+ Replacement R = Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+ 5, "replaced");
+
+ // Change back to the original path so we can verify that replacements
+ // are being applied independently of the location.
+ EXPECT_EQ(0, chdir(CurrentPath.c_str()));
+
+ // We expect that the file path of the replacement is using the absolute
+ // path.
+ EXPECT_EQ(R.getFilePath(), getFilePath("input.cpp"));
+
+ // Apply replacements.
+ Replacements Replaces;
+ Replaces.insert(R);
+ EXPECT_TRUE(applyAllReplacements(Replaces, Context.Rewrite));
+ EXPECT_FALSE(Context.Rewrite.overwriteChangedFiles());
+ EXPECT_EQ("line1\nreplaced\nline3\nline4",
+ getFileContentFromDisk("input.cpp"));
+}
+
namespace {
template <typename T>
class TestVisitor : public clang::RecursiveASTVisitor<T> {
OpenPOWER on IntegriCloud