From bdc6df0c41e8251d5fcd19a22463189d11ee4768 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 10 Feb 2022 17:56:35 +0100 Subject: QmlDesigner: Improve enumeration support in the qml document parser An enumeration like a qualified type contains a '.' too. So this has to be differentiated. Task-number: QDS-6191 Change-Id: If094abaaa29c5a0079a3c3855534d9b53b2bc94d Reviewed-by: Thomas Hartmann --- .../projectstorage/qmldocumentparser.cpp | 5 ++-- tests/unit/unittest/qmldocumentparser-test.cpp | 32 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp index b553c7a154..b0d9496861 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp @@ -120,15 +120,16 @@ void addImports(Storage::Imports &imports, Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName, const QualifiedImports &qualifiedImports) { - if (!rawtypeName.contains('.')) { + if (!rawtypeName.contains('.')) return Storage::ImportedType{Utils::SmallString{rawtypeName}}; - } auto foundDot = std::find(rawtypeName.begin(), rawtypeName.end(), '.'); QStringView alias(rawtypeName.begin(), foundDot); auto foundImport = qualifiedImports.find(alias.toString()); + if (foundImport == qualifiedImports.end()) + return Storage::ImportedType{Utils::SmallString{rawtypeName}}; QStringView typeName(std::next(foundDot), rawtypeName.end()); diff --git a/tests/unit/unittest/qmldocumentparser-test.cpp b/tests/unit/unittest/qmldocumentparser-test.cpp index 68a7395e44..e9fa41100b 100644 --- a/tests/unit/unittest/qmldocumentparser-test.cpp +++ b/tests/unit/unittest/qmldocumentparser-test.cpp @@ -187,6 +187,38 @@ TEST_F(QmlDocumentParser, QualifiedProperties) Storage::PropertyDeclarationTraits::None))); } +TEST_F(QmlDocumentParser, EnumerationInProperties) +{ + auto type = parser.parse(R"(import Example 2.1 as Example + Item{ property Enumeration.Foo foo})", + imports, + qmlFileSourceId); + + ASSERT_THAT(type.propertyDeclarations, + UnorderedElementsAre(IsPropertyDeclaration("foo", + Storage::ImportedType("Enumeration.Foo"), + Storage::PropertyDeclarationTraits::None))); +} + +TEST_F(QmlDocumentParser, QualifiedEnumerationInProperties) +{ + auto exampleModuleId = storage.moduleId("Example"); + + auto type = parser.parse(R"(import Example 2.1 as Example + Item{ property Example.Enumeration.Foo foo})", + imports, + qmlFileSourceId); + + ASSERT_THAT(type.propertyDeclarations, + UnorderedElementsAre(IsPropertyDeclaration( + "foo", + Storage::QualifiedImportedType("Enumeration.Foo", + Storage::Import{exampleModuleId, + Storage::Version{2, 1}, + qmlFileSourceId}), + Storage::PropertyDeclarationTraits::None))); +} + TEST_F(QmlDocumentParser, Imports) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); -- cgit v1.2.1