[clangd] Don't rename on symbols from system headers.

Fixes https://github.com/clangd/clangd/issues/963.

Differential Revision: https://reviews.llvm.org/D116643
This commit is contained in:
Haojian Wu 2022-01-05 10:42:45 +01:00
parent aa7f0e6a55
commit 192f8d9700
2 changed files with 32 additions and 5 deletions

View File

@ -159,13 +159,17 @@ llvm::DenseSet<const NamedDecl *> locateDeclAt(ParsedAST &AST,
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<llvm::StringRef>({
#define SYMBOL(Name, NameSpace, Header) {#NameSpace #Name},
#include "StdSymbolMap.inc"

View File

@ -1198,6 +1198,29 @@ TEST(RenameTest, MainFileReferencesOnly) {
expectedResult(Code, NewName));
}
TEST(RenameTest, NoRenameOnSymbolsFromSystemHeaders) {
// filter out references not from main file.
llvm::StringRef Test =
R"cpp(
#include <system>
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());