diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp index 0e739ddeab2..27c6f25ad07 100644 --- a/src/plugins/cpptools/cppelementevaluator.cpp +++ b/src/plugins/cpptools/cppelementevaluator.cpp @@ -50,7 +50,7 @@ static void handleLookupItemMatch(QFutureInterface> & const Snapshot &snapshot, const LookupItem &lookupItem, const LookupContext &context, - CppTools::SymbolFinder symbolFinder, + SymbolFinder symbolFinder, bool lookupBaseClasses, bool lookupDerivedClasses); @@ -211,13 +211,13 @@ void CppClass::lookupBases(QFutureInterfaceBase &futureInterface, void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface, Symbol *declaration, const Snapshot &snapshot) { - using Data = QPair; + using Data = QPair; snapshot.updateDependencyTable(futureInterface); if (futureInterface.isCanceled()) return; - CppTools::TypeHierarchyBuilder builder(declaration, snapshot); - const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(futureInterface); + const TypeHierarchy &completeHierarchy + = TypeHierarchyBuilder::buildDerivedTypeHierarchy(futureInterface, declaration, snapshot); QQueue q; q.enqueue(qMakePair(this, completeHierarchy)); @@ -226,8 +226,8 @@ void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface, return; const Data ¤t = q.dequeue(); CppClass *clazz = current.first; - const CppTools::TypeHierarchy &classHierarchy = current.second; - foreach (const CppTools::TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { + const TypeHierarchy &classHierarchy = current.second; + foreach (const TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { clazz->derived.append(CppClass(derivedHierarchy.symbol())); q.enqueue(qMakePair(&clazz->derived.last(), derivedHierarchy)); } @@ -349,7 +349,7 @@ public: CppElementEvaluator::CppElementEvaluator(TextEditor::TextEditorWidget *editor) : m_editor(editor), - m_modelManager(CppTools::CppModelManager::instance()), + m_modelManager(CppModelManager::instance()), m_tc(editor->textCursor()), m_lookupBaseClasses(false), m_lookupDerivedClasses(false) @@ -497,7 +497,7 @@ static void handleLookupItemMatch(QFutureInterface> & const Snapshot &snapshot, const LookupItem &lookupItem, const LookupContext &context, - CppTools::SymbolFinder symbolFinder, + SymbolFinder symbolFinder, bool lookupBaseClasses, bool lookupDerivedClasses) { diff --git a/src/plugins/cpptools/functionutils.cpp b/src/plugins/cpptools/functionutils.cpp index b19fe439588..7a13e7d26c9 100644 --- a/src/plugins/cpptools/functionutils.cpp +++ b/src/plugins/cpptools/functionutils.cpp @@ -161,8 +161,8 @@ QList FunctionUtils::overrides(Function *function, Class *functionsC QTC_ASSERT(referenceName && referenceType.isValid(), return result); // Find overrides - TypeHierarchyBuilder builder(staticClass, snapshot); - const TypeHierarchy &staticClassHierarchy = builder.buildDerivedTypeHierarchy(); + const TypeHierarchy &staticClassHierarchy + = TypeHierarchyBuilder::buildDerivedTypeHierarchy(staticClass, snapshot); QList l; if (functionsClass != staticClass) diff --git a/src/plugins/cpptools/typehierarchybuilder.cpp b/src/plugins/cpptools/typehierarchybuilder.cpp index a5f05d9042f..b843cd93d1a 100644 --- a/src/plugins/cpptools/typehierarchybuilder.cpp +++ b/src/plugins/cpptools/typehierarchybuilder.cpp @@ -134,34 +134,42 @@ const QList &TypeHierarchy::hierarchy() const return _hierarchy; } -TypeHierarchyBuilder::TypeHierarchyBuilder(CPlusPlus::Symbol *symbol, const CPlusPlus::Snapshot &snapshot) - : _symbol(symbol) - , _snapshot(snapshot) -{} - -void TypeHierarchyBuilder::reset() -{ - _visited.clear(); - _candidates.clear(); -} - -TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy() +TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(CPlusPlus::Symbol *symbol, + const CPlusPlus::Snapshot &snapshot) { QFutureInterfaceBase dummy; - return buildDerivedTypeHierarchy(dummy); + return TypeHierarchyBuilder::buildDerivedTypeHierarchy(dummy, symbol, snapshot); } -TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface) +TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface, + CPlusPlus::Symbol *symbol, + const CPlusPlus::Snapshot &snapshot) { - reset(); - TypeHierarchy hierarchy(_symbol); - buildDerived(futureInterface, &hierarchy, filesDependingOn(_symbol)); + TypeHierarchy hierarchy(symbol); + TypeHierarchyBuilder builder; + builder.buildDerived(futureInterface, &hierarchy, snapshot); return hierarchy; } +static QStringList filesDependingOn(const CPlusPlus::Snapshot &snapshot, + CPlusPlus::Symbol *symbol) +{ + QStringList deps; + if (!symbol) + return deps; + + const Utils::FilePath file = Utils::FilePath::fromUtf8(symbol->fileName(), symbol->fileNameLength()); + deps << file.toString(); + const Utils::FilePaths filePaths = snapshot.filesDependingOn(file); + for (const Utils::FilePath &fileName : filePaths) + deps.append(fileName.toString()); + return deps; +} + void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, TypeHierarchy *typeHierarchy, - const QStringList &dependingFiles, int depth) + const CPlusPlus::Snapshot &snapshot, + int depth) { CPlusPlus::Symbol *symbol = typeHierarchy->_symbol; if (_visited.contains(symbol)) @@ -172,6 +180,7 @@ void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, const QString &symbolName = _overview.prettyName(CPlusPlus::LookupContext::fullyQualifiedName(symbol)); DerivedHierarchyVisitor visitor(symbolName); + const QStringList &dependingFiles = filesDependingOn(snapshot, symbol); if (depth == 0) futureInterface.setProgressRange(0, dependingFiles.size()); @@ -181,37 +190,23 @@ void TypeHierarchyBuilder::buildDerived(QFutureInterfaceBase &futureInterface, return; if (depth == 0) futureInterface.setProgressValue(++i); - CPlusPlus::Document::Ptr doc = _snapshot.document(fileName); + CPlusPlus::Document::Ptr doc = snapshot.document(fileName); if ((_candidates.contains(fileName) && !_candidates.value(fileName).contains(symbolName)) || !doc->control()->findIdentifier(symbol->identifier()->chars(), symbol->identifier()->size())) { continue; } - visitor.execute(doc, _snapshot); + visitor.execute(doc, snapshot); _candidates.insert(fileName, visitor.otherBases()); const QList &derived = visitor.derived(); for (CPlusPlus::Symbol *s : derived) { TypeHierarchy derivedHierarchy(s); - buildDerived(futureInterface, &derivedHierarchy, filesDependingOn(s), depth + 1); + buildDerived(futureInterface, &derivedHierarchy, snapshot, depth + 1); if (futureInterface.isCanceled()) return; typeHierarchy->_hierarchy.append(derivedHierarchy); } } } - -QStringList TypeHierarchyBuilder::filesDependingOn(CPlusPlus::Symbol *symbol) const -{ - QStringList deps; - if (!symbol) - return deps; - - const Utils::FilePath file = Utils::FilePath::fromUtf8(symbol->fileName(), symbol->fileNameLength()); - deps << file.toString(); - const Utils::FilePaths filePaths = _snapshot.filesDependingOn(file); - for (const Utils::FilePath &fileName : filePaths) - deps.append(fileName.toString()); - return deps; -} diff --git a/src/plugins/cpptools/typehierarchybuilder.h b/src/plugins/cpptools/typehierarchybuilder.h index 7633b42943e..55dd68f54af 100644 --- a/src/plugins/cpptools/typehierarchybuilder.h +++ b/src/plugins/cpptools/typehierarchybuilder.h @@ -58,19 +58,17 @@ private: class CPPTOOLS_EXPORT TypeHierarchyBuilder { public: - TypeHierarchyBuilder(CPlusPlus::Symbol *symbol, const CPlusPlus::Snapshot &snapshot); - - TypeHierarchy buildDerivedTypeHierarchy(); - TypeHierarchy buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface); + static TypeHierarchy buildDerivedTypeHierarchy(CPlusPlus::Symbol *symbol, + const CPlusPlus::Snapshot &snapshot); + static TypeHierarchy buildDerivedTypeHierarchy(QFutureInterfaceBase &futureInterface, + CPlusPlus::Symbol *symbol, + const CPlusPlus::Snapshot &snapshot); private: - void reset(); - void buildDerived(QFutureInterfaceBase &futureInterface, - TypeHierarchy *typeHierarchy, const QStringList &dependencies, int depth = 0); - QStringList filesDependingOn(CPlusPlus::Symbol *symbol) const; + TypeHierarchyBuilder() = default; + void buildDerived(QFutureInterfaceBase &futureInterface, TypeHierarchy *typeHierarchy, + const CPlusPlus::Snapshot &snapshot, int depth = 0); - CPlusPlus::Symbol *_symbol; - CPlusPlus::Snapshot _snapshot; QSet _visited; QHash > _candidates; CPlusPlus::Overview _overview; diff --git a/src/plugins/cpptools/typehierarchybuilder_test.cpp b/src/plugins/cpptools/typehierarchybuilder_test.cpp index 0a4ac54568d..70b172acf9c 100644 --- a/src/plugins/cpptools/typehierarchybuilder_test.cpp +++ b/src/plugins/cpptools/typehierarchybuilder_test.cpp @@ -124,8 +124,8 @@ public: QVERIFY(clazz); // Generate and compare hierarchies - TypeHierarchyBuilder typeHierarchyBuilder(clazz, snapshot); - const TypeHierarchy hierarchy = typeHierarchyBuilder.buildDerivedTypeHierarchy(); + const TypeHierarchy hierarchy + = TypeHierarchyBuilder::buildDerivedTypeHierarchy(clazz, snapshot); const QString actualHierarchy = toString(hierarchy); // Uncomment for updating/generating reference data: