From 3d5ceb795d89f5cc46291d922c4c78099786aa68 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 12 Jul 2023 16:43:38 +0200 Subject: [PATCH] QmlDesigner: NodeMetaInfo can now get exported type names You can get all exported names. That can the C++ names too for C++ types. If you only want the types name which are imported in a document you can provide the source id for the document and get only that. If there are different version exports you get them too. Task-number: QDS-10274 Change-Id: Iefc0b68ebfd65998cf0481961f8c7643cdf9e5b9 Reviewed-by: Vikas Pachdha --- .../qmldesigner/designercore/include/model.h | 2 + .../designercore/include/nodemetainfo.h | 3 + .../designercore/metainfo/nodemetainfo.cpp | 22 ++++++ .../qmldesigner/designercore/model/model.cpp | 5 ++ .../projectstorage/projectstorageinfotypes.h | 16 ++-- .../unittests/metainfo/nodemetainfo-test.cpp | 73 ++++++++++++++++++- 6 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 7cceb35c074..d65d075446c 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -112,6 +113,7 @@ public: } QUrl fileUrl() const; + SourceId fileUrlSourceId() const; void setFileUrl(const QUrl &url); const MetaInfo metaInfo() const; diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 153ba6ae84d..6bafb04794c 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -76,6 +76,9 @@ public: int majorVersion() const; int minorVersion() const; + Storage::Info::ExportedTypeNames allExportedTypeNames() const; + Storage::Info::ExportedTypeNames exportedTypeNamesForSourceId(SourceId sourceId) const; + SourceId sourceId() const; QString componentFileName() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 24420e968ce..1c104cce4f7 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1688,6 +1688,28 @@ int NodeMetaInfo::minorVersion() const return -1; } +Storage::Info::ExportedTypeNames NodeMetaInfo::allExportedTypeNames() const +{ + if constexpr (useProjectStorage()) { + if (isValid()) { + return m_projectStorage->exportedTypeNames(m_typeId); + } + } + + return {}; +} + +Storage::Info::ExportedTypeNames NodeMetaInfo::exportedTypeNamesForSourceId(SourceId sourceId) const +{ + if constexpr (useProjectStorage()) { + if (isValid()) { + return m_projectStorage->exportedTypeNames(m_typeId, sourceId); + } + } + + return {}; +} + SourceId NodeMetaInfo::sourceId() const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 80375f0ab7c..188536c778e 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1970,6 +1970,11 @@ QUrl Model::fileUrl() const return d->fileUrl(); } +SourceId Model::fileUrlSourceId() const +{ + return d->m_sourceId; +} + /*! \brief Sets the URL against which relative URLs within the model should be resolved. \param url the base URL, i.e. the qml file path. diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h index 02328f5e616..1f16e762713 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h @@ -133,20 +133,20 @@ namespace QmlDesigner::Storage::Info { class ExportedTypeName { public: - explicit ExportedTypeName() = default; + ExportedTypeName() = default; - explicit ExportedTypeName(ModuleId moduleId, - ::Utils::SmallStringView name, - Storage::Version version = Storage::Version{}) + ExportedTypeName(ModuleId moduleId, + ::Utils::SmallStringView name, + Storage::Version version = Storage::Version{}) : name{name} , version{version} , moduleId{moduleId} {} - explicit ExportedTypeName(ModuleId moduleId, - ::Utils::SmallStringView name, - int majorVersion, - int minorVersion) + ExportedTypeName(ModuleId moduleId, + ::Utils::SmallStringView name, + int majorVersion, + int minorVersion) : name{name} , version{majorVersion, minorVersion} , moduleId{moduleId} diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index caae3ecc5f3..2f287e32d6e 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -3,8 +3,9 @@ #include "../utils/googletest.h" -#include "../mocks/projectstoragemock.h" -#include "../mocks/sourcepathcachemock.h" +#include +#include +#include #include #include @@ -2231,4 +2232,72 @@ TEST_F(NodeMetaInfo, default_is_not_enumeration) ASSERT_THAT(isType, IsFalse()); } + +TEST_F(NodeMetaInfo, all_external_type_names) +{ + QmlDesigner::Storage::Info::ExportedTypeNames names{{qmlModuleId, "Object", 2, -1}, + {qmlModuleId, "Obj", 2, 1}}; + auto metaInfo = createMetaInfo("QML", "Foo"); + ON_CALL(projectStorageMock, exportedTypeNames(metaInfo.id())).WillByDefault(Return(names)); + + auto exportedTypeNames = metaInfo.allExportedTypeNames(); + + ASSERT_THAT(exportedTypeNames, + UnorderedElementsAre(IsInfoExportTypeNames(qmlModuleId, "Object", 2, -1), + IsInfoExportTypeNames(qmlModuleId, "Obj", 2, 1))); +} + +TEST_F(NodeMetaInfo, default_has_no_external_type_names) +{ + QmlDesigner::Storage::Info::ExportedTypeNames names{{qmlModuleId, "Object", 2, -1}, + {qmlModuleId, "Obj", 2, 1}}; + QmlDesigner::NodeMetaInfo metaInfo; + ON_CALL(projectStorageMock, exportedTypeNames(_)).WillByDefault(Return(names)); + + auto exportedTypeNames = metaInfo.allExportedTypeNames(); + + ASSERT_THAT(exportedTypeNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, external_type_names_for_source_id) +{ + QmlDesigner::Storage::Info::ExportedTypeNames names{{qmlModuleId, "Object", 2, -1}, + {qmlModuleId, "Obj", 2, 1}}; + auto metaInfo = createMetaInfo("QML", "Foo"); + ON_CALL(projectStorageMock, exportedTypeNames(metaInfo.id(), model.fileUrlSourceId())) + .WillByDefault(Return(names)); + + auto exportedTypeNames = metaInfo.exportedTypeNamesForSourceId(model.fileUrlSourceId()); + + ASSERT_THAT(exportedTypeNames, + UnorderedElementsAre(IsInfoExportTypeNames(qmlModuleId, "Object", 2, -1), + IsInfoExportTypeNames(qmlModuleId, "Obj", 2, 1))); +} + +TEST_F(NodeMetaInfo, default_has_no_external_type_names_for_source_id) +{ + QmlDesigner::Storage::Info::ExportedTypeNames names{{qmlModuleId, "Object", 2, -1}, + {qmlModuleId, "Obj", 2, 1}}; + QmlDesigner::NodeMetaInfo metaInfo; + ON_CALL(projectStorageMock, exportedTypeNames(metaInfo.id(), model.fileUrlSourceId())) + .WillByDefault(Return(names)); + + auto exportedTypeNames = metaInfo.exportedTypeNamesForSourceId(model.fileUrlSourceId()); + + ASSERT_THAT(exportedTypeNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, invalid_source_id_has_no_external_type_names_for_source_id) +{ + QmlDesigner::Storage::Info::ExportedTypeNames names{{qmlModuleId, "Object", 2, -1}, + {qmlModuleId, "Obj", 2, 1}}; + auto metaInfo = createMetaInfo("QML", "Foo"); + ON_CALL(projectStorageMock, exportedTypeNames(metaInfo.id(), model.fileUrlSourceId())) + .WillByDefault(Return(names)); + QmlDesigner::SourceId sourceId; + + auto exportedTypeNames = metaInfo.exportedTypeNamesForSourceId(sourceId); + + ASSERT_THAT(exportedTypeNames, IsEmpty()); +} } // namespace