From be3dbd2699c8daed8ddf61f8cf08f68a481717d2 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 18 Aug 2014 12:25:11 +0200 Subject: [PATCH] CppEditor: copy snapshot before FunctionDeclDefLink change calculation. FunctionDeclDefLink::changes is called from CPPEditorWidget::updateFunctionDeclDefLinkNow() where it receives the snapshot by reference from the semantic info. The semantic info is recalculated in a/the future, so it might change the snapshot or its documents while it's still being used by the decl/def link finder. So, this patch takes a copy of all relevant semantic info (snapshot and document) before starting to calculate the changes. Change-Id: I78244a4ca8149233403b3c35ee05a2d4ed4b2770 Reviewed-by: Nikolai Kosjar --- src/plugins/cppeditor/cppeditor.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 6507f6d4bea..ce1d201ce81 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -1029,22 +1029,24 @@ void CPPEditorWidget::updateFunctionDeclDefLinkNow() { if (Core::EditorManager::currentEditor() != editor()) return; + const Snapshot semanticSnapshot = d->m_lastSemanticInfo.snapshot; + const Document::Ptr semanticDoc = d->m_lastSemanticInfo.doc; if (d->m_declDefLink) { // update the change marker - const Utils::ChangeSet changes = d->m_declDefLink->changes(d->m_lastSemanticInfo.snapshot); + const Utils::ChangeSet changes = d->m_declDefLink->changes(semanticSnapshot); if (changes.isEmpty()) d->m_declDefLink->hideMarker(this); else d->m_declDefLink->showMarker(this); return; } - if (!d->m_lastSemanticInfo.doc || isOutdated()) + if (semanticDoc.isNull() || isOutdated()) return; Snapshot snapshot = CppModelManagerInterface::instance()->snapshot(); - snapshot.insert(d->m_lastSemanticInfo.doc); + snapshot.insert(semanticDoc); - d->m_declDefLinkFinder->startFindLinkAt(textCursor(), d->m_lastSemanticInfo.doc, snapshot); + d->m_declDefLinkFinder->startFindLinkAt(textCursor(), semanticDoc, snapshot); } void CPPEditorWidget::onFunctionDeclDefLinkFound(QSharedPointer link)