This revision was automatically updated to reflect the committed changes. Closed by commit rG2eb9cc76a6c0: [clangd] Handle destructors in DefineOutline tweak (authored by njames93).
Changed prior to commit: https://reviews.llvm.org/D147802?vs=511780&id=513644#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D147802/new/ https://reviews.llvm.org/D147802 Files: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp Index: clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp +++ clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp @@ -319,6 +319,12 @@ };)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 @@ // 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) { Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -183,6 +183,20 @@ }, 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()) {
Index: clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp +++ clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp @@ -319,6 +319,12 @@ };)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 @@ // 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) { Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -183,6 +183,20 @@ }, 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()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits