forked from qt-creator/qt-creator
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 <christian.stenger@qt.io>
This commit is contained in:
@@ -452,12 +452,15 @@ void SymbolSupport::requestPrepareRename(TextEditor::TextDocument *document,
|
|||||||
void SymbolSupport::requestRename(const TextDocumentPositionParams &positionParams,
|
void SymbolSupport::requestRename(const TextDocumentPositionParams &positionParams,
|
||||||
Core::SearchResult *search)
|
Core::SearchResult *search)
|
||||||
{
|
{
|
||||||
|
if (m_renameRequestIds[search].isValid())
|
||||||
|
m_client->cancelRequest(m_renameRequestIds[search]);
|
||||||
RenameParams params(positionParams);
|
RenameParams params(positionParams);
|
||||||
params.setNewName(search->textToReplace());
|
params.setNewName(search->textToReplace());
|
||||||
RenameRequest request(params);
|
RenameRequest request(params);
|
||||||
request.setResponseCallback([this, search](const RenameRequest::Response &response) {
|
request.setResponseCallback([this, search](const RenameRequest::Response &response) {
|
||||||
handleRenameResponse(search, response);
|
handleRenameResponse(search, response);
|
||||||
});
|
});
|
||||||
|
m_renameRequestIds[search] = request.id();
|
||||||
m_client->sendMessage(request);
|
m_client->sendMessage(request);
|
||||||
if (search->isInteractive())
|
if (search->isInteractive())
|
||||||
search->popup();
|
search->popup();
|
||||||
@@ -546,6 +549,7 @@ void SymbolSupport::startRenameSymbol(const TextDocumentPositionParams &position
|
|||||||
void SymbolSupport::handleRenameResponse(Core::SearchResult *search,
|
void SymbolSupport::handleRenameResponse(Core::SearchResult *search,
|
||||||
const RenameRequest::Response &response)
|
const RenameRequest::Response &response)
|
||||||
{
|
{
|
||||||
|
m_renameRequestIds.remove(search);
|
||||||
const std::optional<PrepareRenameRequest::Response::Error> &error = response.error();
|
const std::optional<PrepareRenameRequest::Response::Error> &error = response.error();
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
if (error.has_value()) {
|
if (error.has_value()) {
|
||||||
|
@@ -78,6 +78,7 @@ private:
|
|||||||
|
|
||||||
Client *m_client = nullptr;
|
Client *m_client = nullptr;
|
||||||
SymbolMapper m_defaultSymbolMapper;
|
SymbolMapper m_defaultSymbolMapper;
|
||||||
|
QHash<Core::SearchResult *, LanguageServerProtocol::MessageId> m_renameRequestIds;
|
||||||
bool m_limitRenamingToProjects = false;
|
bool m_limitRenamingToProjects = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user