From 8ab496827870bedd1861a62a0301e0cbb67dbd54 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 6 Jul 2023 13:16:34 +0200 Subject: [PATCH] QmlDesigner: Introduce origin flags metaInfo.isProjectComponent() is signaling if a file component is directly part of the project. metaInfo.isInProjectModule() otherwise shows if a type is inside of the project as a qmldir module. Both cannot be true. If a type is not part of either it is a system type. Task-number: QDS-10251 Change-Id: Iae2270827a500ad6393e3751b3af276f9b030679 Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Tim Jenssen --- .../designercore/include/nodemetainfo.h | 2 + .../designercore/metainfo/nodemetainfo.cpp | 18 +++++ .../projectstorage/projectstorageinfotypes.h | 4 +- .../unittests/metainfo/nodemetainfo-test.cpp | 66 +++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 55ce166d904..7ccd1028bfb 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -53,6 +53,8 @@ public: TypeId id() const { return m_typeId; } bool isFileComponent() const; + bool isProjectComponent() const; + bool isInProjectModule() const; bool hasProperty(::Utils::SmallStringView propertyName) const; PropertyMetaInfos properties() const; PropertyMetaInfos localProperties() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 81180affdd6..3836dc8d16f 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1426,6 +1426,24 @@ bool NodeMetaInfo::isFileComponent() const return isValid() && m_privateData->isFileComponent(); } +bool NodeMetaInfo::isProjectComponent() const +{ + if constexpr (useProjectStorage()) { + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsProjectComponent); + } + + return false; +} + +bool NodeMetaInfo::isInProjectModule() const +{ + if constexpr (useProjectStorage()) { + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsInProjectModule); + } + + return false; +} + bool NodeMetaInfo::hasProperty(Utils::SmallStringView propertyName) const { if constexpr (useProjectStorage()) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h index b61a6ec331a..71bbb745200 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h @@ -46,7 +46,9 @@ enum class TypeTraits : int { Value, Sequence, IsEnum = 1 << 8, - IsFileComponent = 1 << 9 + IsFileComponent = 1 << 9, + IsProjectComponent = 1 << 10, + IsInProjectModule = 1 << 11 }; constexpr TypeTraits operator|(TypeTraits first, TypeTraits second) diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index f92b18fc4de..78aed432f7a 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -155,6 +155,72 @@ TEST_F(NodeMetaInfo, component_is_file_component) ASSERT_TRUE(isFileComponent); } +TEST_F(NodeMetaInfo, is_project_component) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", TypeTraits::IsProjectComponent); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_TRUE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, is_not_project_component) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_FALSE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, invalid_is_not_project_component) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_FALSE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, is_in_project_module) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", TypeTraits::IsInProjectModule); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_TRUE(isInProjectModule); +} + +TEST_F(NodeMetaInfo, is_not_in_project_module) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_FALSE(isInProjectModule); +} + +TEST_F(NodeMetaInfo, invalid_is_not_in_project_module) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_FALSE(isInProjectModule); +} + TEST_F(NodeMetaInfo, has_property) { auto node = model.createModelNode("Item");