diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index 52c441443d6..07f84298f7e 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -346,7 +346,12 @@ void ClangDiagnosticManager::addClangTextMarks( const QVector &diagnostics) { for (const ClangBackEnd::DiagnosticContainer &diagnostic : diagnostics) { - auto textMark = new ClangTextMark(filePath(), diagnostic); + const auto onMarkRemoved = [this](const ClangTextMark *mark) { + const auto it = std::remove(m_clangTextMarks.begin(), m_clangTextMarks.end(), mark); + m_clangTextMarks.erase(it, m_clangTextMarks.end()); + delete mark; + }; + auto textMark = new ClangTextMark(filePath(), diagnostic, onMarkRemoved); m_clangTextMarks.push_back(textMark); m_textDocument->addMark(textMark); } diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index fede73fde3f..40c9b465e52 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -29,6 +29,7 @@ #include "clangdiagnostictooltipwidget.h" #include +#include #include #include @@ -60,9 +61,14 @@ Core::Id cartegoryForSeverity(ClangBackEnd::DiagnosticSeverity severity) } // anonymous namespace -ClangTextMark::ClangTextMark(const QString &fileName, const ClangBackEnd::DiagnosticContainer &diagnostic) - : TextEditor::TextMark(fileName, int(diagnostic.location().line()), cartegoryForSeverity(diagnostic.severity())), - m_diagnostic(diagnostic) +ClangTextMark::ClangTextMark(const QString &fileName, + const ClangBackEnd::DiagnosticContainer &diagnostic, + const RemovedFromEditorHandler &removedHandler) + : TextEditor::TextMark(fileName, + int(diagnostic.location().line()), + cartegoryForSeverity(diagnostic.severity())) + , m_diagnostic(diagnostic) + , m_removedFromEditorHandler(removedHandler) { setPriority(TextEditor::TextMark::HighPriority); setIcon(diagnostic.severity()); @@ -93,5 +99,11 @@ bool ClangTextMark::addToolTipContent(QLayout *target) return true; } +void ClangTextMark::removedFromEditor() +{ + QTC_ASSERT(m_removedFromEditorHandler, return); + m_removedFromEditorHandler(this); +} + } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h index d8d7eb2c019..3fb0b06f0c4 100644 --- a/src/plugins/clangcodemodel/clangtextmark.h +++ b/src/plugins/clangcodemodel/clangtextmark.h @@ -30,18 +30,28 @@ #include +#include + namespace ClangCodeModel { class ClangTextMark : public TextEditor::TextMark { public: - ClangTextMark(const QString &fileName, const ClangBackEnd::DiagnosticContainer &diagnostic); + using RemovedFromEditorHandler = std::function; + + ClangTextMark(const QString &fileName, + const ClangBackEnd::DiagnosticContainer &diagnostic, + const RemovedFromEditorHandler &removedHandler); private: - bool addToolTipContent(QLayout *target); void setIcon(ClangBackEnd::DiagnosticSeverity severity); + bool addToolTipContent(QLayout *target) override; + void removedFromEditor() override; + +private: ClangBackEnd::DiagnosticContainer m_diagnostic; + RemovedFromEditorHandler m_removedFromEditorHandler; }; } // namespace ClangCodeModel