forked from qt-creator/qt-creator
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 <nikolai.kosjar@digia.com>
This commit is contained in:
@@ -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<FunctionDeclDefLink> link)
|
||||
|
||||
Reference in New Issue
Block a user