From 41294e70b4eacfbeecc9244ccb017ef6e01e4cd8 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 16 Jan 2023 12:49:58 +0100 Subject: [PATCH] TextEditor: prevent crash on updating the completion model Prevent updating the model with something other than a generic proposal model. Change-Id: I3880c1ce4ae7cf0aa4fb72d59b75a40db3f53482 Reviewed-by: hjk Reviewed-by: Christian Stenger --- .../languageclient/languageclientcompletionassist.cpp | 7 ++++++- .../texteditor/codeassist/genericproposalwidget.cpp | 4 ++-- src/plugins/texteditor/codeassist/genericproposalwidget.h | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index 96e54204fc3..f0b66facc18 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -289,7 +289,12 @@ public: { if (!proposal) return; - updateModel(proposal->model(), prefix); + if (proposal->id() != TextEditor::Constants::GENERIC_PROPOSAL_ID) { + // We received something else than a generic proposal so we cannot update the model + closeProposal(); + return; + } + updateModel(proposal->model().staticCast(), prefix); delete proposal; } diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index 708c6d3654b..81a85b23ff1 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -392,12 +392,12 @@ void GenericProposalWidget::setIsSynchronized(bool isSync) d->m_isSynchronized = isSync; } -void GenericProposalWidget::updateModel(ProposalModelPtr model, const QString &prefix) +void GenericProposalWidget::updateModel(GenericProposalModelPtr model, const QString &prefix) { QString currentText; if (d->m_explicitlySelected) currentText = d->m_model->text(d->m_completionListView->currentIndex().row()); - d->m_model = model.staticCast(); + d->m_model = model; if (d->m_model->containsDuplicates()) d->m_model->removeDuplicates(); d->m_completionListView->setModel(new ModelAdapter(d->m_model, d->m_completionListView)); diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.h b/src/plugins/texteditor/codeassist/genericproposalwidget.h index 893069e8cf6..4aab14514ce 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.h +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.h @@ -31,7 +31,7 @@ public: void setDisplayRect(const QRect &rect) override; void setIsSynchronized(bool isSync) override; - void updateModel(ProposalModelPtr model, const QString &prefix); + void updateModel(GenericProposalModelPtr model, const QString &prefix); void showProposal(const QString &prefix) override; void filterProposal(const QString &prefix) override;