Clang: Gray out diagnostics on document change

When reparses take a while, this is helpful.

Change-Id: Ie2003a3d65b30d944d20fa19dd4161412182851c
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-07-03 13:29:30 +02:00
parent 1a16caf221
commit 2747985358
9 changed files with 48 additions and 12 deletions

View File

@@ -41,6 +41,7 @@
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/proxyaction.h> #include <utils/proxyaction.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/theme/theme.h>
#include <QFileInfo> #include <QFileInfo>
#include <QTextBlock> #include <QTextBlock>
@@ -347,6 +348,19 @@ ClangDiagnosticManager::diagnosticsAt(uint line, uint column) const
return diagnostics; 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() void ClangDiagnosticManager::clearDiagnosticsWithFixIts()
{ {
m_fixItdiagnostics.clear(); m_fixItdiagnostics.clear();
@@ -364,6 +378,7 @@ void ClangDiagnosticManager::generateEditorSelections()
void ClangDiagnosticManager::processNewDiagnostics( void ClangDiagnosticManager::processNewDiagnostics(
const QVector<ClangBackEnd::DiagnosticContainer> &allDiagnostics) const QVector<ClangBackEnd::DiagnosticContainer> &allDiagnostics)
{ {
m_diagnosticsInvalidated = false;
filterDiagnostics(allDiagnostics); filterDiagnostics(allDiagnostics);
generateTextMarks(); generateTextMarks();

View File

@@ -58,6 +58,7 @@ public:
bool hasDiagnosticsAt(uint line, uint column) const; bool hasDiagnosticsAt(uint line, uint column) const;
QVector<ClangBackEnd::DiagnosticContainer> diagnosticsAt(uint line, uint column) const; QVector<ClangBackEnd::DiagnosticContainer> diagnosticsAt(uint line, uint column) const;
void invalidateDiagnostics();
void clearDiagnosticsWithFixIts(); void clearDiagnosticsWithFixIts();
private: private:
@@ -80,6 +81,7 @@ private:
QList<QTextEdit::ExtraSelection> m_extraSelections; QList<QTextEdit::ExtraSelection> m_extraSelections;
TextEditor::RefactorMarkers m_fixItAvailableMarkers; TextEditor::RefactorMarkers m_fixItAvailableMarkers;
std::vector<ClangTextMark *> m_clangTextMarks; std::vector<ClangTextMark *> m_clangTextMarks;
bool m_diagnosticsInvalidated = false;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -281,6 +281,11 @@ void ClangEditorDocumentProcessor::editorDocumentTimerRestarted()
m_updateTranslationUnitTimer.stop(); // Wait for the next call to run(). m_updateTranslationUnitTimer.stop(); // Wait for the next call to run().
} }
void ClangEditorDocumentProcessor::invalidateDiagnostics()
{
m_diagnosticManager.invalidateDiagnostics();
}
void ClangEditorDocumentProcessor::setParserConfig( void ClangEditorDocumentProcessor::setParserConfig(
const CppTools::BaseEditorDocumentParser::Configuration config) const CppTools::BaseEditorDocumentParser::Configuration config)
{ {

View File

@@ -77,6 +77,7 @@ public:
TextEditor::QuickFixOperations TextEditor::QuickFixOperations
extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface) override; extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface) override;
void invalidateDiagnostics() override;
bool hasDiagnosticsAt(uint line, uint column) const override; bool hasDiagnosticsAt(uint line, uint column) const override;
void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *target) const override; void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *target) const override;

View File

@@ -78,23 +78,29 @@ ClangTextMark::ClangTextMark(const QString &fileName,
: QApplication::translate("Clang Code Model Marks", "Code Model Error")); : QApplication::translate("Clang Code Model Marks", "Code Model Error"));
setPriority(warning ? TextEditor::TextMark::NormalPriority setPriority(warning ? TextEditor::TextMark::NormalPriority
: TextEditor::TextMark::HighPriority); : TextEditor::TextMark::HighPriority);
setIcon(diagnostic.severity()); updateIcon();
setLineAnnotation(diagnostic.text().toString()); setLineAnnotation(diagnostic.text().toString());
} }
void ClangTextMark::setIcon(ClangBackEnd::DiagnosticSeverity severity) void ClangTextMark::updateIcon(bool valid)
{ {
static const QIcon errorIcon = Utils::Icon({ static const QIcon errorIcon = Utils::Icon(
{QLatin1String(":/clangcodemodel/images/error.png"), Utils::Theme::IconsErrorColor} {{":/clangcodemodel/images/error.png", Utils::Theme::IconsErrorColor}},
}, Utils::Icon::Tint).icon(); Utils::Icon::Tint).icon();
static const QIcon warningIcon = Utils::Icon({ static const QIcon warningIcon = Utils::Icon(
{QLatin1String(":/clangcodemodel/images/warning.png"), Utils::Theme::IconsWarningColor} {{":/clangcodemodel/images/warning.png", Utils::Theme::IconsWarningColor}},
}, Utils::Icon::Tint).icon(); 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)) if (isWarningOrNote(m_diagnostic.severity()))
TextMark::setIcon(warningIcon); setIcon(valid ? warningIcon : invalidWarningIcon);
else else
TextMark::setIcon(errorIcon); setIcon(valid ? errorIcon : invalidErrorIcon);
} }
bool ClangTextMark::addToolTipContent(QLayout *target) const bool ClangTextMark::addToolTipContent(QLayout *target) const

View File

@@ -43,8 +43,8 @@ public:
const ClangBackEnd::DiagnosticContainer &diagnostic, const ClangBackEnd::DiagnosticContainer &diagnostic,
const RemovedFromEditorHandler &removedHandler); const RemovedFromEditorHandler &removedHandler);
void updateIcon(bool valid = true);
private: private:
void setIcon(ClangBackEnd::DiagnosticSeverity severity);
bool addToolTipContent(QLayout *target) const override; bool addToolTipContent(QLayout *target) const override;
void removedFromEditor() override; void removedFromEditor() override;

View File

@@ -257,6 +257,8 @@ void CppEditorDocument::scheduleProcessDocument()
void CppEditorDocument::processDocument() void CppEditorDocument::processDocument()
{ {
processor()->invalidateDiagnostics();
if (processor()->isParserRunning() || m_processorRevision != contentsRevision()) { if (processor()->isParserRunning() || m_processorRevision != contentsRevision()) {
m_processorTimer.start(); m_processorTimer.start();
processor()->editorDocumentTimerRestarted(); processor()->editorDocumentTimerRestarted();

View File

@@ -87,6 +87,10 @@ void BaseEditorDocumentProcessor::editorDocumentTimerRestarted()
{ {
} }
void BaseEditorDocumentProcessor::invalidateDiagnostics()
{
}
void BaseEditorDocumentProcessor::setParserConfig( void BaseEditorDocumentProcessor::setParserConfig(
const BaseEditorDocumentParser::Configuration config) const BaseEditorDocumentParser::Configuration config)
{ {

View File

@@ -66,6 +66,7 @@ public:
virtual TextEditor::QuickFixOperations virtual TextEditor::QuickFixOperations
extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface); extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface);
virtual void invalidateDiagnostics();
virtual bool hasDiagnosticsAt(uint line, uint column) const; virtual bool hasDiagnosticsAt(uint line, uint column) const;
virtual void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *layout) const; virtual void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *layout) const;