diff options
-rw-r--r-- | src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp | 9 | ||||
-rw-r--r-- | tests/unit/unittest/modulescanner-test.cpp | 25 |
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 |