summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/clangcodemodel/clangcodemodelplugin.cpp4
-rw-r--r--src/plugins/clangcodemodel/clangconstants.h2
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.cpp57
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.h3
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp10
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.h3
-rw-r--r--src/plugins/clangcodemodel/clangmodelmanagersupport.cpp13
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)