summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2023-04-21 15:47:50 +0200
committerMarco Bubke <marco.bubke@qt.io>2023-04-26 13:23:47 +0000
commit0d4e8c33dd454b18b0fbe56a32f4dfe8e346a87a (patch)
treee176b5a295c88e689715f582dd0557a910ab18d0
parent5223a909772d92db803dcc54af99f59653bb2979 (diff)
downloadqt-creator-0d4e8c33dd454b18b0fbe56a32f4dfe8e346a87a.tar.gz
QmlDesigner: Remove duplicates
Change-Id: I5b2d8433c0aca286ec530f237750ba660c409a48 Reviewed-by: Aleksei German <aleksei.german@qt.io> Reviewed-by: Marco Bubke <marco.bubke@qt.io> (cherry picked from commit eafe43399d29502ecd06be6976a4f2509b20c9ee) Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-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