diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 6e241fb29b0..42616498977 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -821,16 +821,10 @@ FilePaths Snapshot::filesDependingOn(const FilePath &filePath) const return m_deps.filesDependingOn(filePath); } -void Snapshot::updateDependencyTable() const -{ - QFutureInterfaceBase futureInterface; - updateDependencyTable(futureInterface); -} - -void Snapshot::updateDependencyTable(QFutureInterfaceBase &futureInterface) const +void Snapshot::updateDependencyTable(const std::optional> &future) const { if (m_deps.files.isEmpty()) - m_deps.build(futureInterface, *this); + m_deps.build(future, *this); } bool Snapshot::operator==(const Snapshot &other) const diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index cfbad3be1ea..679663f2d99 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -15,12 +15,9 @@ #include #include #include +#include #include -QT_BEGIN_NAMESPACE -class QFutureInterfaceBase; -QT_END_NAMESPACE - namespace CPlusPlus { class Macro; @@ -406,8 +403,7 @@ public: Utils::FilePaths filesDependingOn(const Utils::FilePath &filePath) const; - void updateDependencyTable() const; - void updateDependencyTable(QFutureInterfaceBase &futureInterface) const; + void updateDependencyTable(const std::optional> &future = {}) const; bool operator==(const Snapshot &other) const; diff --git a/src/libs/cplusplus/DependencyTable.cpp b/src/libs/cplusplus/DependencyTable.cpp index 00aca7dc65a..5960957330b 100644 --- a/src/libs/cplusplus/DependencyTable.cpp +++ b/src/libs/cplusplus/DependencyTable.cpp @@ -4,7 +4,7 @@ #include "CppDocument.h" #include -#include +#include using namespace Utils; @@ -28,14 +28,14 @@ Utils::FilePaths DependencyTable::filesDependingOn(const Utils::FilePath &fileNa return deps; } -void DependencyTable::build(QFutureInterfaceBase &futureInterface, const Snapshot &snapshot) +void DependencyTable::build(const std::optional> &future, const Snapshot &snapshot) { files.clear(); fileIndex.clear(); includes.clear(); includeMap.clear(); - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; const int documentCount = snapshot.size(); @@ -49,7 +49,7 @@ void DependencyTable::build(QFutureInterfaceBase &futureInterface, const Snapsho fileIndex[it.key()] = i; } - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; for (int i = 0; i < files.size(); ++i) { @@ -68,13 +68,13 @@ void DependencyTable::build(QFutureInterfaceBase &futureInterface, const Snapsho directIncludes.append(index); bitmap.setBit(index, true); - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; } includeMap[i] = bitmap; includes[i] = directIncludes; - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; } } @@ -91,7 +91,7 @@ void DependencyTable::build(QFutureInterfaceBase &futureInterface, const Snapsho const QList includedFileIndexes = includes.value(i); for (const int includedFileIndex : includedFileIndexes) { bitmap |= includeMap.value(includedFileIndex); - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; } @@ -99,10 +99,10 @@ void DependencyTable::build(QFutureInterfaceBase &futureInterface, const Snapsho includeMap[i] = bitmap; changed = true; } - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; } - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; } while (changed); } diff --git a/src/libs/cplusplus/DependencyTable.h b/src/libs/cplusplus/DependencyTable.h index d9057844330..d460ebeb7f3 100644 --- a/src/libs/cplusplus/DependencyTable.h +++ b/src/libs/cplusplus/DependencyTable.h @@ -14,7 +14,8 @@ #include QT_BEGIN_NAMESPACE -class QFutureInterfaceBase; +template +class QFuture; QT_END_NAMESPACE namespace CPlusPlus { @@ -25,7 +26,7 @@ class CPLUSPLUS_EXPORT DependencyTable { private: friend class Snapshot; - void build(QFutureInterfaceBase &futureInterface, const Snapshot &snapshot); + void build(const std::optional> &future, const Snapshot &snapshot); Utils::FilePaths filesDependingOn(const Utils::FilePath &fileName) const; QVector files; diff --git a/src/plugins/cppeditor/cppelementevaluator.cpp b/src/plugins/cppeditor/cppelementevaluator.cpp index dabb8cffc0d..3ce1761ce59 100644 --- a/src/plugins/cppeditor/cppelementevaluator.cpp +++ b/src/plugins/cppeditor/cppelementevaluator.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include @@ -140,20 +140,20 @@ CppClass *CppClass::toCppClass() return this; } -void CppClass::lookupBases(QFutureInterfaceBase &futureInterface, - Symbol *declaration, const LookupContext &context) +void CppClass::lookupBases(const QFuture &future, Symbol *declaration, + const LookupContext &context) { ClassOrNamespace *hierarchy = context.lookupType(declaration); if (!hierarchy) return; QSet visited; - addBaseHierarchy(futureInterface, context, hierarchy, &visited); + addBaseHierarchy(future, context, hierarchy, &visited); } -void CppClass::addBaseHierarchy(QFutureInterfaceBase &futureInterface, const LookupContext &context, +void CppClass::addBaseHierarchy(const QFuture &future, const LookupContext &context, ClassOrNamespace *hierarchy, QSet *visited) { - if (futureInterface.isCanceled()) + if (future.isCanceled()) return; visited->insert(hierarchy); const QList &baseClasses = hierarchy->usings(); @@ -165,21 +165,21 @@ void CppClass::addBaseHierarchy(QFutureInterfaceBase &futureInterface, const Loo ClassOrNamespace *baseHierarchy = context.lookupType(symbol); if (baseHierarchy && !visited->contains(baseHierarchy)) { CppClass classSymbol(symbol); - classSymbol.addBaseHierarchy(futureInterface, context, baseHierarchy, visited); + classSymbol.addBaseHierarchy(future, context, baseHierarchy, visited); bases.append(classSymbol); } } } } -void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface, - Symbol *declaration, const Snapshot &snapshot) +void CppClass::lookupDerived(const QFuture &future, Symbol *declaration, + const Snapshot &snapshot) { - snapshot.updateDependencyTable(futureInterface); - if (futureInterface.isCanceled()) + snapshot.updateDependencyTable(future); + if (future.isCanceled()) return; addDerivedHierarchy(TypeHierarchyBuilder::buildDerivedTypeHierarchy( - futureInterface, declaration, snapshot)); + declaration, snapshot, future)); } void CppClass::addDerivedHierarchy(const TypeHierarchy &hierarchy) @@ -340,13 +340,13 @@ static Symbol *followTemplateAsClass(Symbol *symbol) return symbol; } -static void createTypeHierarchy(QFutureInterface> &futureInterface, +static void createTypeHierarchy(QPromise> &promise, const Snapshot &snapshot, const LookupItem &lookupItem, const LookupContext &context, SymbolFinder symbolFinder) { - if (futureInterface.isCanceled()) + if (promise.isCanceled()) return; Symbol *declaration = lookupItem.declaration(); @@ -360,16 +360,17 @@ static void createTypeHierarchy(QFutureInterface> &fu declaration = followClassDeclaration(declaration, snapshot, symbolFinder, &contextToUse); declaration = followTemplateAsClass(declaration); - if (futureInterface.isCanceled()) + if (promise.isCanceled()) return; QSharedPointer cppClass(new CppClass(declaration)); - cppClass->lookupBases(futureInterface, declaration, contextToUse); - if (futureInterface.isCanceled()) + const QFuture future = QFuture(promise.future()); + cppClass->lookupBases(future, declaration, contextToUse); + if (promise.isCanceled()) return; - cppClass->lookupDerived(futureInterface, declaration, snapshot); - if (futureInterface.isCanceled()) + cppClass->lookupDerived(future, declaration, snapshot); + if (promise.isCanceled()) return; - futureInterface.reportResult(cppClass); + promise.addResult(cppClass); } static QSharedPointer handleLookupItemMatch(const Snapshot &snapshot, @@ -495,7 +496,7 @@ static QFuture> asyncExec( const CPlusPlus::Snapshot &snapshot, const CPlusPlus::LookupItem &lookupItem, const CPlusPlus::LookupContext &lookupContext) { - return Utils::runAsync(&createTypeHierarchy, snapshot, lookupItem, lookupContext, + return Utils::asyncRun(&createTypeHierarchy, snapshot, lookupItem, lookupContext, *CppModelManager::instance()->symbolFinder()); } diff --git a/src/plugins/cppeditor/cppelementevaluator.h b/src/plugins/cppeditor/cppelementevaluator.h index 7d03df67121..47ddcbeae19 100644 --- a/src/plugins/cppeditor/cppelementevaluator.h +++ b/src/plugins/cppeditor/cppelementevaluator.h @@ -92,16 +92,16 @@ public: CppClass *toCppClass() final; - void lookupBases(QFutureInterfaceBase &futureInterface, - CPlusPlus::Symbol *declaration, const CPlusPlus::LookupContext &context); - void lookupDerived(QFutureInterfaceBase &futureInterface, - CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot); + void lookupBases(const QFuture &future, CPlusPlus::Symbol *declaration, + const CPlusPlus::LookupContext &context); + void lookupDerived(const QFuture &future, CPlusPlus::Symbol *declaration, + const CPlusPlus::Snapshot &snapshot); QList bases; QList derived; private: - void addBaseHierarchy(QFutureInterfaceBase &futureInterface, + void addBaseHierarchy(const QFuture &future, const CPlusPlus::LookupContext &context, CPlusPlus::ClassOrNamespace *hierarchy, QSet *visited); diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index c7a9e472ca5..27ef5751d10 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -183,7 +183,8 @@ void CppTypeHierarchyWidget::perform() m_futureWatcher.setFuture(QFuture(m_future)); m_synchronizer.addFuture(m_future); - Core::ProgressManager::addTask(m_future, Tr::tr("Evaluating Type Hierarchy"), "TypeHierarchy"); + Core::ProgressManager::addTimedTask(m_futureWatcher.future(), + Tr::tr("Evaluating Type Hierarchy"), "TypeHierarchy", 2); } void CppTypeHierarchyWidget::performFromExpression(const QString &expression, const FilePath &filePath) diff --git a/src/plugins/cppeditor/typehierarchybuilder.cpp b/src/plugins/cppeditor/typehierarchybuilder.cpp index 5f3aae00e79..889d0eacfc0 100644 --- a/src/plugins/cppeditor/typehierarchybuilder.cpp +++ b/src/plugins/cppeditor/typehierarchybuilder.cpp @@ -108,20 +108,12 @@ const QList &TypeHierarchy::hierarchy() const } TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(Symbol *symbol, - const Snapshot &snapshot) -{ - QFutureInterfaceBase dummy; - return TypeHierarchyBuilder::buildDerivedTypeHierarchy(dummy, symbol, snapshot); -} - -TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface, - Symbol *symbol, - const Snapshot &snapshot) + const Snapshot &snapshot, const std::optional> &future) { TypeHierarchy hierarchy(symbol); TypeHierarchyBuilder builder; QHash> cache; - builder.buildDerived(futureInterface, &hierarchy, snapshot, cache); + builder.buildDerived(future, &hierarchy, snapshot, cache); return hierarchy; } @@ -172,11 +164,10 @@ static FilePaths filesDependingOn(const Snapshot &snapshot, Symbol *symbol) return FilePaths{file} + snapshot.filesDependingOn(file); } -void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, +void TypeHierarchyBuilder::buildDerived(const std::optional> &future, TypeHierarchy *typeHierarchy, const Snapshot &snapshot, - QHash> &cache, - int depth) + QHash> &cache) { Symbol *symbol = typeHierarchy->_symbol; if (_visited.contains(symbol)) @@ -188,15 +179,10 @@ void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, DerivedHierarchyVisitor visitor(symbolName, cache); const FilePaths dependingFiles = filesDependingOn(snapshot, symbol); - if (depth == 0) - futureInterface.setProgressRange(0, dependingFiles.size()); - int i = -1; for (const FilePath &fileName : dependingFiles) { - if (futureInterface.isCanceled()) + if (future && future->isCanceled()) return; - if (depth == 0) - futureInterface.setProgressValue(++i); Document::Ptr doc = snapshot.document(fileName); if ((_candidates.contains(fileName) && !_candidates.value(fileName).contains(symbolName)) || !doc->control()->findIdentifier(symbol->identifier()->chars(), @@ -210,8 +196,8 @@ void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, const QList &derived = visitor.derived(); for (Symbol *s : derived) { TypeHierarchy derivedHierarchy(s); - buildDerived(futureInterface, &derivedHierarchy, snapshot, cache, depth + 1); - if (futureInterface.isCanceled()) + buildDerived(future, &derivedHierarchy, snapshot, cache); + if (future && future->isCanceled()) return; typeHierarchy->_hierarchy.append(derivedHierarchy); } diff --git a/src/plugins/cppeditor/typehierarchybuilder.h b/src/plugins/cppeditor/typehierarchybuilder.h index 07556126dd8..c6ee8a56bf6 100644 --- a/src/plugins/cppeditor/typehierarchybuilder.h +++ b/src/plugins/cppeditor/typehierarchybuilder.h @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include @@ -44,19 +44,17 @@ class TypeHierarchyBuilder { public: static TypeHierarchy buildDerivedTypeHierarchy(CPlusPlus::Symbol *symbol, - const CPlusPlus::Snapshot &snapshot); - static TypeHierarchy buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface, - CPlusPlus::Symbol *symbol, - const CPlusPlus::Snapshot &snapshot); + const CPlusPlus::Snapshot &snapshot, + const std::optional> &future = {}); static CPlusPlus::LookupItem followTypedef(const CPlusPlus::LookupContext &context, const CPlusPlus::Name *symbolName, CPlusPlus::Scope *enclosingScope, std::set typedefs = {}); private: TypeHierarchyBuilder() = default; - void buildDerived(QFutureInterfaceBase &futureInterface, TypeHierarchy *typeHierarchy, + void buildDerived(const std::optional> &future, TypeHierarchy *typeHierarchy, const CPlusPlus::Snapshot &snapshot, - QHash > &cache, int depth = 0); + QHash > &cache); QSet _visited; QHash > _candidates;