diff options
author | David Schulz <david.schulz@qt.io> | 2020-11-25 14:54:19 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2020-11-26 07:58:53 +0000 |
commit | b40dcf6d2968fe2dd542a24702a6d52eefbd80eb (patch) | |
tree | 2663fadd9f2f488da46623c9e6608ce1ed773fb3 | |
parent | 3680d6aa5c9ca991346d72ac4f5d030dd5e2e3c4 (diff) |
ClangTools: Fix crash in document tool runner
Prevent removing refactor markers from already destroyed widgets.
Fixes: QTCREATORBUG-24982
Change-Id: Icf8950f8f8407fa8733a1ef30d05abb4a2b44dd4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | src/plugins/clangtools/documentclangtoolrunner.cpp | 19 | ||||
-rw-r--r-- | src/plugins/clangtools/documentclangtoolrunner.h | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp index 9e2b388e5d..0f5e4da958 100644 --- a/src/plugins/clangtools/documentclangtoolrunner.cpp +++ b/src/plugins/clangtools/documentclangtoolrunner.cpp @@ -105,15 +105,21 @@ Diagnostics DocumentClangToolRunner::diagnosticsAtLine(int lineNumber) const return diagnostics; } +static void removeClangToolRefactorMarkers(TextEditor::TextEditorWidget *editor) +{ + if (!editor) + return; + editor->setRefactorMarkers( + TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(), + Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID)); +} + void DocumentClangToolRunner::scheduleRun() { for (DiagnosticMark *mark : m_marks) mark->disable(); - for (TextEditor::TextEditorWidget *editor : m_editorsWithMarkers) { - editor->setRefactorMarkers( - TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(), - Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID)); - } + for (TextEditor::TextEditorWidget *editor : m_editorsWithMarkers) + removeClangToolRefactorMarkers(editor); m_runTimer.start(); } @@ -325,7 +331,8 @@ void DocumentClangToolRunner::onSuccess() for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) { if (TextEditor::TextEditorWidget *widget = editor->editorWidget()) { widget->setRefactorMarkers(markers + widget->refactorMarkers()); - m_editorsWithMarkers << widget; + if (!m_editorsWithMarkers.contains(widget)) + m_editorsWithMarkers << widget; } } diff --git a/src/plugins/clangtools/documentclangtoolrunner.h b/src/plugins/clangtools/documentclangtoolrunner.h index 4cf8f25308..faec3ca8e7 100644 --- a/src/plugins/clangtools/documentclangtoolrunner.h +++ b/src/plugins/clangtools/documentclangtoolrunner.h @@ -83,7 +83,7 @@ private: QList<DiagnosticMark *> m_marks; FileInfo m_fileInfo; QMetaObject::Connection m_projectSettingsUpdate; - QSet<TextEditor::TextEditorWidget *> m_editorsWithMarkers; + QList<QPointer<TextEditor::TextEditorWidget>> m_editorsWithMarkers; SuppressedDiagnosticsList m_suppressed; Utils::FilePath m_lastProjectDirectory; }; |