[clangd] Fix a regression issue in local rename.

Summary:
The regression is that we can't rename symbols in annonymous
namespaces.

Reviewers: ilya-biryukov

Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D70853
This commit is contained in:
Haojian Wu 2019-11-29 14:58:44 +01:00
parent c653a52c85
commit 902dc6c69c
2 changed files with 20 additions and 7 deletions

View File

@ -123,20 +123,26 @@ llvm::Optional<ReasonToReject> renameable(const Decl &RenameDecl,
if (RenameDecl.getParentFunctionOrMethod())
return None;
// Check whether the symbol being rename is indexable.
auto &ASTCtx = RenameDecl.getASTContext();
bool MainFileIsHeader = isHeaderFile(MainFilePath, ASTCtx.getLangOpts());
bool DeclaredInMainFile =
isInsideMainFile(RenameDecl.getBeginLoc(), ASTCtx.getSourceManager());
bool IsMainFileOnly = true;
if (MainFileIsHeader)
// main file is a header, the symbol can't be main file only.
IsMainFileOnly = false;
else if (!DeclaredInMainFile)
IsMainFileOnly = false;
bool IsIndexable =
isa<NamedDecl>(RenameDecl) &&
SymbolCollector::shouldCollectSymbol(
cast<NamedDecl>(RenameDecl), RenameDecl.getASTContext(),
SymbolCollector::Options(), CrossFile);
SymbolCollector::Options(), IsMainFileOnly);
if (!IsIndexable) // If the symbol is not indexable, we disallow rename.
return ReasonToReject::NonIndexable;
if (!CrossFile) {
auto &ASTCtx = RenameDecl.getASTContext();
const auto &SM = ASTCtx.getSourceManager();
bool MainFileIsHeader = isHeaderFile(MainFilePath, ASTCtx.getLangOpts());
bool DeclaredInMainFile = isInsideMainFile(RenameDecl.getBeginLoc(), SM);
if (!DeclaredInMainFile)
// We are sure the symbol is used externally, bail out early.
return ReasonToReject::UsedOutsideFile;

View File

@ -450,13 +450,20 @@ TEST(RenameTest, Renameable) {
)cpp",
"used outside main file", HeaderFile, Index},
{R"cpp(// disallow -- symbol is not indexable.
{R"cpp(// disallow -- symbol in annonymous namespace in header is not indexable.
namespace {
class Unin^dexable {};
}
)cpp",
"not eligible for indexing", HeaderFile, Index},
{R"cpp(// allow -- symbol in annonymous namespace in non-header file is indexable.
namespace {
class [[F^oo]] {};
}
)cpp",
nullptr, !HeaderFile, Index},
{R"cpp(// disallow -- namespace symbol isn't supported
namespace n^s {}
)cpp",