aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-11-25 14:54:19 +0100
committerDavid Schulz <david.schulz@qt.io>2020-11-26 07:58:53 +0000
commitb40dcf6d2968fe2dd542a24702a6d52eefbd80eb (patch)
tree2663fadd9f2f488da46623c9e6608ce1ed773fb3
parent3680d6aa5c9ca991346d72ac4f5d030dd5e2e3c4 (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.cpp19
-rw-r--r--src/plugins/clangtools/documentclangtoolrunner.h2
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;
};