From 7b5c5b774f9491389ba6d48dd138011f51efc60c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 18 Jan 2023 14:45:59 +0100 Subject: [PATCH] LanguageClient: Fix renaming with pre-set replacement symbol If a caller passes in a fixed new symbol name, it must not be overwritten with one derived from the old symbol name. The problem can be verified with the "convert to camel case" quickfix. Change-Id: I3d3aca692cb8e73535e1ef657608fd13d18ee5df Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- .../languageclientsymbolsupport.cpp | 25 +++++++++++-------- .../languageclientsymbolsupport.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 9df30a8e0cc..03350c3fb5e 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -370,23 +370,21 @@ void SymbolSupport::renameSymbol(TextEditor::TextDocument *document, QTextCursor tc = cursor; tc.select(QTextCursor::WordUnderCursor); const QString oldSymbolName = tc.selectedText(); - QString placeholder = newSymbolName; - if (placeholder.isEmpty()) - placeholder = m_defaultSymbolMapper ? m_defaultSymbolMapper(oldSymbolName) : oldSymbolName; bool prepareSupported; if (!LanguageClient::supportsRename(m_client, document, prepareSupported)) { const QString error = tr("Renaming is not supported with %1").arg(m_client->name()); - createSearch(params, placeholder, {}, {})->finishSearch(true, error); + createSearch(params, derivePlaceholder(oldSymbolName, newSymbolName), + {}, {})->finishSearch(true, error); } else if (prepareSupported) { requestPrepareRename(document, generateDocPosParams(document, cursor, m_client), - placeholder, + newSymbolName, oldSymbolName, preferLowerCaseFileNames); } else { startRenameSymbol(generateDocPosParams(document, cursor, m_client), - placeholder, + newSymbolName, oldSymbolName, preferLowerCaseFileNames); } @@ -417,7 +415,8 @@ void SymbolSupport::requestPrepareRename(TextEditor::TextDocument *document, if (std::holds_alternative(*result)) { auto placeHolderResult = std::get(*result); startRenameSymbol(params, - placeHolderResult.placeHolder(), + placeholder.isEmpty() ? placeHolderResult.placeHolder() + : placeholder, oldSymbolName, preferLowerCaseFileNames); } else if (std::holds_alternative(*result)) { @@ -426,11 +425,8 @@ void SymbolSupport::requestPrepareRename(TextEditor::TextDocument *document, const int start = range.start().toPositionInDocument(document->document()); const int end = range.end().toPositionInDocument(document->document()); const QString reportedSymbolName = document->textAt(start, end - start); - const QString newPlaceholder = m_defaultSymbolMapper - ? m_defaultSymbolMapper(reportedSymbolName) - : reportedSymbolName; startRenameSymbol(params, - newPlaceholder, + derivePlaceholder(reportedSymbolName, placeholder), reportedSymbolName, preferLowerCaseFileNames); } else { @@ -593,6 +589,13 @@ void SymbolSupport::applyRename(const QList &checkedItem userData.at(1).toBool()); } +QString SymbolSupport::derivePlaceholder(const QString &oldSymbol, const QString &newSymbol) +{ + if (!newSymbol.isEmpty()) + return newSymbol; + return m_defaultSymbolMapper ? m_defaultSymbolMapper(oldSymbol) : oldSymbol; +} + Core::Search::TextRange SymbolSupport::convertRange(const Range &range) { auto convertPosition = [](const Position &pos) { diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 9ca46f3fec9..7add57ba376 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -75,6 +75,7 @@ private: void handleRenameResponse(Core::SearchResult *search, const LanguageServerProtocol::RenameRequest::Response &response); void applyRename(const QList &checkedItems, Core::SearchResult *search); + QString derivePlaceholder(const QString &oldSymbol, const QString &newSymbol); Client *m_client = nullptr; SymbolMapper m_defaultSymbolMapper;