diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h index 010c9a7e1cc..7d1598191d6 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h @@ -132,6 +132,7 @@ struct TypeTraits , isEnum{false} , isFileComponent{false} , usesCustomParser{false} + , isSingleton{false} , dummy{0U} , canBeContainer{FlagIs::False} , forceClip{FlagIs::False} @@ -204,7 +205,8 @@ struct TypeTraits unsigned int isEnum : 1; unsigned int isFileComponent : 1; unsigned int usesCustomParser : 1; - unsigned int dummy : 25; + unsigned int isSingleton : 1; + unsigned int dummy : 24; }; unsigned int type; diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/qmltypesparser.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/qmltypesparser.cpp index 0907c846cf6..052d38809d2 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/qmltypesparser.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/qmltypesparser.cpp @@ -118,13 +118,18 @@ Storage::TypeTraits createAccessTypeTraits(QQmlJSScope::AccessSemantics accessSe return Storage::TypeTraitsKind::None; } -Storage::TypeTraits createTypeTraits(QQmlJSScope::AccessSemantics accessSematics, bool hasCustomParser) +Storage::TypeTraits createTypeTraits(QQmlJSScope::AccessSemantics accessSematics, + bool hasCustomParser, + bool isSingleton) { auto typeTrait = createAccessTypeTraits(accessSematics); if (hasCustomParser) typeTrait.usesCustomParser = true; + if (isSingleton) + typeTrait.isSingleton = true; + return typeTrait; } @@ -451,7 +456,9 @@ void addType(Storage::Synchronization::Types &types, Utils::SmallStringView{typeName}, Storage::Synchronization::ImportedType{TypeNameString{component.baseTypeName()}}, Storage::Synchronization::ImportedType{TypeNameString{component.extensionTypeName()}}, - createTypeTraits(component.accessSemantics(), component.hasCustomParser()), + createTypeTraits(component.accessSemantics(), + component.hasCustomParser(), + component.isSingleton()), sourceId, createExports(exports, typeName, storage, cppModuleId), createProperties(component.ownProperties(), enumerationTypes, componentNameWithoutNamespace), diff --git a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp index c33bcbf068f..9e359a76d0d 100644 --- a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp @@ -63,13 +63,20 @@ MATCHER_P(HasFlag, flag, std::string(negation ? "hasn't " : "has ") + PrintToStr MATCHER_P(UsesCustomParser, value, - std::string(negation ? "don't used custom parser " : "uses custom parser")) + std::string(negation ? "don't used custom parser " : "uses custom parser ")) { const Storage::TypeTraits &traits = arg; return traits.usesCustomParser == value; } +MATCHER_P(IsSingleton, value, std::string(negation ? "isn't singleton " : "is singleton ")) +{ + const Storage::TypeTraits &traits = arg; + + return traits.isSingleton == value; +} + template auto IsTypeTrait(const Matcher &matcher) { @@ -878,4 +885,39 @@ TEST_F(QmlTypesParser, skip_template_item) qmltypesFileSourceId))); } +TEST_F(QmlTypesParser, is_singleton) +{ + QString source{R"(import QtQuick.tooling 1.2 + Module{ + Component { name: "QObject" + isSingleton: true}})"}; + + parser.parse(source, imports, types, directoryInfo); + + ASSERT_THAT(types, ElementsAre(IsTypeTrait(IsSingleton(true)))); +} + +TEST_F(QmlTypesParser, is_not_singleton) +{ + QString source{R"(import QtQuick.tooling 1.2 + Module{ + Component { name: "QObject" + isSingleton: false}})"}; + + parser.parse(source, imports, types, directoryInfo); + + ASSERT_THAT(types, ElementsAre(IsTypeTrait(IsSingleton(false)))); +} + +TEST_F(QmlTypesParser, is_by_default_not_singleton) +{ + QString source{R"(import QtQuick.tooling 1.2 + Module{ + Component { name: "QObject"}})"}; + + parser.parse(source, imports, types, directoryInfo); + + ASSERT_THAT(types, ElementsAre(IsTypeTrait(IsSingleton(false)))); +} + } // namespace