From 08002c6278383363838d36fba05946f53e5152f7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 7 Nov 2022 12:02:07 +0100 Subject: [PATCH] Editor: delete assist interface in lsp/clangd support The complete memory management in the code assistant needs an overhaul. For now just delete or at least track the assist interface with scoped pointers. Fixes: QTCREATORBUG-28408 Change-Id: I0bd4cfaa36a660b6fd5bb467af3b13414ed76e63 Reviewed-by: Jarek Kobus Reviewed-by: Christian Kandeler Reviewed-by: --- src/plugins/clangcodemodel/clangdcompletion.cpp | 1 + src/plugins/clangcodemodel/clangdfollowsymbol.cpp | 4 +++- .../languageclient/languageclientcompletionassist.cpp | 7 ++++--- .../languageclient/languageclientcompletionassist.h | 3 ++- src/plugins/languageclient/languageclientfunctionhint.cpp | 3 +++ src/plugins/texteditor/codeassist/iassistprocessor.h | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdcompletion.cpp b/src/plugins/clangcodemodel/clangdcompletion.cpp index 0263380ab87..921b3aa19e8 100644 --- a/src/plugins/clangcodemodel/clangdcompletion.cpp +++ b/src/plugins/clangcodemodel/clangdcompletion.cpp @@ -417,6 +417,7 @@ IAssistProposal *CustomAssistProcessor::perform(const AssistInterface *interface break; } } + delete interface; GenericProposalModelPtr model(new GenericProposalModel); model->loadContent(completions); const auto proposal = new GenericProposal(m_position, model); diff --git a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp index 8c249d30727..7765dee2336 100644 --- a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp +++ b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -41,8 +42,9 @@ public: void resetData(bool resetFollowSymbolData); private: - IAssistProposal *perform(const AssistInterface *) override + IAssistProposal *perform(const AssistInterface *interface) override { + delete interface; return nullptr; } diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index fd8346962a5..2c757d7808f 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -293,7 +293,8 @@ LanguageClientCompletionAssistProcessor::~LanguageClientCompletionAssistProcesso QTextDocument *LanguageClientCompletionAssistProcessor::document() const { - return m_document; + QTC_ASSERT(m_assistInterface, return nullptr); + return m_assistInterface->textDocument(); } QList LanguageClientCompletionAssistProcessor::generateCompletionItems( @@ -315,6 +316,7 @@ static QString assistReasonString(AssistReason reason) IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistInterface *interface) { + m_assistInterface.reset(interface); QTC_ASSERT(m_client, return nullptr); m_pos = interface->position(); m_basePos = m_pos; @@ -366,7 +368,6 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn m_client->sendMessage(completionRequest); m_client->addAssistProcessor(this); m_currentRequest = completionRequest.id(); - m_document = interface->textDocument(); m_filePath = interface->filePath(); qCDebug(LOGLSPCOMPLETION) << QTime::currentTime() << " : request completions at " << m_pos @@ -425,7 +426,7 @@ void LanguageClientCompletionAssistProcessor::handleCompletionResponse( model->loadContent(proposalItems); LanguageClientCompletionProposal *proposal = new LanguageClientCompletionProposal(m_basePos, model); - proposal->m_document = m_document; + proposal->m_document = m_assistInterface->textDocument(); proposal->m_pos = m_pos; proposal->setSupportsPrefix(false); setAsyncProposalAvailable(proposal); diff --git a/src/plugins/languageclient/languageclientcompletionassist.h b/src/plugins/languageclient/languageclientcompletionassist.h index e78d1b795e9..2e46df1f092 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.h +++ b/src/plugins/languageclient/languageclientcompletionassist.h @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -74,7 +75,7 @@ protected: private: void handleCompletionResponse(const LanguageServerProtocol::CompletionRequest::Response &response); - QPointer m_document; + QScopedPointer m_assistInterface; Utils::FilePath m_filePath; QPointer m_client; std::optional m_currentRequest; diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index 2b5b46cdfac..c6ac1e190af 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -10,6 +10,8 @@ #include #include +#include + using namespace TextEditor; using namespace LanguageServerProtocol; @@ -66,6 +68,7 @@ FunctionHintProcessor::FunctionHintProcessor(Client *client) IAssistProposal *FunctionHintProcessor::perform(const AssistInterface *interface) { + const QScopedPointer deleter(interface); QTC_ASSERT(m_client, return nullptr); m_pos = interface->position(); QTextCursor cursor(interface->textDocument()); diff --git a/src/plugins/texteditor/codeassist/iassistprocessor.h b/src/plugins/texteditor/codeassist/iassistprocessor.h index 1835b906516..583f3ae973a 100644 --- a/src/plugins/texteditor/codeassist/iassistprocessor.h +++ b/src/plugins/texteditor/codeassist/iassistprocessor.h @@ -19,7 +19,7 @@ public: virtual ~IAssistProcessor(); virtual IAssistProposal *immediateProposal(const AssistInterface *) { return nullptr; } - virtual IAssistProposal *perform(const AssistInterface *interface) = 0; + virtual IAssistProposal *perform(const AssistInterface *interface) = 0; // takes ownership void setAsyncProposalAvailable(IAssistProposal *proposal);