QmlDesigner: Support directory style qmldir files

If no module entry is found, it is using the directory name.

Change-Id: I7aca4216e66aec55e3cb0b9b0304ef72b78edf32
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2025-03-20 18:57:11 +01:00
committed by Thomas Hartmann
parent 726b45ac94
commit 8dfe50a0a8
2 changed files with 35 additions and 0 deletions

View File

@@ -401,6 +401,14 @@ bool isNotExisting(ProjectStorageUpdater::FileState state)
return !isExisting(state); return !isExisting(state);
} }
Utils::PathString directoryName(std::string_view directoryPath)
{
using namespace std::views;
auto isNotSlash = std::bind_front(std::ranges::not_equal_to{}, '/');
auto directoryName = directoryPath | reverse | take_while(isNotSlash) | reverse;
return {directoryName.begin(), directoryName.end()};
}
} // namespace } // namespace
void ProjectStorageUpdater::updateDirectoryChanged(Utils::SmallStringView directoryPath, void ProjectStorageUpdater::updateDirectoryChanged(Utils::SmallStringView directoryPath,
@@ -428,6 +436,8 @@ void ProjectStorageUpdater::updateDirectoryChanged(Utils::SmallStringView direct
using Storage::ModuleKind; using Storage::ModuleKind;
Utils::PathString moduleName{parser.typeNamespace()}; Utils::PathString moduleName{parser.typeNamespace()};
if (moduleName.empty())
moduleName = directoryName(directoryPath);
ModuleId moduleId = m_projectStorage.moduleId(moduleName, ModuleKind::QmlLibrary); ModuleId moduleId = m_projectStorage.moduleId(moduleName, ModuleKind::QmlLibrary);
ModuleId cppModuleId = m_projectStorage.moduleId(moduleName, ModuleKind::CppLibrary); ModuleId cppModuleId = m_projectStorage.moduleId(moduleName, ModuleKind::CppLibrary);
ModuleId pathModuleId = m_projectStorage.moduleId(directoryPath, ModuleKind::PathLibrary); ModuleId pathModuleId = m_projectStorage.moduleId(directoryPath, ModuleKind::PathLibrary);

View File

@@ -1066,6 +1066,31 @@ TEST_F(ProjectStorageUpdater, synchronize_qml_documents)
updater.update({.qtDirectories = directories}); updater.update({.qtDirectories = directories});
} }
TEST_F(ProjectStorageUpdater, synchronize_qml_documents_with_missing_module_name)
{
QString qmldir{R"(FirstType 1.0 First.qml
FirstType 2.2 First2.qml
SecondType 2.2 Second.qml)"};
setContent(u"/path/qmldir", qmldir);
ModuleId directoryNameModuleId{storage.moduleId("path", ModuleKind::QmlLibrary)};
EXPECT_CALL(projectStorageMock,
synchronize(AllOf(Field(
&SynchronizationPackage::types,
Contains(AllOf(IsStorageType("First.qml",
ImportedType{"Object"},
TypeTraitsKind::Reference,
qmlDocumentSourceId1,
ChangeLevel::Full),
Field("Type::exportedTypes",
&Type::exportedTypes,
UnorderedElementsAre(
IsExportedType(directoryNameModuleId, "FirstType", 1, 0),
IsExportedType(pathModuleId, "First", -1, -1)))))))));
updater.update({.qtDirectories = directories});
}
TEST_F(ProjectStorageUpdater, synchronize_qml_documents_in_project) TEST_F(ProjectStorageUpdater, synchronize_qml_documents_in_project)
{ {
QString qmldir{R"(module Example QString qmldir{R"(module Example