diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index b31f0d2bc6456617e7ad1c4a4171b07c2f77a324..54de3c801ea866cac6812bac662ed8fff7e97c15 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 67eb05d7f4aea4a4be4e3b02ee6fe315b39eead9..8b24b59f5efe8b79d9da1336dad74f5da7744eae 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 36ea6a8298fa714c984110407dadad3f46046e78..18754bf6670676165a8043325caf02ada1ab542c 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 68732f78ea09d31103c2329a2157c973e8bdb435..cb373cce027c5a3606482a0b1cbc2e206a274949 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 e6a9a7f4b666c8a8b1494aea273e0b1196aee6fe..87d4113f30e9f3298a6ad5505e8ae82661f2dbcf 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 acf55f6d93fb78d36be21f9c3f9ac2372b43b8a0..49b130ebc1cc8f8bbe84f52525ded5a77339438f 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 4606bd948f346d332155e4ffc939c62a3490ba31..a0fbe82a542b7cead52b72a95a20452d18f71602 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 f3831e5394d0263ce0be9840ea2ee33019c0f5b3..fab0d83b31fcc3d0c6c818857324e52cfd29fb19 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 9adc892713d54fb6e8cf8a411d6ed378b01e9e5e..a02656ee8c96943d5e774970c2727a0cb53126e0 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 3b2f4e19993248a6e31c124c902568ed89947d9d..25947056203929e7fac1e17096525b8f402dd64b 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 e3ad4fe961be962f93cf30f3f7745ca055b8faa0..6dc0da67ca0b90cac3a9abec535fbac23f676def 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 4997e5cf049bb72d9512c56191bf2d4d0728abcd..494455f6d85ad2e7796cd5bd32cf41b554890859 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 4e49218a5c4107d762eb1bdb9df8a132fc29735e..273aa2cfb82c1cb8ea1221aeabe9213d1263111d 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());