LanguageClient: robustify renaming symbols

Guard against using a symbol support from a deleted client. Additionally
cancel active replace operations and provide a sensible error message.

Change-Id: I92ca0038fa5f6acbb8369a48c4e8051adfadb30e
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2022-12-08 14:47:24 +01:00
parent 55ba10be38
commit 6d8f6ab395
2 changed files with 21 additions and 20 deletions

View File

@@ -285,11 +285,9 @@ void SymbolSupport::handleFindReferencesResponse(const FindReferencesRequest::Re
Core::SearchResult *search = Core::SearchResultWindow::instance()->startNewSearch(
tr("Find References with %1 for:").arg(m_client->name()), "", wordUnderCursor);
search->addResults(generateSearchResultItems(*result), Core::SearchResult::AddOrdered);
QObject::connect(search,
&Core::SearchResult::activated,
[](const Core::SearchResultItem &item) {
Core::EditorManager::openEditorAtSearchResult(item);
});
connect(search, &Core::SearchResult::activated, [](const Core::SearchResultItem &item) {
Core::EditorManager::openEditorAtSearchResult(item);
});
search->finishSearch(false);
search->popup();
}
@@ -493,27 +491,30 @@ Core::SearchResult *SymbolSupport::createSearch(
const auto extraWidget = new ReplaceWidget;
search->setAdditionalReplaceWidget(extraWidget);
QObject::connect(search, &Core::SearchResult::activated, [](const Core::SearchResultItem &item) {
connect(search, &Core::SearchResult::activated, [](const Core::SearchResultItem &item) {
Core::EditorManager::openEditorAtSearchResult(item);
});
QObject::connect(search, &Core::SearchResult::replaceTextChanged, [search, extraWidget]() {
connect(search, &Core::SearchResult::replaceTextChanged, this, [search, extraWidget]() {
extraWidget->showLabel(true);
search->setUserData(search->userData().toList().first(2));
search->setSearchAgainEnabled(true);
search->setReplaceEnabled(false);
});
QObject::connect(search,
&Core::SearchResult::searchAgainRequested,
[this, positionParams, search]() {
search->restart();
requestRename(positionParams, search->textToReplace(), search);
});
QObject::connect(search,
&Core::SearchResult::replaceButtonClicked,
[this, positionParams, search](const QString & /*replaceText*/,
const QList<Core::SearchResultItem> &checkedItems) {
applyRename(checkedItems, search);
});
connect(search, &Core::SearchResult::searchAgainRequested, this,
[this, positionParams, search]() {
search->restart();
requestRename(positionParams, search->textToReplace(), search);
});
connect(search, &Core::SearchResult::replaceButtonClicked, this,
[this, positionParams, search](const QString & /*replaceText*/,
const QList<Core::SearchResultItem> &checkedItems) {
applyRename(checkedItems, search);
});
connect(this, &QObject::destroyed, search, [search, clientName = m_client->name()](){
search->restart(); // clears potential current results
search->finishSearch(true, tr("%1 is not reachable anymore.").arg(clientName));
});
return search;
}

View File

@@ -23,7 +23,7 @@ namespace LanguageClient {
class Client;
class LANGUAGECLIENT_EXPORT SymbolSupport
class LANGUAGECLIENT_EXPORT SymbolSupport : public QObject
{
Q_DECLARE_TR_FUNCTIONS(SymbolSupport)
public: