From e91fe4dea72f60bc5358c843275b30d9db772e7b Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 9 Sep 2024 18:41:15 +0200 Subject: [PATCH] QmlDesigner: Add singleton support to QmlDocumentParser Task-number: QDS-13602 Change-Id: I0af54c5949b20e840c0b07f13ec213db8dc40d7e Reviewed-by: Tim Jenssen --- .../projectstorage/qmldocumentparser.cpp | 17 ++++++++++++--- .../projectstorage/qmldocumentparser-test.cpp | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/qmldocumentparser.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/qmldocumentparser.cpp index d72f49b33a4..b571cebac3d 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/qmldocumentparser.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/qmldocumentparser.cpp @@ -30,6 +30,8 @@ using Tracer = ProjectStorageTracing::Category::TracerType; namespace QmlDom = QQmlJS::Dom; namespace Synchronization = Storage::Synchronization; +using namespace Qt::StringLiterals; + namespace { using QualifiedImports = std::map; @@ -297,12 +299,21 @@ void addEnumeraton(Storage::Synchronization::Type &type, const QmlDom::Component } } -Storage::TypeTraits createTypeTraits() +bool isSingleton(const QmlDom::QmlFile *qmlFile) +{ + const auto &pragmas = qmlFile->pragmas(); + + return std::ranges::find(pragmas, "Singleton"_L1, &QQmlJS::Dom::Pragma::name) != pragmas.end(); +} + +Storage::TypeTraits createTypeTraits(const QmlDom::QmlFile *qmlFile) { Storage::TypeTraits traits = Storage::TypeTraitsKind::Reference; traits.isFileComponent = true; + traits.isSingleton = isSingleton(qmlFile); + return traits; } @@ -353,7 +364,7 @@ Storage::Synchronization::Type QmlDocumentParser::parse(const QString &sourceCon QmlDom::DomItem file = items.field(QmlDom::Fields::currentItem); const QmlDom::QmlFile *qmlFile = file.as(); const auto &components = qmlFile->components(); - + qmlFile->pragmas(); if (components.empty()) return type; @@ -372,7 +383,7 @@ Storage::Synchronization::Type QmlDocumentParser::parse(const QString &sourceCon directoryPath, m_storage); - type.traits = createTypeTraits(); + type.traits = createTypeTraits(qmlFile); type.prototype = createImportedTypeName(qmlObject.name(), qualifiedImports); type.defaultPropertyName = qmlObject.localDefaultPropertyName(); addImports(imports, qmlFile->imports(), sourceId, directoryPath, m_storage); diff --git a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp index ee5ba836c2a..0db9dbed702 100644 --- a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp @@ -543,4 +543,25 @@ TEST_F(QmlDocumentParser, has_is_reference_trait) ASSERT_THAT(type.traits.kind, QmlDesigner::Storage::TypeTraitsKind::Reference); } +TEST_F(QmlDocumentParser, is_singleton) +{ + QString component = R"(pragma Singleton + Item{ + })"; + + auto type = parser.parse(component, imports, qmlFileSourceId, directoryPath); + + ASSERT_TRUE(type.traits.isSingleton); +} + +TEST_F(QmlDocumentParser, is_not_singleton) +{ + QString component = R"(Item{ + })"; + + auto type = parser.parse(component, imports, qmlFileSourceId, directoryPath); + + ASSERT_FALSE(type.traits.isSingleton); +} + } // namespace