From bab60d14b341edc4fd1f81ec12cc460441948c3b Mon Sep 17 00:00:00 2001
From: Roberto Raggi <qtc-committer@nokia.com>
Date: Fri, 12 Dec 2008 10:07:58 +0100
Subject: [PATCH] Introduced CPlusPlus::Snapshot, it contains a snap shot of
 the indexer's current state. This change removes a number of wrong usages of
 the CppModelManager::documents()/document().

---
 src/libs/cplusplus/CppDocument.h              | 12 ++++++++++-
 src/libs/cplusplus/LookupContext.cpp          |  2 +-
 src/libs/cplusplus/LookupContext.h            |  6 +++---
 src/libs/cplusplus/TypeOfExpression.cpp       | 12 +++++------
 src/libs/cplusplus/TypeOfExpression.h         |  8 +++----
 src/plugins/cppeditor/cppeditor.cpp           | 14 ++++++++-----
 src/plugins/cpptools/cppcodecompletion.cpp    |  8 ++++---
 src/plugins/cpptools/cpphoverhandler.cpp      |  6 ++++--
 src/plugins/cpptools/cppmodelmanager.cpp      | 21 ++++++++-----------
 src/plugins/cpptools/cppmodelmanager.h        |  5 ++---
 .../cpptools/cppmodelmanagerinterface.h       |  8 ++-----
 src/plugins/cpptools/searchsymbols.h          |  1 +
 src/plugins/designer/workbenchintegration.cpp |  4 ++--
 13 files changed, 59 insertions(+), 48 deletions(-)

diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index b31f0d2bc64..54de3c801ea 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -40,7 +40,7 @@
 
 #include <QByteArray>
 #include <QList>
-#include <QSet>
+#include <QMap>
 #include <QSharedPointer>
 #include <QString>
 #include <QStringList>
@@ -236,6 +236,16 @@ private:
     QList<MacroUse> _macroUses;
 };
 
+class CPLUSPLUS_EXPORT Snapshot: public QMap<QString, Document::Ptr>
+{
+public:
+    Snapshot()
+    { }
+
+    ~Snapshot()
+    { }
+};
+
 } // end of namespace CPlusPlus
 
 #endif // CPPDOCUMENT_H
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 67eb05d7f4a..8b24b59f5ef 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -77,7 +77,7 @@ LookupContext::LookupContext(Control *control)
 LookupContext::LookupContext(Symbol *symbol,
                              Document::Ptr expressionDocument,
                              Document::Ptr thisDocument,
-                             const QMap<QString, Document::Ptr> &documents)
+                             const Snapshot &documents)
     : _symbol(symbol),
       _expressionDocument(expressionDocument),
       _thisDocument(thisDocument),
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 36ea6a8298f..18754bf6670 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -57,7 +57,7 @@ public:
     LookupContext(Symbol *symbol,
                   Document::Ptr expressionDocument,
                   Document::Ptr thisDocument,
-                  const QMap<QString, Document::Ptr> &documents);
+                  const Snapshot &documents);
 
     LookupContext(Symbol *symbol,
                   const LookupContext &context);
@@ -87,7 +87,7 @@ public:
     QList<Symbol *> resolveClassOrNamespace(Name *name) const
     { return resolveClassOrNamespace(name, visibleScopes()); }
 
-    QMap<QString, Document::Ptr> documents() const
+    Snapshot snapshot() const
     { return _documents; }
 
     enum ResolveMode {
@@ -140,7 +140,7 @@ private:
     Document::Ptr _thisDocument;
 
     // All documents.
-    QMap<QString, Document::Ptr> _documents;
+    Snapshot _documents;
 
     // Visible scopes.
     QList<Scope *> _visibleScopes;
diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp
index 68732f78ea0..cb373cce027 100644
--- a/src/libs/cplusplus/TypeOfExpression.cpp
+++ b/src/libs/cplusplus/TypeOfExpression.cpp
@@ -46,9 +46,9 @@ TypeOfExpression::TypeOfExpression():
 {
 }
 
-void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents)
+void TypeOfExpression::setSnapshot(const Snapshot &documents)
 {
-    m_documents = documents;
+    m_snapshot = documents;
     m_lookupContext = LookupContext();
 }
 
