diff --git a/clang-tools-extra/clangd/refactor/Rename.h b/clang-tools-extra/clangd/refactor/Rename.h --- a/clang-tools-extra/clangd/refactor/Rename.h +++ b/clang-tools-extra/clangd/refactor/Rename.h @@ -50,7 +50,8 @@ /// Generates rename edits that replaces all given occurrences with the /// NewName. /// Exposed for testing only. -llvm::Expected buildRenameEdit(llvm::StringRef InitialCode, +llvm::Expected buildRenameEdit(llvm::StringRef AbsFilePath, + llvm::StringRef InitialCode, std::vector Occurrences, llvm::StringRef NewName); diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -349,8 +349,9 @@ elog("Fail to read file content: {0}", AffectedFileCode.takeError()); continue; } - auto RenameEdit = buildRenameEdit( - *AffectedFileCode, std::move(FileAndOccurrences.second), NewName); + auto RenameEdit = + buildRenameEdit(FilePath, *AffectedFileCode, + std::move(FileAndOccurrences.second), NewName); if (!RenameEdit) { return llvm::make_error( llvm::formatv("fail to build rename edit for file {0}: {1}", FilePath, @@ -451,7 +452,8 @@ return Results; } -llvm::Expected buildRenameEdit(llvm::StringRef InitialCode, +llvm::Expected buildRenameEdit(llvm::StringRef AbsFilePath, + llvm::StringRef InitialCode, std::vector Occurrences, llvm::StringRef NewName) { llvm::sort(Occurrences); @@ -491,7 +493,7 @@ for (const auto &R : OccurrencesOffsets) { auto ByteLength = R.second - R.first; if (auto Err = RenameEdit.add( - tooling::Replacement(InitialCode, R.first, ByteLength, NewName))) + tooling::Replacement(AbsFilePath, R.first, ByteLength, NewName))) return std::move(Err); } return Edit(InitialCode, std::move(RenameEdit)); diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp --- a/clang-tools-extra/clangd/unittests/RenameTests.cpp +++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -669,14 +669,16 @@ TEST(CrossFileRenameTests, BuildRenameEdits) { Annotations Code("[[😂]]"); auto LSPRange = Code.range(); - auto Edit = buildRenameEdit(Code.code(), {LSPRange}, "abc"); + llvm::StringRef FilePath = "/test/TestTU.cpp"; + auto Edit = buildRenameEdit(FilePath, Code.code(), {LSPRange}, "abc"); ASSERT_TRUE(bool(Edit)) << Edit.takeError(); ASSERT_EQ(1UL, Edit->Replacements.size()); + EXPECT_EQ(FilePath, Edit->Replacements.begin()->getFilePath()); EXPECT_EQ(4UL, Edit->Replacements.begin()->getLength()); // Test invalid range. LSPRange.end = {10, 0}; // out of range - Edit = buildRenameEdit(Code.code(), {LSPRange}, "abc"); + Edit = buildRenameEdit(FilePath, Code.code(), {LSPRange}, "abc"); EXPECT_FALSE(Edit); EXPECT_THAT(llvm::toString(Edit.takeError()), testing::HasSubstr("fail to convert")); @@ -687,7 +689,7 @@ [[range]] [[range]] )cpp"); - Edit = buildRenameEdit(T.code(), T.ranges(), "abc"); + Edit = buildRenameEdit(FilePath, T.code(), T.ranges(), "abc"); ASSERT_TRUE(bool(Edit)) << Edit.takeError(); EXPECT_EQ(applyEdits(FileEdits{{T.code(), std::move(*Edit)}}).front().second, expectedResult(Code, expectedResult(T, "abc")));