summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein.wu@gmail.com>2019-11-29 14:58:44 +0100
committerHaojian Wu <hokein.wu@gmail.com>2019-12-02 10:32:55 +0100
commit902dc6c69ce7985427efa103a7c4099c372da6fa (patch)
treed298d43cab6dc8621f858a2ac812d25bb74725d0
parentc653a52c85ff913bcbef007082763dbc754d6933 (diff)
downloadbcm5719-llvm-902dc6c69ce7985427efa103a7c4099c372da6fa.tar.gz
bcm5719-llvm-902dc6c69ce7985427efa103a7c4099c372da6fa.zip
[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
-rw-r--r--clang-tools-extra/clangd/refactor/Rename.cpp18
-rw-r--r--clang-tools-extra/clangd/unittests/RenameTests.cpp9
2 files changed, 20 insertions, 7 deletions
diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp
index 6a3439cc061..7d74641be71 100644
--- a/clang-tools-extra/clangd/refactor/Rename.cpp
+++ b/clang-tools-extra/clangd/refactor/Rename.cpp
@@ -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;
diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp
index 0615272de37..1ade0c0443b 100644
--- a/clang-tools-extra/clangd/unittests/RenameTests.cpp
+++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp
@@ -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",
OpenPOWER on IntegriCloud