From 19a9eac46ee88c7ea903b545995b73f035f30d9a Mon Sep 17 00:00:00 2001 From: Marco Benelli Date: Wed, 13 Jul 2016 16:38:36 +0200 Subject: [PATCH] QmlJs: circular dependencies handling Task-number: QTCREATORBUG-16585 Change-Id: Ia1e01f1314cd4022d59dc768752baaa367fe250a Reviewed-by: Robert Loehning Reviewed-by: Erik Verbruggen --- src/libs/qmljs/qmljsplugindumper.cpp | 12 ++++++++++-- src/libs/qmljs/qmljsplugindumper.h | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/libs/qmljs/qmljsplugindumper.cpp b/src/libs/qmljs/qmljsplugindumper.cpp index 7d13482272b..8ef89ebb431 100644 --- a/src/libs/qmljs/qmljsplugindumper.cpp +++ b/src/libs/qmljs/qmljsplugindumper.cpp @@ -458,19 +458,27 @@ QString PluginDumper::buildQmltypesPath(const QString &name) const void PluginDumper::loadDependencies(const QStringList &dependencies, QStringList &errors, QStringList &warnings, - QList &objects) const + QList &objects, + QSet *visited) const { + if (dependencies.isEmpty()) + return; + + QScopedPointer> visitedPtr(visited ? visited : new QSet()); + QStringList dependenciesPaths; QString path; for (const QString &name: dependencies) { path = buildQmltypesPath(name); if (!path.isNull()) dependenciesPaths << path; + visitedPtr->insert(name); } QStringList newDependencies; loadQmlTypeDescription(dependenciesPaths, errors, warnings, objects, 0, &newDependencies); + newDependencies = (newDependencies.toSet() - *visitedPtr).toList(); if (!newDependencies.isEmpty()) - loadDependencies(newDependencies, errors, warnings, objects); + loadDependencies(newDependencies, errors, warnings, objects, visitedPtr.take()); } void PluginDumper::loadQmltypesFile(const QStringList &qmltypesFilePaths, diff --git a/src/libs/qmljs/qmljsplugindumper.h b/src/libs/qmljs/qmljsplugindumper.h index 7d29e6ef3db..586275f021a 100644 --- a/src/libs/qmljs/qmljsplugindumper.h +++ b/src/libs/qmljs/qmljsplugindumper.h @@ -83,7 +83,8 @@ private: void loadDependencies(const QStringList &dependencies, QStringList &errors, QStringList &warnings, - QList &objects) const; + QList &objects, + QSet *visited=0) const; void loadQmltypesFile(const QStringList &qmltypesFilePaths, const QString &libraryPath, QmlJS::LibraryInfo libraryInfo);