From e6b8791fa9ee3c0d4e4fd865da5f86ca21dfab12 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 21 Aug 2023 15:18:55 +0200 Subject: [PATCH] LanguageClient: correctly cancel running rename request When requesting rename results while we have not received the response to the previous rename request, we have to cancel that previous request otherwise we end up with duplicated replace operations that potentially can invalidate the document. Task-number: QTCREATORBUG-29389 Change-Id: I3be425b8306c18b64fca7bb71bf65c32ae50fed1 Reviewed-by: Christian Stenger --- .../languageclient/languageclientsymbolsupport.cpp | 10 +++++++--- .../languageclient/languageclientsymbolsupport.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 546ad068e4b..822d910ecf3 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -452,21 +452,24 @@ void SymbolSupport::requestPrepareRename(TextEditor::TextDocument *document, void SymbolSupport::requestRename(const TextDocumentPositionParams &positionParams, Core::SearchResult *search) { + if (m_renameRequestIds[search].isValid()) + m_client->cancelRequest(m_renameRequestIds[search]); RenameParams params(positionParams); params.setNewName(search->textToReplace()); RenameRequest request(params); request.setResponseCallback([this, search](const RenameRequest::Response &response) { handleRenameResponse(search, response); }); + m_renameRequestIds[search] = request.id(); m_client->sendMessage(request); if (search->isInteractive()) search->popup(); } Utils::SearchResultItems generateReplaceItems(const WorkspaceEdit &edits, - Core::SearchResult *search, - bool limitToProjects, - const DocumentUri::PathMapper &pathMapper) + Core::SearchResult *search, + bool limitToProjects, + const DocumentUri::PathMapper &pathMapper) { auto convertEdits = [](const QList &edits) { return Utils::transform(edits, [](const TextEdit &edit) { @@ -546,6 +549,7 @@ void SymbolSupport::startRenameSymbol(const TextDocumentPositionParams &position void SymbolSupport::handleRenameResponse(Core::SearchResult *search, const RenameRequest::Response &response) { + m_renameRequestIds.remove(search); const std::optional &error = response.error(); QString errorMessage; if (error.has_value()) { diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 3dcc7b0ddc3..a46ac4273a3 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -78,6 +78,7 @@ private: Client *m_client = nullptr; SymbolMapper m_defaultSymbolMapper; + QHash m_renameRequestIds; bool m_limitRenamingToProjects = false; };