forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user