diff options
7 files changed, 91 insertions, 1 deletions
diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index cea921c3fe..b2c44f0e90 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -38,6 +38,7 @@ #include <projectexplorer/projectpanelfactory.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/taskhub.h> #include <texteditor/textmark.h> @@ -64,6 +65,9 @@ bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *err Q_UNUSED(arguments); Q_UNUSED(errorMessage); + ProjectExplorer::TaskHub::addCategory(Constants::TASK_CATEGORY_DIAGNOSTICS, + tr("Clang Code Model")); + connect(ProjectExplorer::ProjectExplorerPlugin::instance(), &ProjectExplorer::ProjectExplorerPlugin::finishedInitialization, this, diff --git a/src/plugins/clangcodemodel/clangconstants.h b/src/plugins/clangcodemodel/clangconstants.h index 6197ba5412..294618aa88 100644 --- a/src/plugins/clangcodemodel/clangconstants.h +++ b/src/plugins/clangcodemodel/clangconstants.h @@ -32,5 +32,7 @@ const char CLANG_MODELMANAGERSUPPORT_ID[] = "ClangCodeModel.ClangCodeModel"; const char CLANG_ERROR[] = "Clang.Error"; const char CLANG_WARNING[] = "Clang.Warning"; +const char TASK_CATEGORY_DIAGNOSTICS[] = "ClangCodeModel"; + } // namespace Constants } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index 3be5408f5a..9923d84917 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -23,6 +23,7 @@ ** ****************************************************************************/ +#include "clangconstants.h" #include "clangdiagnosticfilter.h" #include "clangdiagnosticmanager.h" #include "clangisdiagnosticrelatedtolocation.h" @@ -33,6 +34,8 @@ #include <cpptools/cpptoolsconstants.h> +#include <projectexplorer/taskhub.h> + #include <texteditor/fontsettings.h> #include <texteditor/textdocument.h> #include <texteditor/texteditorsettings.h> @@ -42,6 +45,7 @@ #include <utils/proxyaction.h> #include <utils/qtcassert.h> #include <utils/theme/theme.h> +#include <utils/utilsicons.h> #include <QFileInfo> #include <QTextBlock> @@ -315,6 +319,56 @@ void ClangDiagnosticManager::generateFixItAvailableMarkers() addFixItAvailableMarker(m_errorDiagnostics, lineNumbersWithFixItMarker); } +static void addTask(const ClangBackEnd::DiagnosticContainer &diagnostic, bool isChild = false) +{ + using namespace ProjectExplorer; + using ::Utils::FileName; + + Task::TaskType taskType = ProjectExplorer::Task::TaskType::Unknown; + FileName iconPath; + QIcon icon; + + if (!isChild) { + switch (diagnostic.severity) { + case ClangBackEnd::DiagnosticSeverity::Fatal: + case ClangBackEnd::DiagnosticSeverity::Error: + taskType = Task::TaskType::Error; + icon = ::Utils::Icons::CODEMODEL_ERROR.icon(); + break; + case ClangBackEnd::DiagnosticSeverity::Warning: + taskType = Task::TaskType::Warning; + icon = ::Utils::Icons::CODEMODEL_WARNING.icon(); + break; + default: + break; + } + } + + TaskHub::addTask(Task(taskType, + diagnostic.text.toString(), + FileName::fromString(diagnostic.location.filePath.toString()), + diagnostic.location.line, + Constants::TASK_CATEGORY_DIAGNOSTICS, + icon, + /*addTextMark =*/ false)); +} + +void ClangDiagnosticManager::clearTaskHubIssues() +{ + ProjectExplorer::TaskHub::clearTasks(Constants::TASK_CATEGORY_DIAGNOSTICS); +} + +void ClangDiagnosticManager::generateTaskHubIssues() +{ + const QVector<ClangBackEnd::DiagnosticContainer> diagnostics = m_errorDiagnostics + + m_warningDiagnostics; + for (const ClangBackEnd::DiagnosticContainer &diagnostic : diagnostics) { + addTask(diagnostic); + for (const ClangBackEnd::DiagnosticContainer &child : diagnostic.children) + addTask(child, /*isChild = */ true); + } +} + QList<QTextEdit::ExtraSelection> ClangDiagnosticManager::takeExtraSelections() { auto extraSelections = m_extraSelections; @@ -401,6 +455,9 @@ void ClangDiagnosticManager::processNewDiagnostics( generateTextMarks(); }); } + + clearTaskHubIssues(); + generateTaskHubIssues(); } const QVector<ClangBackEnd::DiagnosticContainer> & diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.h b/src/plugins/clangcodemodel/clangdiagnosticmanager.h index dff768a09d..c895735e8d 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.h +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.h @@ -63,6 +63,9 @@ public: void invalidateDiagnostics(); void clearDiagnosticsWithFixIts(); + static void clearTaskHubIssues(); + void generateTaskHubIssues(); + private: void cleanMarks(); QString filePath() const; diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 8a0e03deb3..a3f08b12c7 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -241,6 +241,16 @@ const QVector<ClangBackEnd::TokenInfoContainer> return m_tokenInfos; } +void ClangEditorDocumentProcessor::clearTaskHubIssues() +{ + m_diagnosticManager.clearTaskHubIssues(); +} + +void ClangEditorDocumentProcessor::generateTaskHubIssues() +{ + m_diagnosticManager.generateTaskHubIssues(); +} + void ClangEditorDocumentProcessor::updateHighlighting( const QVector<ClangBackEnd::TokenInfoContainer> &tokenInfos, const QVector<ClangBackEnd::SourceRangeContainer> &skippedPreprocessorRanges, diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index cd28c310cf..018536be21 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -103,6 +103,9 @@ public: const QVector<ClangBackEnd::TokenInfoContainer> &tokenInfos() const; + void clearTaskHubIssues(); + void generateTaskHubIssues(); + public: static ClangEditorDocumentProcessor *get(const QString &filePath); diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index ce7505a3dc..f0bb8d9298 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -160,9 +160,20 @@ CppTools::BaseEditorDocumentProcessor *ModelManagerSupportClang::createEditorDoc return new ClangEditorDocumentProcessor(m_communicator, baseTextDocument); } -void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *) +void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *editor) { m_communicator.updateTranslationUnitVisiblity(); + + // Update task hub issues for current CppEditorDocument + QTC_ASSERT(editor, return); + Core::IDocument *document = editor->document(); + QTC_ASSERT(document, return); + TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(document); + + auto processor = ClangEditorDocumentProcessor::get(document->filePath().toString()); + processor->clearTaskHubIssues(); + if (textDocument && cppModelManager()->isCppEditor(editor)) + processor->generateTaskHubIssues(); } void ModelManagerSupportClang::connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument) |