TextEditor: always return a valid assist interface

It is required for updating currently visible proposals. Also guard
against potential null assist interfaces.

Amends 0bd6d7a69f

Fixes: QTCREATORBUG-29096
Change-Id: Ic34d70561b471e7e529f2fb7c239b49712aca502
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
David Schulz
2023-04-28 14:04:50 +02:00
parent 8aecf0d749
commit ba5e09f03f
4 changed files with 16 additions and 18 deletions

View File

@@ -1267,20 +1267,16 @@ std::unique_ptr<AssistInterface> CppEditorWidget::createAssistInterface(AssistKi
if (cap) if (cap)
return cap->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason); return cap->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason);
else {
if (isOldStyleSignalOrSlot()) if (isOldStyleSignalOrSlot()) {
return CppModelManager::instance() return CppModelManager::instance()
->completionAssistProvider() ->completionAssistProvider()
->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason); ->createAssistInterface(textDocument()->filePath(), this, getFeatures(), reason);
return TextEditorWidget::createAssistInterface(kind, 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 QSharedPointer<FunctionDeclDefLink> CppEditorWidget::declDefLink() const

View File

@@ -149,7 +149,8 @@ QTextCursor CppQuickFixInterface::adjustedCursor()
QuickFixOperations quickFixOperations(const TextEditor::AssistInterface *interface) QuickFixOperations quickFixOperations(const TextEditor::AssistInterface *interface)
{ {
const auto cppInterface = dynamic_cast<const CppQuickFixInterface *>(interface); const auto cppInterface = dynamic_cast<const CppQuickFixInterface *>(interface);
QTC_ASSERT(cppInterface, return {}); if (!cppInterface)
return {};
QuickFixOperations quickFixes; QuickFixOperations quickFixes;
for (CppQuickFixFactory *factory : CppQuickFixFactory::cppQuickFixFactories()) for (CppQuickFixFactory *factory : CppQuickFixFactory::cppQuickFixFactories())
factory->match(*cppInterface, quickFixes); factory->match(*cppInterface, quickFixes);

View File

@@ -1042,7 +1042,7 @@ std::unique_ptr<AssistInterface> QmlJSEditorWidget::createAssistInterface(
return std::make_unique<Internal::QmlJSQuickFixAssistInterface>( return std::make_unique<Internal::QmlJSQuickFixAssistInterface>(
const_cast<QmlJSEditorWidget *>(this), reason); const_cast<QmlJSEditorWidget *>(this), reason);
} }
return nullptr; return TextEditorWidget::createAssistInterface(assistKind, reason);
} }
QString QmlJSEditorWidget::foldReplacementText(const QTextBlock &block) const QString QmlJSEditorWidget::foldReplacementText(const QTextBlock &block) const

View File

@@ -175,8 +175,7 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
std::unique_ptr<AssistInterface> assistInterface = std::unique_ptr<AssistInterface> assistInterface =
m_editorWidget->createAssistInterface(kind, reason); m_editorWidget->createAssistInterface(kind, reason);
if (!assistInterface) QTC_ASSERT(assistInterface, return);
return;
// We got an assist provider and interface so no need to reset the current context anymore // We got an assist provider and interface so no need to reset the current context anymore
earlyReturnContextClear.reset({}); earlyReturnContextClear.reset({});
@@ -395,8 +394,10 @@ void CodeAssistantPrivate::notifyChange()
if (m_editorWidget->position() < m_proposalWidget->basePosition()) { if (m_editorWidget->position() < m_proposalWidget->basePosition()) {
destroyContext(); destroyContext();
} else { } else {
m_proposalWidget->updateProposal( std::unique_ptr<AssistInterface> assistInterface
m_editorWidget->createAssistInterface(m_assistKind, m_proposalWidget->reason())); = m_editorWidget->createAssistInterface(m_assistKind, m_proposalWidget->reason());
QTC_ASSERT(assistInterface, destroyContext(); return);
m_proposalWidget->updateProposal(std::move(assistInterface));
if (!isDisplayingProposal()) if (!isDisplayingProposal())
requestActivationCharProposal(); requestActivationCharProposal();
} }