summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp9
-rw-r--r--tests/unit/unittest/modulescanner-test.cpp25
2 files changed, 28 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp
index 4a6adfa10d..2210f0732b 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp
@@ -51,8 +51,6 @@ void ModuleScanner::scan([[maybe_unused]] std::string_view modulePath)
#ifdef QDS_HAS_QMLPRIVATE
QDirIterator dirIterator{QString::fromUtf8(modulePath), QDir::Dirs, QDirIterator::Subdirectories};
- QMap<QString, bool> moduleNames;
-
while (dirIterator.hasNext()) {
auto directoryPath = dirIterator.next();
QString qmldirPath = directoryPath + "/qmldir";
@@ -72,14 +70,13 @@ void ModuleScanner::scan([[maybe_unused]] std::string_view modulePath)
if (moduleName.isEmpty() || m_skip(moduleName))
continue;
- if (moduleNames.contains(moduleName))
- continue;
-
- moduleNames.insert(moduleName, true);
m_modules.push_back(
Import::createLibraryImport(moduleName, createVersion(parser.components())));
}
}
+
+ std::sort(m_modules.begin(), m_modules.end());
+ m_modules.erase(std::unique(m_modules.begin(), m_modules.end()), m_modules.end());
#endif
}
diff --git a/tests/unit/unittest/modulescanner-test.cpp b/tests/unit/unittest/modulescanner-test.cpp
index b98fc3cdb3..92d7959916 100644
--- a/tests/unit/unittest/modulescanner-test.cpp
+++ b/tests/unit/unittest/modulescanner-test.cpp
@@ -21,6 +21,15 @@ auto VersionProperty(const Matcher &matcher)
return Property(&QmlDesigner::Import::version, matcher);
}
+MATCHER(HasDuplicates, std::string(negation ? "hasn't duplicates" : "has dublicates"))
+{
+ auto values = arg;
+ std::sort(values.begin(), values.begin());
+ auto found = std::adjacent_find(values.begin(), values.end());
+
+ return found != values.end();
+}
+
class ModuleScanner : public testing::Test
{
protected:
@@ -70,4 +79,20 @@ TEST_F(ModuleScanner, Version)
ASSERT_THAT(scanner.modules(), ElementsAre(AllOf(UrlProperty("Example"), VersionProperty("1.3"))));
}
+TEST_F(ModuleScanner, Duplicates)
+{
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ ASSERT_THAT(scanner.modules(), Not(HasDuplicates()));
+}
+
+TEST_F(ModuleScanner, DontAddModulesAgain)
+{
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ ASSERT_THAT(scanner.modules(), Not(HasDuplicates()));
+}
+
} // namespace