diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index c29359a531d..7fa8b9302e1 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -196,6 +196,8 @@ void ClangEditorDocumentProcessor::updateCodeWarnings( uint documentRevision) { if (documentRevision == revision()) { + if (m_invalidationState == InvalidationState::Scheduled) + m_invalidationState = InvalidationState::Canceled; m_diagnosticManager.processNewDiagnostics(diagnostics, m_isProjectFile); const auto codeWarnings = m_diagnosticManager.takeExtraSelections(); const auto fixitAvailableMarkers = m_diagnosticManager.takeFixItAvailableMarkers(); @@ -298,11 +300,14 @@ TextEditor::QuickFixOperations ClangEditorDocumentProcessor::extraRefactoringOpe void ClangEditorDocumentProcessor::editorDocumentTimerRestarted() { m_updateBackendDocumentTimer.stop(); // Wait for the next call to run(). + m_invalidationState = InvalidationState::Scheduled; } void ClangEditorDocumentProcessor::invalidateDiagnostics() { - m_diagnosticManager.invalidateDiagnostics(); + if (m_invalidationState != InvalidationState::Canceled) + m_diagnosticManager.invalidateDiagnostics(); + m_invalidationState = InvalidationState::Off; } TextEditor::TextMarks ClangEditorDocumentProcessor::diagnosticTextMarksAt(uint line, diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 36ef30b8daf..91d98601aab 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -140,6 +140,7 @@ private: QFutureWatcher m_parserWatcher; QTimer m_updateBackendDocumentTimer; unsigned m_parserRevision; + enum class InvalidationState { Off, Scheduled, Canceled } m_invalidationState; QVector m_tokenInfos; CppTools::SemanticHighlighter m_semanticHighlighter; diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 117ba67717c..815be89bbaa 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -88,6 +88,7 @@ public: bool eventFilter(QObject *o, QEvent *e) override; private: + bool requestActivationCharProposal(); void processProposalItem(AssistProposalItemInterface *proposalItem); void handlePrefixExpansion(const QString &newPrefix); void finalizeProposal(); @@ -161,6 +162,19 @@ void CodeAssistantPrivate::invoke(AssistKind kind, IAssistProvider *provider) } } +bool CodeAssistantPrivate::requestActivationCharProposal() +{ + if (m_assistKind == Completion && m_settings.m_completionTrigger != ManualCompletion) { + if (CompletionAssistProvider *provider = identifyActivationSequence()) { + if (isWaitingForProposal()) + cancelCurrentRequest(); + requestProposal(ActivationCharacter, Completion, provider); + return true; + } + } + return false; +} + void CodeAssistantPrivate::process() { if (!isConfigured()) @@ -169,16 +183,8 @@ void CodeAssistantPrivate::process() stopAutomaticProposalTimer(); if (m_assistKind == TextEditor::Completion) { - if (m_settings.m_completionTrigger != ManualCompletion) { - if (CompletionAssistProvider *provider = identifyActivationSequence()) { - if (isWaitingForProposal()) - cancelCurrentRequest(); - requestProposal(ActivationCharacter, Completion, provider); - return; - } - } - - startAutomaticProposalTimer(); + if (!requestActivationCharProposal()) + startAutomaticProposalTimer(); } else if (m_assistKind != FunctionHint){ m_assistKind = TextEditor::Completion; } @@ -365,6 +371,8 @@ void CodeAssistantPrivate::processProposalItem(AssistProposalItemInterface *prop proposalItem->apply(manipulator, m_proposal->basePosition()); destroyContext(); m_editorWidget->encourageApply(); + if (!proposalItem->isSnippet()) + requestActivationCharProposal(); } void CodeAssistantPrivate::handlePrefixExpansion(const QString &newPrefix) @@ -404,7 +412,7 @@ void CodeAssistantPrivate::finalizeProposal() bool CodeAssistantPrivate::isDisplayingProposal() const { - return m_proposalWidget != nullptr; + return m_proposalWidget != nullptr && m_proposalWidget->isVisible(); } bool CodeAssistantPrivate::isWaitingForProposal() const @@ -457,6 +465,8 @@ void CodeAssistantPrivate::notifyChange() m_proposalWidget->updateProposal( m_editorWidget->textAt(m_proposal->basePosition(), m_editorWidget->position() - m_proposal->basePosition())); + if (!isDisplayingProposal()) + requestActivationCharProposal(); } else { destroyContext(); requestProposal(ExplicitlyInvoked, m_assistKind, m_requestProvider);