diff --git a/src/libs/utils/mimetypes2/mimedatabase.cpp b/src/libs/utils/mimetypes2/mimedatabase.cpp index 596318427bf..2f4d36d39d5 100644 --- a/src/libs/utils/mimetypes2/mimedatabase.cpp +++ b/src/libs/utils/mimetypes2/mimedatabase.cpp @@ -39,6 +39,15 @@ static QString plainTextMimeType() namespace Utils { +// simplified from qduplicatetracker_p.h +template +class DuplicateTracker { +public: + bool hasSeen(const T &v) { return Utils::insert(seen, v); } +private: + QSet seen; +}; + Q_GLOBAL_STATIC(MimeDatabasePrivate, staticMimeDatabase) MimeDatabasePrivate *MimeDatabasePrivate::instance() @@ -584,6 +593,7 @@ QList MimeDatabasePrivate::allMimeTypes() bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) { const QString resolvedParent = resolveAlias(parent); + DuplicateTracker seen; std::stack toCheck; toCheck.push(mime); while (!toCheck.empty()) { @@ -592,8 +602,11 @@ bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) const QString mimeName = toCheck.top(); toCheck.pop(); const auto parentList = parents(mimeName); - for (const QString &par : parentList) - toCheck.push(resolveAlias(par)); + for (const QString &par : parentList) { + const QString resolvedPar = resolveAlias(par); + if (!seen.hasSeen(resolvedPar)) + toCheck.push(resolvedPar); + } } return false; } diff --git a/src/libs/utils/mimetypes2/mimetype.cpp b/src/libs/utils/mimetypes2/mimetype.cpp index 22cfd18e733..06f5bc678f9 100644 --- a/src/libs/utils/mimetypes2/mimetype.cpp +++ b/src/libs/utils/mimetypes2/mimetype.cpp @@ -338,14 +338,17 @@ QStringList MimeType::parentMimeTypes() const static void collectParentMimeTypes(const QString &mime, QStringList &allParents) { const QStringList parents = MimeDatabasePrivate::instance()->mimeParents(mime); + QStringList newParents; for (const QString &parent : parents) { // I would use QSet, but since order matters I better not - if (!allParents.contains(parent)) + if (!allParents.contains(parent)) { allParents.append(parent); + newParents.append(parent); + } } // We want a breadth-first search, so that the least-specific parent (octet-stream) is last // This means iterating twice, unfortunately. - for (const QString &parent : parents) + for (const QString &parent : newParents) collectParentMimeTypes(parent, allParents); }