@@ -59,12 +59,12 @@ QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expr
 {
     QString code = expression;
     if (mode == Preprocess)
-        code = preprocessedExpression(expression, m_documents, document);
+        code = preprocessedExpression(expression, m_snapshot, document);
     Document::Ptr expressionDoc = documentForExpression(code);
     m_ast = extractExpressionAST(expressionDoc);
 
     m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
-                                    document, m_documents);
+                                    document, m_snapshot);
 
     ResolveExpression resolveExpression(m_lookupContext);
     return resolveExpression(m_ast);
@@ -103,7 +103,7 @@ Document::Ptr TypeOfExpression::documentForExpression(const QString &expression)
     return doc;
 }
 
-void TypeOfExpression::processEnvironment(QMap<QString, Document::Ptr> documents,
+void TypeOfExpression::processEnvironment(Snapshot documents,
                                           Document::Ptr doc, Environment *env,
                                           QSet<QString> *processed) const
 {
@@ -122,7 +122,7 @@ void TypeOfExpression::processEnvironment(QMap<QString, Document::Ptr> documents
 }
 
 QString TypeOfExpression::preprocessedExpression(const QString &expression,
-                                                 QMap<QString, Document::Ptr> documents,
+                                                 Snapshot documents,
                                                  Document::Ptr thisDocument) const
 {
     Environment env;
diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h
index e6a9a7f4b66..87d4113f30e 100644
--- a/src/libs/cplusplus/TypeOfExpression.h
+++ b/src/libs/cplusplus/TypeOfExpression.h
@@ -61,7 +61,7 @@ public:
      * Also clears the lookup context, so can be used to make sure references
      * to the documents previously used are removed.
      */
-    void setDocuments(const QMap<QString, Document::Ptr> &documents);
+    void setSnapshot(const Snapshot &documents);
 
     enum PreprocessMode {
         NoPreprocess,
@@ -100,15 +100,15 @@ private:
     ExpressionAST *extractExpressionAST(Document::Ptr doc) const;
     Document::Ptr documentForExpression(const QString &expression) const;
 
-    void processEnvironment(QMap<QString, CPlusPlus::Document::Ptr> documents,
+    void processEnvironment(CPlusPlus::Snapshot documents,
                             CPlusPlus::Document::Ptr doc, CPlusPlus::Environment *env,
                             QSet<QString> *processed) const;
 
     QString preprocessedExpression(const QString &expression,
-                                   QMap<QString, CPlusPlus::Document::Ptr> documents,
+                                   CPlusPlus::Snapshot documents,
                                    CPlusPlus::Document::Ptr thisDocument) const;
 
-    QMap<QString, Document::Ptr> m_documents;
+    Snapshot m_snapshot;
     ExpressionAST *m_ast;
     LookupContext m_lookupContext;
 };
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index acf55f6d93f..49b130ebc1c 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -427,7 +427,9 @@ void CPPEditor::switchDeclarationDefinition()
     if (!m_modelManager)
         return;
 
-    Document::Ptr doc = m_modelManager->document(file()->fileName());
+    const Snapshot snapshot = m_modelManager->snapshot();
+
+    Document::Ptr doc = snapshot.value(file()->fileName());
     if (!doc)
         return;
     Symbol *lastSymbol = doc->findSymbolAt(line, column);
@@ -445,7 +447,7 @@ void CPPEditor::switchDeclarationDefinition()
 
     if (f) {
         TypeOfExpression typeOfExpression;
-        typeOfExpression.setDocuments(m_modelManager->documents());
+        typeOfExpression.setSnapshot(m_modelManager->snapshot());
         QList<TypeOfExpression::Result> resolvedSymbols = typeOfExpression(QString(), doc, lastSymbol);
         const LookupContext &context = typeOfExpression.lookupContext();
 
@@ -474,10 +476,12 @@ void CPPEditor::jumpToDefinition()
     if (!m_modelManager)
         return;
 
+    const Snapshot snapshot = m_modelManager->snapshot();
+
     // Find the last symbol up to the cursor position
     int line = 0, column = 0;
     convertPosition(position(), &line, &column);
-    Document::Ptr doc = m_modelManager->document(file()->fileName());
+    Document::Ptr doc = snapshot.value(file()->fileName());
     if (!doc)
         return;
 
@@ -503,7 +507,7 @@ void CPPEditor::jumpToDefinition()
 
     // Evaluate the type of the expression
     TypeOfExpression typeOfExpression;
-    typeOfExpression.setDocuments(m_modelManager->documents());
+    typeOfExpression.setSnapshot(m_modelManager->snapshot());
     QList<TypeOfExpression::Result> resolvedSymbols =
             typeOfExpression(expression, doc, lastSymbol);
 
@@ -572,7 +576,7 @@ Symbol *CPPEditor::findDefinition(Symbol *lastSymbol)
     QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
     LookupContext context(&control);
 
-    const QMap<QString, Document::Ptr> documents = m_modelManager->documents();
+    const Snapshot documents = m_modelManager->snapshot();
     foreach (Document::Ptr doc, documents) {
         QList<Scope *> visibleScopes;
         visibleScopes.append(doc->globalSymbols());
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 4606bd948f3..a0fbe82a542 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -434,10 +434,12 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     //if (! expression.isEmpty())
         //qDebug() << "***** expression:" << expression;
 
-    if (Document::Ptr thisDocument = m_manager->document(fileName)) {
+    const Snapshot snapshot = m_manager->snapshot();
+
+    if (Document::Ptr thisDocument = snapshot.value(fileName)) {
         Symbol *symbol = thisDocument->findSymbolAt(line, column);
 
-        typeOfExpression.setDocuments(m_manager->documents());
+        typeOfExpression.setSnapshot(m_manager->snapshot());
 
         QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, symbol,
                                                                          TypeOfExpression::Preprocess);
@@ -1034,7 +1036,7 @@ void CppCodeCompletion::cleanup()
 
     // Set empty map in order to avoid referencing old versions of the documents
     // until the next completion
-    typeOfExpression.setDocuments(QMap<QString, Document::Ptr>());
+    typeOfExpression.setSnapshot(Snapshot());
 }
 
 int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor)
diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp
index f3831e5394d..fab0d83b31f 100644
--- a/src/plugins/cpptools/cpphoverhandler.cpp
+++ b/src/plugins/cpptools/cpphoverhandler.cpp
@@ -165,9 +165,11 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
     QTextCursor tc(edit->document());
     tc.setPosition(pos);
 
+    const Snapshot documents = m_manager->snapshot();
+
     const int lineNumber = tc.block().blockNumber() + 1;
     const QString fileName = editor->file()->fileName();
-    Document::Ptr doc = m_manager->document(fileName);
+    Document::Ptr doc = documents.value(fileName);
     if (doc) {
         foreach (Document::DiagnosticMessage m, doc->diagnosticMessages()) {
             if (m.line() == lineNumber) {
@@ -212,7 +214,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
             Symbol *lastSymbol = doc->findSymbolAt(line, column);
 
             TypeOfExpression typeOfExpression;
-            typeOfExpression.setDocuments(m_manager->documents());
+            typeOfExpression.setSnapshot(documents);
             QList<TypeOfExpression::Result> types = typeOfExpression(expression, doc, lastSymbol);
 
             if (!types.isEmpty()) {
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 9adc892713d..a02656ee8c9 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -143,7 +143,7 @@ protected:
 
 private:
     QPointer<CppModelManager> m_modelManager;
-    CppModelManager::DocumentTable m_documents;
+    Snapshot m_snapshot;
     Environment env;
     pp m_proc;
     QStringList m_includePaths;
@@ -160,7 +160,7 @@ private:
 
 CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
     : m_modelManager(modelManager),
-    m_documents(modelManager->documents()),
+    m_snapshot(modelManager->snapshot()),
     m_proc(this, env)
 { }
 
@@ -340,7 +340,7 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process
     processed->insert(fn);
 
     foreach (QString includedFile, doc->includedFiles()) {
-        mergeEnvironment(m_documents.value(includedFile), processed);
+        mergeEnvironment(m_snapshot.value(includedFile), processed);
     }
 
     foreach (const Macro macro, doc->definedMacros()) {
@@ -386,7 +386,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
     }
 
     if (! contents.isEmpty()) {
-        Document::Ptr cachedDoc = m_documents.value(fileName);
+        Document::Ptr cachedDoc = m_snapshot.value(fileName);
         if (cachedDoc && m_currentDoc) {
             mergeEnvironment(cachedDoc);
         } else {
@@ -477,11 +477,8 @@ CppModelManager::CppModelManager(QObject *parent) :
 CppModelManager::~CppModelManager()
 { }
 
-Document::Ptr CppModelManager::document(const QString &fileName) const
-{ return m_documents.value(fileName); }
-
-CppModelManager::DocumentTable CppModelManager::documents() const
-{ return m_documents; }
+Snapshot CppModelManager::snapshot() const
+{ return m_snapshot; }
 
 void CppModelManager::ensureUpdated()
 {
@@ -672,7 +669,7 @@ void CppModelManager::emitDocumentUpdated(Document::Ptr doc)
 void CppModelManager::onDocumentUpdated(Document::Ptr doc)
 {
     const QString fileName = doc->fileName();
-    m_documents[fileName] = doc;
+    m_snapshot[fileName] = doc;
     QList<Core::IEditor *> openedEditors = m_core->editorManager()->openedEditors();
     foreach (Core::IEditor *editor, openedEditors) {
         if (editor->file()->fileName() == fileName) {
@@ -837,7 +834,7 @@ void CppModelManager::parse(QFutureInterface<void> &future,
 
 void CppModelManager::GC()
 {
-    DocumentTable documents = m_documents;
+    Snapshot documents = m_snapshot;
 
     QSet<QString> processed;
     QStringList todo = projectFiles();
@@ -868,7 +865,7 @@ void CppModelManager::GC()
     }
 
     emit aboutToRemoveFiles(removedFiles);
-    m_documents = documents;
+    m_snapshot = documents;
 }
 
 
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 3b2f4e19993..25947056203 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -76,8 +76,7 @@ public:
     virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
     virtual void updateProjectInfo(const ProjectInfo &pinfo);
 
-    virtual CPlusPlus::Document::Ptr document(const QString &fileName) const;
-    virtual DocumentTable documents() const;
+    virtual CPlusPlus::Snapshot snapshot() const;
     virtual void GC();
 
     QFuture<void> refreshSourceFiles(const QStringList &sourceFiles);
@@ -146,7 +145,7 @@ private:
     Core::ICore *m_core;
     ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer;
     CppHoverHandler *m_hoverHandler;
-    DocumentTable m_documents;
+    CPlusPlus::Snapshot m_snapshot;
 
     // cache
     bool m_dirty;
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index e3ad4fe961b..6dc0da67ca0 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -46,14 +46,11 @@ namespace ProjectExplorer {
 
 namespace CppTools {
 
-class CPPTOOLS_EXPORT CppModelManagerInterface
-        : public QObject
+class CPPTOOLS_EXPORT CppModelManagerInterface: public QObject
 {
     Q_OBJECT
 
 public:
-    typedef QMap<QString, CPlusPlus::Document::Ptr> DocumentTable; // ### remove me
-
     class ProjectInfo
     {
     public:
@@ -89,8 +86,7 @@ public:
     virtual void GC() = 0;
     virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;
 
-    virtual CPlusPlus::Document::Ptr document(const QString &fileName) const = 0;
-    virtual DocumentTable documents() const = 0;
+    virtual CPlusPlus::Snapshot snapshot() const = 0;
 
     virtual QList<ProjectInfo> projectInfos() const = 0;
     virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index 4997e5cf049..494455f6d85 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -43,6 +43,7 @@
 #include <QIcon>
 #include <QMetaType>
 #include <QString>
+#include <QSet>
 
 #include <functional>
 
diff --git a/src/plugins/designer/workbenchintegration.cpp b/src/plugins/designer/workbenchintegration.cpp
index 4e49218a5c4..273aa2cfb82 100644
--- a/src/plugins/designer/workbenchintegration.cpp
+++ b/src/plugins/designer/workbenchintegration.cpp
@@ -95,7 +95,7 @@ QList<Document::Ptr> WorkbenchIntegration::findDocuments(const QString &uiFileNa
 
     QList<Document::Ptr> docList;
     // take all docs
-    CppTools::CppModelManagerInterface::DocumentTable docTable = cppModelManager->documents();
+    CPlusPlus::Snapshot docTable = cppModelManager->snapshot();
     foreach (Document::Ptr doc, docTable) { // we go through all documents
         QStringList includes = doc->includedFiles();
         foreach (QString include, includes) {
@@ -253,7 +253,7 @@ Document::Ptr WorkbenchIntegration::findDefinition(Function *functionDeclaration
     QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
     LookupContext context(&control);
 
-    const QMap<QString, Document::Ptr> documents = cppModelManager->documents();
+    const Snapshot documents = cppModelManager->snapshot();
     foreach (Document::Ptr doc, documents) {
         QList<Scope *> visibleScopes;
         visibleScopes.append(doc->globalSymbols());
-- 
GitLab