diff options
author | David Schulz <david.schulz@qt.io> | 2024-03-07 07:01:54 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2024-03-07 08:20:07 +0000 |
commit | 2428db2a3025c06b9c6b28a28c8375b35351f0f8 (patch) | |
tree | 80622e6e05565e13ebbcf4abb77a209b6078f4a3 /src/plugins/texteditor | |
parent | f35962cfb3a377f88de8e3855f2f0a3ad42f4b22 (diff) |
TextEditor: Fix crash in SyntaxHighlighter
The SyntaxHighlighterRunner is deleted by deleteLater in the
TextDocument destructor. This makes it possible that the
SyntaxHighlighter inside the runner lives longer than the document
itself. Avoid this by making the document the parent of the
SyntaxHighlighter like before the async highlighter patch series.
Fixes: QTCREATORBUG-30494
Change-Id: I6ce9c35ab400b17f2a1a6f3c3bd98df23f41c71e
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r-- | src/plugins/texteditor/syntaxhighlighterrunner.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/plugins/texteditor/syntaxhighlighterrunner.cpp b/src/plugins/texteditor/syntaxhighlighterrunner.cpp index 1a649af532..874f8254ab 100644 --- a/src/plugins/texteditor/syntaxhighlighterrunner.cpp +++ b/src/plugins/texteditor/syntaxhighlighterrunner.cpp @@ -35,11 +35,11 @@ public: if (async) { m_document = new QTextDocument(this); m_document->setDocumentLayout(new TextDocumentLayout(m_document)); - m_highlighter->setParent(m_document); } else { m_document = document; } + m_highlighter->setParent(m_document); m_highlighter->setDocument(m_document); connect(m_highlighter, @@ -66,45 +66,67 @@ public: void setExtraFormats(const QMap<int, QList<QTextLayout::FormatRange>> &formatMap) { + QTC_ASSERT(m_highlighter, return); for (auto it = formatMap.cbegin(); it != formatMap.cend(); ++it) m_highlighter->setExtraFormats(m_document->findBlockByNumber(it.key()), it.value()); } void clearExtraFormats(const QList<int> &blockNumbers) { + QTC_ASSERT(m_highlighter, return); for (auto it = blockNumbers.cbegin(); it != blockNumbers.cend(); ++it) m_highlighter->clearExtraFormats(m_document->findBlockByNumber(*it)); } - void clearAllExtraFormats() { m_highlighter->clearAllExtraFormats(); } + void clearAllExtraFormats() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->clearAllExtraFormats(); + } void setFontSettings(const TextEditor::FontSettings &fontSettings) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setFontSettings(fontSettings); } void setDefinitionName(const QString &name) { - return m_highlighter->setDefinitionName(name); + QTC_ASSERT(m_highlighter, return); + m_highlighter->setDefinitionName(name); } void setLanguageFeaturesFlags(unsigned int flags) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setLanguageFeaturesFlags(flags); } - void setEnabled(bool enabled) { m_highlighter->setEnabled(enabled); } + void setEnabled(bool enabled) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setEnabled(enabled); + } - void rehighlight() { m_highlighter->rehighlight(); } + void rehighlight() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->rehighlight(); + } void reformatBlocks(int from, int charsRemoved, int charsAdded) { + QTC_ASSERT(m_highlighter, return); m_highlighter->reformatBlocks(from, charsRemoved, charsAdded); } - void setInterrupted(bool interrupted) { m_highlighter->setInterrupted(interrupted); } + void setInterrupted(bool interrupted) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setInterrupted(interrupted); + } - SyntaxHighlighter *m_highlighter = nullptr; + QPointer<SyntaxHighlighter> m_highlighter = nullptr; QTextDocument *m_document = nullptr; signals: @@ -200,7 +222,6 @@ SyntaxHighlighterRunner::~SyntaxHighlighterRunner() m_thread->quit(); m_thread->wait(); } else { - delete d->m_highlighter; delete d; } } |