diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2014-08-26 14:26:28 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2014-08-29 16:12:57 +0200 |
commit | 45570d406889bbf881e033feab163e149a5628cc (patch) | |
tree | 2c6a3844ef1e8eb08c05ff5b15ba5b2ca800feed /src/plugins/cpptools | |
parent | 46b5ed2ba942847d91fdb347718d798dd5244524 (diff) | |
download | qt-creator-45570d406889bbf881e033feab163e149a5628cc.tar.gz |
CppTools: Provide the editor snapshot for SemanticInfoUpdater
...so that SemanticInfoUpdater does not depend anymore on the
EditorDocumentParser. Accessing the snapshot was a blocking operation
that delayed the semantic info update longer than actually needed.
Change-Id: I348d22ef83ab310d4319b2e8b9678fe90ee24d6a
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/builtineditordocumentparser.cpp | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/builtineditordocumentparser.h | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/builtineditordocumentprocessor.cpp | 11 | ||||
-rw-r--r-- | src/plugins/cpptools/builtineditordocumentprocessor.h | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsemanticinfo.h | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsemanticinfoupdater.cpp | 25 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsemanticinfoupdater.h | 3 |
7 files changed, 30 insertions, 22 deletions
diff --git a/src/plugins/cpptools/builtineditordocumentparser.cpp b/src/plugins/cpptools/builtineditordocumentparser.cpp index 526664dc1e..a261336ec3 100644 --- a/src/plugins/cpptools/builtineditordocumentparser.cpp +++ b/src/plugins/cpptools/builtineditordocumentparser.cpp @@ -42,6 +42,7 @@ BuiltinEditorDocumentParser::BuiltinEditorDocumentParser(const QString &filePath , m_forceSnapshotInvalidation(false) , m_releaseSourceAndAST(true) { + qRegisterMetaType<CPlusPlus::Snapshot>("CPlusPlus::Snapshot"); } void BuiltinEditorDocumentParser::update(WorkingCopy workingCopy) @@ -187,6 +188,8 @@ void BuiltinEditorDocumentParser::update(WorkingCopy workingCopy) } m_snapshot = newSnapshot; m_deps.build(m_snapshot); + + emit finished(document(), m_snapshot); } } diff --git a/src/plugins/cpptools/builtineditordocumentparser.h b/src/plugins/cpptools/builtineditordocumentparser.h index c7993c6a6b..a3c96fcda6 100644 --- a/src/plugins/cpptools/builtineditordocumentparser.h +++ b/src/plugins/cpptools/builtineditordocumentparser.h @@ -59,6 +59,9 @@ public: void setReleaseSourceAndAST(bool onoff); +signals: + void finished(CPlusPlus::Document::Ptr document, CPlusPlus::Snapshot snapshot); + public: static BuiltinEditorDocumentParser *get(const QString &filePath); diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.cpp b/src/plugins/cpptools/builtineditordocumentprocessor.cpp index 4b50809112..9cdc4dd95a 100644 --- a/src/plugins/cpptools/builtineditordocumentprocessor.cpp +++ b/src/plugins/cpptools/builtineditordocumentprocessor.cpp @@ -132,7 +132,6 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor( bool enableSemanticHighlighter) : BaseEditorDocumentProcessor(document) , m_parser(new BuiltinEditorDocumentParser(document->filePath())) - , m_semanticInfoUpdater(m_parser.data()) , m_semanticHighlighter(enableSemanticHighlighter ? new CppTools::SemanticHighlighter(document) : 0) @@ -151,8 +150,8 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor( }); } - connect(cmm(), &CppModelManager::documentUpdated, - this, &BuiltinEditorDocumentProcessor::onDocumentUpdated); + connect(m_parser.data(), &BuiltinEditorDocumentParser::finished, + this, &BuiltinEditorDocumentProcessor::onParserFinished); connect(&m_semanticInfoUpdater, &SemanticInfoUpdater::updated, this, &BuiltinEditorDocumentProcessor::onSemanticInfoUpdated); } @@ -197,7 +196,8 @@ BuiltinEditorDocumentProcessor *BuiltinEditorDocumentProcessor::get(const QStrin return 0; } -void BuiltinEditorDocumentProcessor::onDocumentUpdated(CPlusPlus::Document::Ptr document) +void BuiltinEditorDocumentProcessor::onParserFinished(CPlusPlus::Document::Ptr document, + CPlusPlus::Snapshot snapshot) { if (document.isNull()) return; @@ -223,7 +223,9 @@ void BuiltinEditorDocumentProcessor::onDocumentUpdated(CPlusPlus::Document::Ptr emit cppDocumentUpdated(document); + m_documentSnapshot = snapshot; const auto source = createSemanticInfoSource(false); + QTC_CHECK(source.snapshot.contains(document->fileName())); m_semanticInfoUpdater.updateDetached(source); } @@ -247,6 +249,7 @@ SemanticInfo::Source BuiltinEditorDocumentProcessor::createSemanticInfoSource(bo return SemanticInfo::Source(path, workingCopy.source(path), workingCopy.revision(path), + m_documentSnapshot, force); } diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.h b/src/plugins/cpptools/builtineditordocumentprocessor.h index 3319ad7d6e..8a242be918 100644 --- a/src/plugins/cpptools/builtineditordocumentprocessor.h +++ b/src/plugins/cpptools/builtineditordocumentprocessor.h @@ -61,7 +61,7 @@ public: static BuiltinEditorDocumentProcessor *get(const QString &filePath); private: - void onDocumentUpdated(CPlusPlus::Document::Ptr document); + void onParserFinished(CPlusPlus::Document::Ptr document, CPlusPlus::Snapshot snapshot); void onSemanticInfoUpdated(const CppTools::SemanticInfo semanticInfo); SemanticInfo::Source createSemanticInfoSource(bool force) const; @@ -70,6 +70,8 @@ private: QScopedPointer<BuiltinEditorDocumentParser> m_parser; QFuture<void> m_parserFuture; + CPlusPlus::Snapshot m_documentSnapshot; + SemanticInfoUpdater m_semanticInfoUpdater; QScopedPointer<SemanticHighlighter> m_semanticHighlighter; }; diff --git a/src/plugins/cpptools/cppsemanticinfo.h b/src/plugins/cpptools/cppsemanticinfo.h index 4066bfef40..5b2b139b83 100644 --- a/src/plugins/cpptools/cppsemanticinfo.h +++ b/src/plugins/cpptools/cppsemanticinfo.h @@ -48,6 +48,7 @@ public: const QString fileName; const QByteArray code; const unsigned revision; + CPlusPlus::Snapshot snapshot; const bool force; Source() : revision(0), force(false) {} @@ -55,10 +56,12 @@ public: Source(const QString &fileName, const QByteArray &code, unsigned revision, + const CPlusPlus::Snapshot &snapshot, bool force) : fileName(fileName) , code(code) , revision(revision) + , snapshot(snapshot) , force(force) {} }; diff --git a/src/plugins/cpptools/cppsemanticinfoupdater.cpp b/src/plugins/cpptools/cppsemanticinfoupdater.cpp index 71fbb16e46..dc8b4962ab 100644 --- a/src/plugins/cpptools/cppsemanticinfoupdater.cpp +++ b/src/plugins/cpptools/cppsemanticinfoupdater.cpp @@ -27,10 +27,10 @@ ** ****************************************************************************/ -#include "builtineditordocumentparser.h" -#include "cpplocalsymbols.h" #include "cppsemanticinfoupdater.h" +#include "cpplocalsymbols.h" + #include <utils/qtcassert.h> #include <utils/qtcoverride.h> #include <utils/runextensions.h> @@ -60,7 +60,7 @@ public: }; public: - SemanticInfoUpdaterPrivate(SemanticInfoUpdater *q, BuiltinEditorDocumentParser *m_parser); + SemanticInfoUpdaterPrivate(SemanticInfoUpdater *q); ~SemanticInfoUpdaterPrivate(); SemanticInfo semanticInfo() const; @@ -79,13 +79,10 @@ public: mutable QMutex m_lock; SemanticInfo m_semanticInfo; QFuture<void> m_future; - BuiltinEditorDocumentParser *m_parser; }; -SemanticInfoUpdaterPrivate::SemanticInfoUpdaterPrivate(SemanticInfoUpdater *q, - BuiltinEditorDocumentParser *parser) +SemanticInfoUpdaterPrivate::SemanticInfoUpdaterPrivate(SemanticInfoUpdater *q) : q(q) - , m_parser(parser) { } @@ -123,10 +120,7 @@ SemanticInfo SemanticInfoUpdaterPrivate::update(const SemanticInfo::Source &sour SemanticInfo newSemanticInfo; newSemanticInfo.revision = source.revision; - - QTC_ASSERT(m_parser, return newSemanticInfo); - newSemanticInfo.snapshot = m_parser->snapshot(); - QTC_ASSERT(newSemanticInfo.snapshot.contains(source.fileName), return newSemanticInfo); + newSemanticInfo.snapshot = source.snapshot; Document::Ptr doc = newSemanticInfo.snapshot.preprocessedDocument(source.code, source.fileName); if (processor) @@ -154,11 +148,12 @@ bool SemanticInfoUpdaterPrivate::reuseCurrentSemanticInfo(const SemanticInfo::So && currentSemanticInfo.revision == source.revision && currentSemanticInfo.doc && currentSemanticInfo.doc->translationUnit()->ast() - && currentSemanticInfo.doc->fileName() == source.fileName) { + && currentSemanticInfo.doc->fileName() == source.fileName + && !currentSemanticInfo.snapshot.isEmpty()) { SemanticInfo newSemanticInfo; newSemanticInfo.revision = source.revision; + newSemanticInfo.snapshot = source.snapshot; newSemanticInfo.doc = currentSemanticInfo.doc; - newSemanticInfo.snapshot = currentSemanticInfo.snapshot; // ### TODO: use the new snapshot. setSemanticInfo(newSemanticInfo, emitSignalWhenFinished); if (debug) qDebug() << "SemanticInfoUpdater: re-using current semantic info - source.revision" @@ -176,8 +171,8 @@ void SemanticInfoUpdaterPrivate::update_helper(QFutureInterface<void> &future, update(source, true, &processor); } -SemanticInfoUpdater::SemanticInfoUpdater(BuiltinEditorDocumentParser *parser) - : d(new SemanticInfoUpdaterPrivate(this, parser)) +SemanticInfoUpdater::SemanticInfoUpdater() + : d(new SemanticInfoUpdaterPrivate(this)) { } diff --git a/src/plugins/cpptools/cppsemanticinfoupdater.h b/src/plugins/cpptools/cppsemanticinfoupdater.h index 0436bf1846..3b6e72db47 100644 --- a/src/plugins/cpptools/cppsemanticinfoupdater.h +++ b/src/plugins/cpptools/cppsemanticinfoupdater.h @@ -37,7 +37,6 @@ namespace CppTools { -class BuiltinEditorDocumentParser; class SemanticInfoUpdaterPrivate; class SemanticInfoUpdater : public QObject @@ -46,7 +45,7 @@ class SemanticInfoUpdater : public QObject Q_DISABLE_COPY(SemanticInfoUpdater) public: - explicit SemanticInfoUpdater(BuiltinEditorDocumentParser *parser); + explicit SemanticInfoUpdater(); ~SemanticInfoUpdater(); SemanticInfo semanticInfo() const; |