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 @@ -159,13 +159,17 @@ return Result; } -// By default, we exclude C++ standard symbols and protobuf symbols as rename -// these symbols would change system/generated files which are unlikely to be -// modified. +// By default, we exclude symbols from system headers and protobuf symbols as +// renaming these symbols would change system/generated files which are unlikely +// to be good candidates for modification. bool isExcluded(const NamedDecl &RenameDecl) { - if (isProtoFile(RenameDecl.getLocation(), - RenameDecl.getASTContext().getSourceManager())) + const auto &SM = RenameDecl.getASTContext().getSourceManager(); + if (SM.isInSystemHeader(RenameDecl.getLocation())) return true; + if (isProtoFile(RenameDecl.getLocation(), SM)) + return true; + // FIXME: Remove this std symbol list, as they should be covered by the + // above isInSystemHeader check. static const auto *StdSymbols = new llvm::DenseSet({ #define SYMBOL(Name, NameSpace, Header) {#NameSpace #Name}, #include "StdSymbolMap.inc" 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 @@ -1198,6 +1198,29 @@ expectedResult(Code, NewName)); } +TEST(RenameTest, NoRenameOnSymbolsFromSystemHeaders) { + // filter out references not from main file. + llvm::StringRef Test = + R"cpp( + #include + SystemSym^bol abc; + )cpp"; + + Annotations Code(Test); + auto TU = TestTU::withCode(Code.code()); + TU.AdditionalFiles["system"] = R"cpp( + class SystemSymbol {}; + )cpp"; + TU.ExtraArgs = {"-isystem", testRoot()}; + auto AST = TU.build(); + llvm::StringRef NewName = "abcde"; + + auto Results = rename({Code.point(), NewName, AST, testPath(TU.Filename)}); + EXPECT_FALSE(Results) << "expected rename returned an error: " << Code.code(); + auto ActualMessage = llvm::toString(Results.takeError()); + EXPECT_THAT(ActualMessage, testing::HasSubstr("not a supported kind")); +} + TEST(RenameTest, ProtobufSymbolIsExcluded) { Annotations Code("Prot^obuf buf;"); auto TU = TestTU::withCode(Code.code());