diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2014-04-08 12:26:52 -0400 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-04-14 10:27:53 +0200 |
commit | e7904caf0b1c3fe4fe88e275286c0da326e1e2cf (patch) | |
tree | 8c402128110307bd8fb376aebb163ae981a840b1 /src/plugins/cpptools/cpptoolseditorsupport.cpp | |
parent | 0e8ec1856172bb6148f3f2a339d3985d2c970978 (diff) | |
download | qt-creator-e7904caf0b1c3fe4fe88e275286c0da326e1e2cf.tar.gz |
CppTools: Do not wait in GUI thread for the parsed document
...when collecting data for the semantic highlighting recalculation.
Task-number: QTCREATORBUG-11037
Change-Id: Ibed73a2916df0a91aedef166de2c8c6bb5df309c
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpptoolseditorsupport.cpp')
-rw-r--r-- | src/plugins/cpptools/cpptoolseditorsupport.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index e2c33c8dda..4f1adb8a25 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -261,10 +261,10 @@ CppCompletionAssistProvider *CppEditorSupport::completionAssistProvider() const QSharedPointer<SnapshotUpdater> CppEditorSupport::snapshotUpdater() { - QSharedPointer<SnapshotUpdater> updater = m_snapshotUpdater; + QSharedPointer<SnapshotUpdater> updater = snapshotUpdater_internal(); if (!updater || updater->fileInEditor() != fileName()) { updater = QSharedPointer<SnapshotUpdater>(new SnapshotUpdater(fileName())); - m_snapshotUpdater = updater; + setSnapshotUpdater_internal(updater); QSharedPointer<CppCodeModelSettings> cms = CppToolsPlugin::instance()->codeModelSettings(); updater->setUsePrecompiledHeaders(cms->pchUsage() != CppCodeModelSettings::PchUse_None); @@ -518,14 +518,12 @@ SemanticInfo::Source CppEditorSupport::currentSource(bool force) int line = 0, column = 0; m_textEditor->convertPosition(m_textEditor->editorWidget()->position(), &line, &column); - const Snapshot snapshot = snapshotUpdater()->snapshot(); - QByteArray code; if (force || m_lastSemanticInfo.revision != editorRevision()) code = contents(); // get the source code only when needed. const unsigned revision = editorRevision(); - SemanticInfo::Source source(snapshot, fileName(), code, line, column, revision, force); + SemanticInfo::Source source(Snapshot(), fileName(), code, line, column, revision, force); return source; } @@ -552,9 +550,13 @@ void CppEditorSupport::recalculateSemanticInfoNow(const SemanticInfo::Source &so } if (semanticInfo.doc.isNull()) { - semanticInfo.snapshot = source.snapshot; - if (source.snapshot.contains(source.fileName)) { - Document::Ptr doc = source.snapshot.preprocessedDocument(source.code, source.fileName); + const QSharedPointer<SnapshotUpdater> snapshotUpdater = snapshotUpdater_internal(); + QTC_ASSERT(snapshotUpdater, return); + semanticInfo.snapshot = snapshotUpdater->snapshot(); + + if (semanticInfo.snapshot.contains(source.fileName)) { + Document::Ptr doc = semanticInfo.snapshot.preprocessedDocument(source.code, + source.fileName); if (processor) doc->control()->setTopLevelDeclarationProcessor(processor); doc->check(); @@ -593,6 +595,18 @@ void CppEditorSupport::recalculateSemanticInfoDetached_helper(QFutureInterface<v recalculateSemanticInfoNow(source, true, &processor); } +QSharedPointer<SnapshotUpdater> CppEditorSupport::snapshotUpdater_internal() const +{ + QMutexLocker locker(&m_snapshotUpdaterLock); + return m_snapshotUpdater; +} + +void CppEditorSupport::setSnapshotUpdater_internal(const QSharedPointer<SnapshotUpdater> &updater) +{ + QMutexLocker locker(&m_snapshotUpdaterLock); + m_snapshotUpdater = updater; +} + void CppEditorSupport::onMimeTypeChanged() { m_highlighter.cancel(); |