Author: Nathan James Date: 2023-04-14T17:51:45+01:00 New Revision: 2eb9cc76a6c0b61fcf75b747258e27b7b7683ca1
URL: https://github.com/llvm/llvm-project/commit/2eb9cc76a6c0b61fcf75b747258e27b7b7683ca1 DIFF: https://github.com/llvm/llvm-project/commit/2eb9cc76a6c0b61fcf75b747258e27b7b7683ca1.diff LOG: [clangd] Handle destructors in DefineOutline tweak Fix destructors being incorrectly defined in the DefineOutline tweak Currently it doesn't prepend the class name to the destructor ```lang=c++ class A { ~A() {} }; // Destructor definition after outline ~A() {} // After this fix A::~A() {} ``` Reviewed By: kadircet Differential Revision: https://reviews.llvm.org/D147802 Added: Modified: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp index 95334c49bfb6e..f883397aaaf1e 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -183,6 +183,20 @@ getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace, }, Resolver); + // findExplicitReferences doesn't provide references to + // constructor/destructors, it only provides references to type names inside + // them. + // this works for constructors, but doesn't work for destructor as type name + // doesn't cover leading `~`, so handle it specially. + if (const auto *Destructor = llvm::dyn_cast<CXXDestructorDecl>(FD)) { + if (auto Err = DeclarationCleanups.add(tooling::Replacement( + SM, Destructor->getLocation(), 0, + getQualification(AST, *TargetContext, + SM.getLocForStartOfFile(SM.getMainFileID()), + Destructor)))) + Errors = llvm::joinErrors(std::move(Errors), std::move(Err)); + } + // Get rid of default arguments, since they should not be specified in // out-of-line definition. for (const auto *PVD : FD->parameters()) { diff --git a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp index c6c9684ffa4fa..fd6d4d72e63ec 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp @@ -319,6 +319,12 @@ TEST_F(DefineOutlineTest, ApplyTest) { };)cpp", " Foo::Foo(int) {}\n", }, + // Destrctors + { + "class A { ~A^(){} };", + "class A { ~A(); };", + "A::~A(){} ", + }, }; for (const auto &Case : Cases) { SCOPED_TRACE(Case.Test); @@ -532,6 +538,18 @@ TEST_F(DefineOutlineTest, QualifyFunctionName) { // account. This can be spelled as b::foo instead. "using namespace a;void a::b::foo() {} ", }, + { + "namespace a { class A { ~A^(){} }; }", + "", + "namespace a { class A { ~A(); }; }", + "a::A::~A(){} ", + }, + { + "namespace a { class A { ~A^(){} }; }", + "namespace a{}", + "namespace a { class A { ~A(); }; }", + "namespace a{A::~A(){} }", + }, }; llvm::StringMap<std::string> EditedFiles; for (auto &Case : Cases) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits