kbobyrev created this revision. kbobyrev added a reviewer: hokein. Herald added subscribers: cfe-commits, usaxena95, kadircet, arphaman. Herald added a project: clang. kbobyrev requested review of this revision. Herald added subscribers: MaskRay, ilya-biryukov.
Follow-up on D91952 <https://reviews.llvm.org/D91952> and D71880 <https://reviews.llvm.org/D71880>. Fixes: https://github.com/clangd/clangd/issues/604 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D92220 Files: clang-tools-extra/clangd/refactor/Rename.cpp clang-tools-extra/clangd/unittests/RenameTests.cpp Index: clang-tools-extra/clangd/unittests/RenameTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/RenameTests.cpp +++ clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -627,6 +627,30 @@ bool LocalBool = Foo<bool>::[[Var^iable]]; } )cpp", + R"cpp( + template <typename T, typename U> struct Foo { static T Variable; }; + + template <typename T> struct Foo<T, bool> { + static T [[Var^iable]]; + }; + + void test() { + Foo<int, bool>::[[Var^iable]] = 5; + } + )cpp", + R"cpp( + template <typename T, typename U> struct Foo { + static T [[Var^iable]]; + }; + + template <typename T> struct Foo<T, bool> { + static T Variable; + }; + + void test() { + Foo<int, int>::[[Var^iable]] = 5; + } + )cpp", // Template parameters. R"cpp( Index: clang-tools-extra/clangd/refactor/Rename.cpp =================================================================== --- clang-tools-extra/clangd/refactor/Rename.cpp +++ clang-tools-extra/clangd/refactor/Rename.cpp @@ -144,7 +144,16 @@ if (const auto *VD = dyn_cast<VarDecl>(D)) { if (const VarDecl *OriginalVD = VD->getInstantiatedFromStaticDataMember()) VD = OriginalVD; - return VD->getCanonicalDecl(); + VD = VD->getCanonicalDecl(); + const auto *Context = VD->getDeclContext()->getParent(); + if (!Context || Context->getDeclKind() != Decl::Kind::CXXRecord) + return VD; + const auto LookupResult = Context->lookup(D->getDeclName()); + if (LookupResult.size() != 1) + return VD; + if (const auto *Result = dyn_cast<VarDecl>(LookupResult.front())) + return Result->getCanonicalDecl(); + return VD; } return dyn_cast<NamedDecl>(D->getCanonicalDecl()); }
Index: clang-tools-extra/clangd/unittests/RenameTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/RenameTests.cpp +++ clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -627,6 +627,30 @@ bool LocalBool = Foo<bool>::[[Var^iable]]; } )cpp", + R"cpp( + template <typename T, typename U> struct Foo { static T Variable; }; + + template <typename T> struct Foo<T, bool> { + static T [[Var^iable]]; + }; + + void test() { + Foo<int, bool>::[[Var^iable]] = 5; + } + )cpp", + R"cpp( + template <typename T, typename U> struct Foo { + static T [[Var^iable]]; + }; + + template <typename T> struct Foo<T, bool> { + static T Variable; + }; + + void test() { + Foo<int, int>::[[Var^iable]] = 5; + } + )cpp", // Template parameters. R"cpp( Index: clang-tools-extra/clangd/refactor/Rename.cpp =================================================================== --- clang-tools-extra/clangd/refactor/Rename.cpp +++ clang-tools-extra/clangd/refactor/Rename.cpp @@ -144,7 +144,16 @@ if (const auto *VD = dyn_cast<VarDecl>(D)) { if (const VarDecl *OriginalVD = VD->getInstantiatedFromStaticDataMember()) VD = OriginalVD; - return VD->getCanonicalDecl(); + VD = VD->getCanonicalDecl(); + const auto *Context = VD->getDeclContext()->getParent(); + if (!Context || Context->getDeclKind() != Decl::Kind::CXXRecord) + return VD; + const auto LookupResult = Context->lookup(D->getDeclName()); + if (LookupResult.size() != 1) + return VD; + if (const auto *Result = dyn_cast<VarDecl>(LookupResult.front())) + return Result->getCanonicalDecl(); + return VD; } return dyn_cast<NamedDecl>(D->getCanonicalDecl()); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits