From 27479853584892585548b29eacea731252c274a8 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 3 Jul 2017 13:29:30 +0200 Subject: [PATCH] Clang: Gray out diagnostics on document change When reparses take a while, this is helpful. Change-Id: Ie2003a3d65b30d944d20fa19dd4161412182851c Reviewed-by: David Schulz --- .../clangcodemodel/clangdiagnosticmanager.cpp | 15 ++++++++++ .../clangcodemodel/clangdiagnosticmanager.h | 2 ++ .../clangeditordocumentprocessor.cpp | 5 ++++ .../clangeditordocumentprocessor.h | 1 + src/plugins/clangcodemodel/clangtextmark.cpp | 28 +++++++++++-------- src/plugins/clangcodemodel/clangtextmark.h | 2 +- src/plugins/cppeditor/cppeditordocument.cpp | 2 ++ .../cpptools/baseeditordocumentprocessor.cpp | 4 +++ .../cpptools/baseeditordocumentprocessor.h | 1 + 9 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index f8afaf65656..f5fe4d63681 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -347,6 +348,19 @@ ClangDiagnosticManager::diagnosticsAt(uint line, uint column) const return diagnostics; } +void ClangDiagnosticManager::invalidateDiagnostics() +{ + if (m_diagnosticsInvalidated) + return; + + m_diagnosticsInvalidated = true; + for (ClangTextMark *textMark : m_clangTextMarks) { + textMark->setColor(::Utils::Theme::Color::IconsDisabledColor); + textMark->updateIcon(/*valid=*/ false); + textMark->updateMarker(); + } +} + void ClangDiagnosticManager::clearDiagnosticsWithFixIts() { m_fixItdiagnostics.clear(); @@ -364,6 +378,7 @@ void ClangDiagnosticManager::generateEditorSelections() void ClangDiagnosticManager::processNewDiagnostics( const QVector &allDiagnostics) { + m_diagnosticsInvalidated = false; filterDiagnostics(allDiagnostics); generateTextMarks(); diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.h b/src/plugins/clangcodemodel/clangdiagnosticmanager.h index 1da92c86054..e22cd933d53 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.h +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.h @@ -58,6 +58,7 @@ public: bool hasDiagnosticsAt(uint line, uint column) const; QVector diagnosticsAt(uint line, uint column) const; + void invalidateDiagnostics(); void clearDiagnosticsWithFixIts(); private: @@ -80,6 +81,7 @@ private: QList m_extraSelections; TextEditor::RefactorMarkers m_fixItAvailableMarkers; std::vector m_clangTextMarks; + bool m_diagnosticsInvalidated = false; }; } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 800d4baf0e2..848de72ebc0 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -281,6 +281,11 @@ void ClangEditorDocumentProcessor::editorDocumentTimerRestarted() m_updateTranslationUnitTimer.stop(); // Wait for the next call to run(). } +void ClangEditorDocumentProcessor::invalidateDiagnostics() +{ + m_diagnosticManager.invalidateDiagnostics(); +} + void ClangEditorDocumentProcessor::setParserConfig( const CppTools::BaseEditorDocumentParser::Configuration config) { diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index cdee5b7d861..da6872fa3db 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -77,6 +77,7 @@ public: TextEditor::QuickFixOperations extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface) override; + void invalidateDiagnostics() override; bool hasDiagnosticsAt(uint line, uint column) const override; void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *target) const override; diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 1e53bce06e2..b8d69a722e8 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -78,23 +78,29 @@ ClangTextMark::ClangTextMark(const QString &fileName, : QApplication::translate("Clang Code Model Marks", "Code Model Error")); setPriority(warning ? TextEditor::TextMark::NormalPriority : TextEditor::TextMark::HighPriority); - setIcon(diagnostic.severity()); + updateIcon(); setLineAnnotation(diagnostic.text().toString()); } -void ClangTextMark::setIcon(ClangBackEnd::DiagnosticSeverity severity) +void ClangTextMark::updateIcon(bool valid) { - static const QIcon errorIcon = Utils::Icon({ - {QLatin1String(":/clangcodemodel/images/error.png"), Utils::Theme::IconsErrorColor} - }, Utils::Icon::Tint).icon(); - static const QIcon warningIcon = Utils::Icon({ - {QLatin1String(":/clangcodemodel/images/warning.png"), Utils::Theme::IconsWarningColor} - }, Utils::Icon::Tint).icon(); + static const QIcon errorIcon = Utils::Icon( + {{":/clangcodemodel/images/error.png", Utils::Theme::IconsErrorColor}}, + Utils::Icon::Tint).icon(); + static const QIcon warningIcon = Utils::Icon( + {{":/clangcodemodel/images/warning.png", Utils::Theme::IconsWarningColor}}, + Utils::Icon::Tint).icon(); + static const QIcon invalidErrorIcon = Utils::Icon( + {{":/clangcodemodel/images/error.png", Utils::Theme::IconsDisabledColor}}, + Utils::Icon::Tint).icon(); + static const QIcon invalidWarningIcon = Utils::Icon( + {{":/clangcodemodel/images/warning.png", Utils::Theme::IconsDisabledColor}}, + Utils::Icon::Tint).icon(); - if (isWarningOrNote(severity)) - TextMark::setIcon(warningIcon); + if (isWarningOrNote(m_diagnostic.severity())) + setIcon(valid ? warningIcon : invalidWarningIcon); else - TextMark::setIcon(errorIcon); + setIcon(valid ? errorIcon : invalidErrorIcon); } bool ClangTextMark::addToolTipContent(QLayout *target) const diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h index f1a1b9078ba..0342fd1a62d 100644 --- a/src/plugins/clangcodemodel/clangtextmark.h +++ b/src/plugins/clangcodemodel/clangtextmark.h @@ -43,8 +43,8 @@ public: const ClangBackEnd::DiagnosticContainer &diagnostic, const RemovedFromEditorHandler &removedHandler); + void updateIcon(bool valid = true); private: - void setIcon(ClangBackEnd::DiagnosticSeverity severity); bool addToolTipContent(QLayout *target) const override; void removedFromEditor() override; diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp index 502359a7b52..c5a9d40e2ec 100644 --- a/src/plugins/cppeditor/cppeditordocument.cpp +++ b/src/plugins/cppeditor/cppeditordocument.cpp @@ -257,6 +257,8 @@ void CppEditorDocument::scheduleProcessDocument() void CppEditorDocument::processDocument() { + processor()->invalidateDiagnostics(); + if (processor()->isParserRunning() || m_processorRevision != contentsRevision()) { m_processorTimer.start(); processor()->editorDocumentTimerRestarted(); diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.cpp b/src/plugins/cpptools/baseeditordocumentprocessor.cpp index 2bf77787d76..5bffb51a382 100644 --- a/src/plugins/cpptools/baseeditordocumentprocessor.cpp +++ b/src/plugins/cpptools/baseeditordocumentprocessor.cpp @@ -87,6 +87,10 @@ void BaseEditorDocumentProcessor::editorDocumentTimerRestarted() { } +void BaseEditorDocumentProcessor::invalidateDiagnostics() +{ +} + void BaseEditorDocumentProcessor::setParserConfig( const BaseEditorDocumentParser::Configuration config) { diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h index 48f1f570ccb..3c9d864aeb9 100644 --- a/src/plugins/cpptools/baseeditordocumentprocessor.h +++ b/src/plugins/cpptools/baseeditordocumentprocessor.h @@ -66,6 +66,7 @@ public: virtual TextEditor::QuickFixOperations extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface); + virtual void invalidateDiagnostics(); virtual bool hasDiagnosticsAt(uint line, uint column) const; virtual void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *layout) const;