From 37a146d05c1b4683db11a1fc217e23c9fdb574ff Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 14 Jul 2009 14:23:12 +0200 Subject: [PATCH] Introduced revisions in CPlusPlus::Document. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed by Thorbjørn Lindeijer --- src/libs/cplusplus/CppDocument.cpp | 13 +++++++++++- src/libs/cplusplus/CppDocument.h | 4 ++++ src/plugins/cpptools/cppmodelmanager.cpp | 25 ++++++++++++++++++++++-- src/plugins/cpptools/cppmodelmanager.h | 1 + 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 49209bc1131..69b0e48271a 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -103,7 +103,8 @@ private: Document::Document(const QString &fileName) : _fileName(fileName), - _globalNamespace(0) + _globalNamespace(0), + _revision(0) { _control = new Control(); @@ -130,6 +131,16 @@ Control *Document::control() const return _control; } +unsigned Document::revision() const +{ + return _revision; +} + +void Document::setRevision(unsigned revision) +{ + _revision = revision; +} + QString Document::fileName() const { return _fileName; diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index 4984ef114a4..4f1c96629dd 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -60,6 +60,9 @@ public: public: ~Document(); + unsigned revision() const; + void setRevision(unsigned revision); + QString fileName() const; QStringList includedFiles() const; @@ -265,6 +268,7 @@ private: QList<Block> _skippedBlocks; QList<MacroUse> _macroUses; QByteArray _source; + unsigned _revision; friend class Snapshot; }; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index c940ba90c77..175c97498e5 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -174,6 +174,7 @@ public: CppPreprocessor(QPointer<CppModelManager> modelManager); virtual ~CppPreprocessor(); + void setRevision(unsigned revision); void setWorkingCopy(const QMap<QString, QString> &workingCopy); void setIncludePaths(const QStringList &includePaths); void setFrameworkPaths(const QStringList &frameworkPaths); @@ -222,6 +223,7 @@ private: Document::Ptr m_currentDoc; QSet<QString> m_todo; QSet<QString> m_processed; + unsigned m_revision; }; } // namespace Internal @@ -230,12 +232,16 @@ private: CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager) : snapshot(modelManager->snapshot()), m_modelManager(modelManager), - preprocess(this, &env) + preprocess(this, &env), + m_revision(0) { } CppPreprocessor::~CppPreprocessor() { } +void CppPreprocessor::setRevision(unsigned revision) +{ m_revision = revision; } + void CppPreprocessor::setWorkingCopy(const QMap<QString, QString> &workingCopy) { m_workingCopy = workingCopy; } @@ -537,6 +543,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type, } doc = Document::create(fileName); + doc->setRevision(m_revision); Document::Ptr previousDoc = switchDocument(doc); @@ -577,6 +584,7 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc) CppModelManager::CppModelManager(QObject *parent) : CppModelManagerInterface(parent) { + m_revision = 0; m_synchronizer.setCancelOnWait(true); m_core = Core::ICore::instance(); // FIXME @@ -762,6 +770,7 @@ QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles const QMap<QString, QString> workingCopy = buildWorkingCopyList(); CppPreprocessor *preproc = new CppPreprocessor(this); + preproc->setRevision(++m_revision); preproc->setProjectFiles(projectFiles()); preproc->setIncludePaths(includePaths()); preproc->setFrameworkPaths(frameworkPaths()); @@ -839,10 +848,22 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc) { const QString fileName = doc->fileName(); + bool outdated = false; + protectSnapshot.lock(); - m_snapshot.insert(doc); + + Document::Ptr previous = m_snapshot.value(fileName); + + if (previous && (doc->revision() != 0 && doc->revision() < previous->revision())) + outdated = true; + else + m_snapshot.insert(doc); + protectSnapshot.unlock(); + if (outdated) + return; + QList<Core::IEditor *> openedEditors = m_core->editorManager()->openedEditors(); foreach (Core::IEditor *editor, openedEditors) { if (editor->file()->fileName() == fileName) { diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 40a492b27ca..a662618809e 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -189,6 +189,7 @@ private: QTimer *m_updateEditorSelectionsTimer; QFutureSynchronizer<void> m_synchronizer; + unsigned m_revision; }; } // namespace Internal -- GitLab