diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorage.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorage.cpp index 326f374aeea..79c3749fe6e 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorage.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorage.cpp @@ -2433,7 +2433,7 @@ void ProjectStorage::synchronizeTypeAnnotations(Storage::Synchronization::TypeAn auto compareKey = [](auto &&first, auto &&second) { return first.typeId <=> second.typeId; }; - std::ranges::sort(typeAnnotations, std::ranges::less{}, &TypeAnnotation::typeId); + std::ranges::sort(typeAnnotations, {}, &TypeAnnotation::typeId); auto range = s->selectTypeAnnotationsForSourceIdsStatement.range( toIntegers(updatedTypeAnnotationSourceIds)); @@ -2549,7 +2549,7 @@ void ProjectStorage::synchronizeTypes(Storage::Synchronization::Types &types, } } - std::ranges::sort(types, std::ranges::less{}, &Type::typeId); + std::ranges::sort(types, {}, &Type::typeId); unique(exportedSourceIds); @@ -2649,7 +2649,7 @@ void ProjectStorage::synchronizeFileStatuses(FileStatuses &fileStatuses, auto compareKey = [](auto &&first, auto &&second) { return first.sourceId <=> second.sourceId; }; - std::ranges::sort(fileStatuses, std::ranges::less{}, &FileStatus::sourceId); + std::ranges::sort(fileStatuses, {}, &FileStatus::sourceId); auto range = s->selectFileStatusesForSourceIdsStatement.range( toIntegers(updatedSourceIds)); @@ -4012,7 +4012,7 @@ void ProjectStorage::synchronizePropertyEditorPaths( SourceContextIds updatedPropertyEditorQmlPathsSourceContextIds) { using Storage::Synchronization::PropertyEditorQmlPath; - std::ranges::sort(paths, std::ranges::less{}, &PropertyEditorQmlPath::typeId); + std::ranges::sort(paths, {}, &PropertyEditorQmlPath::typeId); auto range = s->selectPropertyEditorPathsForForSourceIdsStatement.range( toIntegers(updatedPropertyEditorQmlPathsSourceContextIds)); diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageexceptions.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageexceptions.cpp index 7a0cb555b0a..7198e581602 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageexceptions.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageexceptions.cpp @@ -112,7 +112,7 @@ CannotParseQmlDocumentFile::CannotParseQmlDocumentFile(const Sqlite::source_loca const char *CannotParseQmlDocumentFile::what() const noexcept { - return "Cannot parse qml types file!"; + return "Cannot parse qml document file!"; } DirectoryInfoHasInvalidProjectSourceId::DirectoryInfoHasInvalidProjectSourceId( diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp index 9e40093916c..b3b64f77770 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp @@ -22,6 +22,8 @@ #include #include +#include + #include #include @@ -65,35 +67,32 @@ QStringList filterMultipleEntries(QStringList qmlTypes) return qmlTypes; } -QList filterMultipleEntries(QList imports) +QList filterMultipleEntries(QList imports) { - std::stable_sort(imports.begin(), imports.end(), [](auto &&first, auto &&second) { - return first.module < second.module; - }); - imports.erase(std::unique(imports.begin(), - imports.end(), - [](auto &&first, auto &&second) { - return first.module == second.module; - }), - imports.end()); + std::ranges::stable_sort(imports, {}, &QQmlDirParser::Import::module); + auto removedRange = std::ranges::unique(imports, {}, &QQmlDirParser::Import::module); + imports.erase(removedRange.begin(), removedRange.end()); return imports; } -QList joinImports(const QList &firstImports, - const QList &secondImports) +std::vector toImportNames(const QList &imports) { - QList imports; + return Utils::transform>(imports, &QQmlDirParser::Import::module); +} + +std::vector joinImports(const std::vector &firstImports, + const std::vector &secondImports) +{ + std::vector imports; imports.reserve(firstImports.size() + secondImports.size()); - imports.append(firstImports); - imports.append(secondImports); - imports = filterMultipleEntries(std::move(imports)); + std::ranges::set_union(firstImports, secondImports, std::back_inserter(imports)); return imports; } ProjectStorageUpdater::Components createComponents( - const QMultiHash &qmlDirParserComponents, + const QMultiHash &qmlDirParserComponents, ModuleId moduleId, ModuleId pathModuleId, FileSystemInterface &fileSystem, @@ -112,14 +111,14 @@ ProjectStorageUpdater::Components createComponents( ProjectStorageUpdater::Component{fileName, typeName, pathModuleId, -1, -1}); } - for (const QmlDirParser::Component &qmlDirParserComponent : qmlDirParserComponents) { + for (const QQmlDirParser::Component &qmlDirParserComponent : qmlDirParserComponents) { if (qmlDirParserComponent.fileName.contains('/')) continue; - components.push_back(ProjectStorageUpdater::Component{qmlDirParserComponent.fileName, - qmlDirParserComponent.typeName, - moduleId, - qmlDirParserComponent.majorVersion, - qmlDirParserComponent.minorVersion}); + components.emplace_back(qmlDirParserComponent.fileName, + qmlDirParserComponent.typeName, + moduleId, + qmlDirParserComponent.version.majorVersion(), + qmlDirParserComponent.version.minorVersion()); } return components; @@ -157,28 +156,33 @@ void addSourceIds(SourceIds &sourceIds, } } -Storage::Version convertVersion(LanguageUtils::ComponentVersion version) +Storage::Version convertVersion(QTypeRevision version) { - return Storage::Version{version.majorVersion(), version.minorVersion()}; + return Storage::Version{version.hasMajorVersion() ? version.majorVersion() : -1, + version.hasMinorVersion() ? version.minorVersion() : -1}; } -Storage::Synchronization::IsAutoVersion convertToIsAutoVersion(QmlDirParser::Import::Flags flags) +Storage::Synchronization::IsAutoVersion convertToIsAutoVersion(QQmlDirParser::Import::Flags flags, + QTypeRevision version) { - if (flags & QmlDirParser::Import::Flag::Auto) + if (flags & QQmlDirParser::Import::Flag::Auto) return Storage::Synchronization::IsAutoVersion::Yes; + + if (!version.isValid()) + return Storage::Synchronization::IsAutoVersion::Yes; + return Storage::Synchronization::IsAutoVersion::No; } void addDependencies(Storage::Imports &dependencies, SourceId sourceId, - const QList &qmldirDependencies, + const std::vector &qmldirDependencies, ProjectStorageInterface &projectStorage, TracerLiteral message, Tracer &tracer) { - for (const QmlDirParser::Import &qmldirDependency : qmldirDependencies) { - ModuleId moduleId = projectStorage.moduleId(Utils::PathString{qmldirDependency.module}, - Storage::ModuleKind::CppLibrary); + for (std::string_view qmldirDependency : qmldirDependencies) { + ModuleId moduleId = projectStorage.moduleId(qmldirDependency, Storage::ModuleKind::CppLibrary); auto &import = dependencies.emplace_back(moduleId, Storage::Version{}, sourceId); tracer.tick(message, keyValue("import", import)); } @@ -206,16 +210,17 @@ void addModuleExportedImport(Storage::Synchronization::ModuleExportedImports &im imports.emplace_back(moduleId, exportedModuleId, version, isAutoVersion); } -bool isOptionalImport(QmlDirParser::Import::Flags flags) +bool isOptionalImport(QQmlDirParser::Import::Flags flags) { - return flags & QmlDirParser::Import::Optional && !(flags & QmlDirParser::Import::OptionalDefault); + return flags & QQmlDirParser::Import::Optional + && !(flags & QQmlDirParser::Import::OptionalDefault); } void addModuleExportedImports(Storage::Synchronization::ModuleExportedImports &imports, ModuleId moduleId, ModuleId cppModuleId, std::string_view moduleName, - const QList &qmldirImports, + const QList &qmldirImports, ProjectStorageInterface &projectStorage) { NanotraceHR::Tracer tracer{"add module exported imports", @@ -223,7 +228,7 @@ void addModuleExportedImports(Storage::Synchronization::ModuleExportedImports &i keyValue("cpp module id", cppModuleId), keyValue("module id", moduleId)}; - for (const QmlDirParser::Import &qmldirImport : qmldirImports) { + for (const QQmlDirParser::Import &qmldirImport : qmldirImports) { if (isOptionalImport(qmldirImport.flags)) continue; @@ -235,7 +240,7 @@ void addModuleExportedImports(Storage::Synchronization::ModuleExportedImports &i moduleId, exportedModuleId, convertVersion(qmldirImport.version), - convertToIsAutoVersion(qmldirImport.flags), + convertToIsAutoVersion(qmldirImport.flags, qmldirImport.version), moduleName, ModuleKind::QmlLibrary, exportedModuleName); @@ -412,7 +417,7 @@ void ProjectStorageUpdater::updateDirectoryChanged(Utils::SmallStringView direct IsInsideProject isInsideProject, Tracer &tracer) { - QmlDirParser parser; + QQmlDirParser parser; if (isExisting(qmldirState)) parser.parse(m_fileSystem.contentAsQString(QString{qmldirSourcePath})); @@ -447,8 +452,8 @@ void ProjectStorageUpdater::updateDirectoryChanged(Utils::SmallStringView direct if (!qmlTypes.isEmpty()) { parseTypeInfos(qmlTypes, - filterMultipleEntries(parser.dependencies()), - imports, + toImportNames(filterMultipleEntries(parser.dependencies())), + toImportNames(imports), directoryId, directoryPathAsQString, cppModuleId, @@ -1118,8 +1123,8 @@ void ProjectStorageUpdater::pathsWithIdsChanged(const std::vector &chan void ProjectStorageUpdater::pathsChanged(const SourceIds &) {} void ProjectStorageUpdater::parseTypeInfos(const QStringList &typeInfos, - const QList &qmldirDependencies, - const QList &qmldirImports, + const std::vector &qmldirDependencies, + const std::vector &qmldirImports, SourceContextId directoryId, const QString &directoryPath, ModuleId moduleId, @@ -1217,9 +1222,9 @@ auto ProjectStorageUpdater::parseTypeInfo(const Storage::Synchronization::Direct notUpdatedSourceIds.sourceIds.push_back(directoryInfo.sourceId); break; } + case FileState::Removed: case FileState::NotExists: case FileState::NotExistsUnchanged: - case FileState::Removed: throw CannotParseQmlTypesFile{}; } diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.h b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.h index 093090c34ef..8d22bddd035 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.h +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.h @@ -16,8 +16,6 @@ #include -#include - #include #include @@ -211,8 +209,8 @@ private: SourceContextId directoryId, long long pathOffset); void parseTypeInfos(const QStringList &typeInfos, - const QList &qmldirDependencies, - const QList &qmldirImports, + const std::vector &qmldirDependencies, + const std::vector &qmldirImports, SourceContextId directoryId, const QString &directoryPath, ModuleId moduleId, diff --git a/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp index 17fd86b033b..8a306e45349 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp @@ -2068,7 +2068,7 @@ TEST_F(ProjectStorageUpdater, synchronize_qmldir_imports) ModuleExportedImport{exampleModuleId, quickModuleId, Storage::Version{}, - IsAutoVersion::No}, + IsAutoVersion::Yes}, ModuleExportedImport{exampleCppNativeModuleId, quickCppNativeModuleId, Storage::Version{}, @@ -2130,7 +2130,7 @@ TEST_F(ProjectStorageUpdater, synchronize_qmldir_imports_with_double_entries) ModuleExportedImport{exampleModuleId, quickModuleId, Storage::Version{}, - IsAutoVersion::No}, + IsAutoVersion::Yes}, ModuleExportedImport{exampleCppNativeModuleId, quickCppNativeModuleId, Storage::Version{}, @@ -2174,7 +2174,7 @@ TEST_F(ProjectStorageUpdater, synchronize_qmldir_default_imports) ModuleExportedImport{exampleModuleId, quickModuleId, Storage::Version{}, - IsAutoVersion::No}, + IsAutoVersion::Yes}, ModuleExportedImport{exampleCppNativeModuleId, quickCppNativeModuleId, Storage::Version{},