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: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2023-01-18 14:45:59 +01:00
parent 534e1f34b2
commit 7b5c5b774f
2 changed files with 15 additions and 11 deletions

View File

@@ -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<PlaceHolderResult>(*result)) {
auto placeHolderResult = std::get<PlaceHolderResult>(*result);
startRenameSymbol(params,
placeHolderResult.placeHolder(),
placeholder.isEmpty() ? placeHolderResult.placeHolder()
: placeholder,
oldSymbolName,
preferLowerCaseFileNames);
} else if (std::holds_alternative<Range>(*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<Core::SearchResultItem> &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) {

View File

@@ -75,6 +75,7 @@ private:
void handleRenameResponse(Core::SearchResult *search,
const LanguageServerProtocol::RenameRequest::Response &response);
void applyRename(const QList<Core::SearchResultItem> &checkedItems, Core::SearchResult *search);
QString derivePlaceholder(const QString &oldSymbol, const QString &newSymbol);
Client *m_client = nullptr;
SymbolMapper m_defaultSymbolMapper;