summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cpptoolseditorsupport.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-04-08 12:26:52 -0400
committerErik Verbruggen <erik.verbruggen@digia.com>2014-04-14 10:27:53 +0200
commite7904caf0b1c3fe4fe88e275286c0da326e1e2cf (patch)
tree8c402128110307bd8fb376aebb163ae981a840b1 /src/plugins/cpptools/cpptoolseditorsupport.cpp
parent0e8ec1856172bb6148f3f2a339d3985d2c970978 (diff)
downloadqt-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.cpp30
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();