QmlDesigner: Filter colliding imports to dependencies

Imports from qmldir are added as dependencies too. In the case as a import
is the same as a dependency it has do be filtered out.

Change-Id: Ibecc505ccf7c001d3267665ee4fe2e374bea8a7d
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2022-02-16 17:56:22 +01:00
parent 3ece40c31e
commit f54867e844
2 changed files with 42 additions and 2 deletions

View File

@@ -64,6 +64,18 @@ QList<QmlDirParser::Import> filterMultipleEntries(QList<QmlDirParser::Import> im
return imports; return imports;
} }
QList<QmlDirParser::Import> joinImports(const QList<QmlDirParser::Import> &firstImports,
const QList<QmlDirParser::Import> &secondImports)
{
QList<QmlDirParser::Import> imports;
imports.reserve(firstImports.size() + secondImports.size());
imports.append(firstImports);
imports.append(secondImports);
imports = filterMultipleEntries(std::move(imports));
return imports;
}
ComponentReferences createComponentReferences(const QMultiHash<QString, QmlDirParser::Component> &components) ComponentReferences createComponentReferences(const QMultiHash<QString, QmlDirParser::Component> &components)
{ {
ComponentReferences componentReferences; ComponentReferences componentReferences;
@@ -291,8 +303,10 @@ void ProjectStorageUpdater::parseTypeInfos(const QStringList &typeInfos,
{directory, "/", Utils::SmallString{typeInfo}}); {directory, "/", Utils::SmallString{typeInfo}});
SourceId sourceId = m_pathCache.sourceId(SourcePathView{qmltypesPath}); SourceId sourceId = m_pathCache.sourceId(SourcePathView{qmltypesPath});
addDependencies(package.moduleDependencies, sourceId, qmldirDependencies, m_projectStorage); addDependencies(package.moduleDependencies,
addDependencies(package.moduleDependencies, sourceId, qmldirImports, m_projectStorage); sourceId,
joinImports(qmldirDependencies, qmldirImports),
m_projectStorage);
package.updatedModuleDependencySourceIds.push_back(sourceId); package.updatedModuleDependencySourceIds.push_back(sourceId);
auto projectData = package.projectDatas.emplace_back(qmldirSourceId, auto projectData = package.projectDatas.emplace_back(qmldirSourceId,

View File

@@ -1102,6 +1102,32 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithDoubleEntries)
updater.update(qmlDirs, {}); updater.update(qmlDirs, {});
} }
TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithCollidingImports)
{
QString qmldir{R"(module Example
depends Qml
depends QML
import Qml
typeinfo example.qmltypes
typeinfo types/example2.qmltypes
)"};
ON_CALL(fileSystemMock, contentAsQString(Eq(QString("/path/qmldir")))).WillByDefault(Return(qmldir));
EXPECT_CALL(
projectStorageMock,
synchronize(AllOf(
Field(&SynchronizationPackage::moduleDependencies,
UnorderedElementsAre(
Import{qmlCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId},
Import{builtinCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId},
Import{qmlCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId},
Import{builtinCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId})),
Field(&SynchronizationPackage::updatedModuleDependencySourceIds,
UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId)))));
updater.update(qmlDirs, {});
}
TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoDependencies) TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoDependencies)
{ {
QString qmldir{R"(module Example QString qmldir{R"(module Example