forked from qt-creator/qt-creator
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:
@@ -370,23 +370,21 @@ void SymbolSupport::renameSymbol(TextEditor::TextDocument *document,
|
|||||||
QTextCursor tc = cursor;
|
QTextCursor tc = cursor;
|
||||||
tc.select(QTextCursor::WordUnderCursor);
|
tc.select(QTextCursor::WordUnderCursor);
|
||||||
const QString oldSymbolName = tc.selectedText();
|
const QString oldSymbolName = tc.selectedText();
|
||||||
QString placeholder = newSymbolName;
|
|
||||||
if (placeholder.isEmpty())
|
|
||||||
placeholder = m_defaultSymbolMapper ? m_defaultSymbolMapper(oldSymbolName) : oldSymbolName;
|
|
||||||
|
|
||||||
bool prepareSupported;
|
bool prepareSupported;
|
||||||
if (!LanguageClient::supportsRename(m_client, document, prepareSupported)) {
|
if (!LanguageClient::supportsRename(m_client, document, prepareSupported)) {
|
||||||
const QString error = tr("Renaming is not supported with %1").arg(m_client->name());
|
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) {
|
} else if (prepareSupported) {
|
||||||
requestPrepareRename(document,
|
requestPrepareRename(document,
|
||||||
generateDocPosParams(document, cursor, m_client),
|
generateDocPosParams(document, cursor, m_client),
|
||||||
placeholder,
|
newSymbolName,
|
||||||
oldSymbolName,
|
oldSymbolName,
|
||||||
preferLowerCaseFileNames);
|
preferLowerCaseFileNames);
|
||||||
} else {
|
} else {
|
||||||
startRenameSymbol(generateDocPosParams(document, cursor, m_client),
|
startRenameSymbol(generateDocPosParams(document, cursor, m_client),
|
||||||
placeholder,
|
newSymbolName,
|
||||||
oldSymbolName,
|
oldSymbolName,
|
||||||
preferLowerCaseFileNames);
|
preferLowerCaseFileNames);
|
||||||
}
|
}
|
||||||
@@ -417,7 +415,8 @@ void SymbolSupport::requestPrepareRename(TextEditor::TextDocument *document,
|
|||||||
if (std::holds_alternative<PlaceHolderResult>(*result)) {
|
if (std::holds_alternative<PlaceHolderResult>(*result)) {
|
||||||
auto placeHolderResult = std::get<PlaceHolderResult>(*result);
|
auto placeHolderResult = std::get<PlaceHolderResult>(*result);
|
||||||
startRenameSymbol(params,
|
startRenameSymbol(params,
|
||||||
placeHolderResult.placeHolder(),
|
placeholder.isEmpty() ? placeHolderResult.placeHolder()
|
||||||
|
: placeholder,
|
||||||
oldSymbolName,
|
oldSymbolName,
|
||||||
preferLowerCaseFileNames);
|
preferLowerCaseFileNames);
|
||||||
} else if (std::holds_alternative<Range>(*result)) {
|
} 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 start = range.start().toPositionInDocument(document->document());
|
||||||
const int end = range.end().toPositionInDocument(document->document());
|
const int end = range.end().toPositionInDocument(document->document());
|
||||||
const QString reportedSymbolName = document->textAt(start, end - start);
|
const QString reportedSymbolName = document->textAt(start, end - start);
|
||||||
const QString newPlaceholder = m_defaultSymbolMapper
|
|
||||||
? m_defaultSymbolMapper(reportedSymbolName)
|
|
||||||
: reportedSymbolName;
|
|
||||||
startRenameSymbol(params,
|
startRenameSymbol(params,
|
||||||
newPlaceholder,
|
derivePlaceholder(reportedSymbolName, placeholder),
|
||||||
reportedSymbolName,
|
reportedSymbolName,
|
||||||
preferLowerCaseFileNames);
|
preferLowerCaseFileNames);
|
||||||
} else {
|
} else {
|
||||||
@@ -593,6 +589,13 @@ void SymbolSupport::applyRename(const QList<Core::SearchResultItem> &checkedItem
|
|||||||
userData.at(1).toBool());
|
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)
|
Core::Search::TextRange SymbolSupport::convertRange(const Range &range)
|
||||||
{
|
{
|
||||||
auto convertPosition = [](const Position &pos) {
|
auto convertPosition = [](const Position &pos) {
|
||||||
|
@@ -75,6 +75,7 @@ private:
|
|||||||
void handleRenameResponse(Core::SearchResult *search,
|
void handleRenameResponse(Core::SearchResult *search,
|
||||||
const LanguageServerProtocol::RenameRequest::Response &response);
|
const LanguageServerProtocol::RenameRequest::Response &response);
|
||||||
void applyRename(const QList<Core::SearchResultItem> &checkedItems, Core::SearchResult *search);
|
void applyRename(const QList<Core::SearchResultItem> &checkedItems, Core::SearchResult *search);
|
||||||
|
QString derivePlaceholder(const QString &oldSymbol, const QString &newSymbol);
|
||||||
|
|
||||||
Client *m_client = nullptr;
|
Client *m_client = nullptr;
|
||||||
SymbolMapper m_defaultSymbolMapper;
|
SymbolMapper m_defaultSymbolMapper;
|
||||||
|
Reference in New Issue
Block a user