diff options
author | David Schulz <david.schulz@qt.io> | 2023-04-28 14:04:50 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2023-05-02 12:08:04 +0000 |
commit | ba5e09f03f27e9454794e1658a764c3ad67ed946 (patch) | |
tree | cacdfe00b2161b42f7ae6826405dc43244284681 | |
parent | 8aecf0d74935e9cb505eedbbfeedf531fd90a725 (diff) |
TextEditor: always return a valid assist interface
It is required for updating currently visible proposals. Also guard
against potential null assist interfaces.
Amends 0bd6d7a69fab1cc622f6e00ee63a15c666967e0d
Fixes: QTCREATORBUG-29096
Change-Id: Ic34d70561b471e7e529f2fb7c239b49712aca502
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
-rw-r--r-- | src/plugins/cppeditor/cppeditorwidget.cpp | 20 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppquickfixassistant.cpp | 3 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditor.cpp | 2 | ||||
-rw-r--r-- | src/plugins/texteditor/codeassist/codeassistant.cpp | 9 |
4 files changed, 16 insertions, 18 deletions
diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index 20fe8e6254..0430f210a0 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -1267,20 +1267,16 @@ std::unique_ptr<AssistInterface> CppEditorWidget::createAssistInterface(AssistKi if (cap) return cap->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason); - else { - if (isOldStyleSignalOrSlot()) - return CppModelManager::instance() - ->completionAssistProvider() - ->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason); - return TextEditorWidget::createAssistInterface(kind, reason); + + if (isOldStyleSignalOrSlot()) { + return CppModelManager::instance() + ->completionAssistProvider() + ->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason); } - } else if (kind == QuickFix) { - if (isSemanticInfoValid()) - return std::make_unique<CppQuickFixInterface>(const_cast<CppEditorWidget *>(this), reason); - } else { - return TextEditorWidget::createAssistInterface(kind, reason); } - return nullptr; + if (kind == QuickFix && isSemanticInfoValid()) + return std::make_unique<CppQuickFixInterface>(const_cast<CppEditorWidget *>(this), reason); + return TextEditorWidget::createAssistInterface(kind, reason); } QSharedPointer<FunctionDeclDefLink> CppEditorWidget::declDefLink() const diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp index 89af86e334..19514387d7 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.cpp +++ b/src/plugins/cppeditor/cppquickfixassistant.cpp @@ -149,7 +149,8 @@ QTextCursor CppQuickFixInterface::adjustedCursor() QuickFixOperations quickFixOperations(const TextEditor::AssistInterface *interface) { const auto cppInterface = dynamic_cast<const CppQuickFixInterface *>(interface); - QTC_ASSERT(cppInterface, return {}); + if (!cppInterface) + return {}; QuickFixOperations quickFixes; for (CppQuickFixFactory *factory : CppQuickFixFactory::cppQuickFixFactories()) factory->match(*cppInterface, quickFixes); diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 590ef1da58..ccc94a5ea4 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1042,7 +1042,7 @@ std::unique_ptr<AssistInterface> QmlJSEditorWidget::createAssistInterface( return std::make_unique<Internal::QmlJSQuickFixAssistInterface>( const_cast<QmlJSEditorWidget *>(this), reason); } - return nullptr; + return TextEditorWidget::createAssistInterface(assistKind, reason); } QString QmlJSEditorWidget::foldReplacementText(const QTextBlock &block) const diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 34ba897d8d..b3d9d477e2 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -175,8 +175,7 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason, std::unique_ptr<AssistInterface> assistInterface = m_editorWidget->createAssistInterface(kind, reason); - if (!assistInterface) - return; + QTC_ASSERT(assistInterface, return); // We got an assist provider and interface so no need to reset the current context anymore earlyReturnContextClear.reset({}); @@ -395,8 +394,10 @@ void CodeAssistantPrivate::notifyChange() if (m_editorWidget->position() < m_proposalWidget->basePosition()) { destroyContext(); } else { - m_proposalWidget->updateProposal( - m_editorWidget->createAssistInterface(m_assistKind, m_proposalWidget->reason())); + std::unique_ptr<AssistInterface> assistInterface + = m_editorWidget->createAssistInterface(m_assistKind, m_proposalWidget->reason()); + QTC_ASSERT(assistInterface, destroyContext(); return); + m_proposalWidget->updateProposal(std::move(assistInterface)); if (!isDisplayingProposal()) requestActivationCharProposal(); } |