diff options
author | Marco Bubke <marco.bubke@qt.io> | 2022-02-10 17:48:03 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2022-02-15 17:18:45 +0000 |
commit | 6531a68f554688d70c2ebb2b14d9f9effdc62392 (patch) | |
tree | cf1da081161b2e13a016ab8c03fd3c215cbeb75c | |
parent | 6e9cb8ad544c1468d7f8bdea1a8562a77749b767 (diff) |
QmlDesigner: Support qualified property types in the qml document parser
Task-number: QDS-6191
Change-Id: Ia5672c0b15c70a24177b9db3e4060ade43b83769
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp | 25 | ||||
-rw-r--r-- | tests/unit/unittest/qmldocumentparser-test.cpp | 23 |
2 files changed, 32 insertions, 16 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp index 8d0c904879..b553c7a154 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp @@ -118,17 +118,12 @@ void addImports(Storage::Imports &imports, } Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName, - const QList<QmlDom::Import> &qmlImports, - SourceId sourceId, - Utils::SmallStringView directoryPath, - QmlDocumentParser::ProjectStorage &storage) + const QualifiedImports &qualifiedImports) { if (!rawtypeName.contains('.')) { return Storage::ImportedType{Utils::SmallString{rawtypeName}}; } - auto qualifiedImports = filterQualifiedImports(qmlImports, sourceId, directoryPath, storage); - auto foundDot = std::find(rawtypeName.begin(), rawtypeName.end(), '.'); QStringView alias(rawtypeName.begin(), foundDot); @@ -141,12 +136,14 @@ Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName, foundImport->second}; } -void addPropertyDeclarations(Storage::Type &type, const QmlDom::QmlObject &rootObject) +void addPropertyDeclarations(Storage::Type &type, + const QmlDom::QmlObject &rootObject, + const QualifiedImports &qualifiedImports) { for (const QmlDom::PropertyDefinition &propertyDeclaration : rootObject.propertyDefs()) { type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name}, - Storage::ImportedType{ - Utils::SmallString{propertyDeclaration.typeName}}, + createImportedTypeName(propertyDeclaration.typeName, + qualifiedImports), Storage::PropertyDeclarationTraits::None); } } @@ -242,15 +239,13 @@ Storage::Type QmlDocumentParser::parse(const QString &sourceContent, const auto qmlImports = qmlFile->imports(); auto directoryPath{m_pathCache.sourceContextPath(m_pathCache.sourceContextId(sourceId))}; - type.prototype = createImportedTypeName(qmlObject.name(), - qmlImports, - sourceId, - directoryPath, - m_storage); + const auto qualifiedImports = filterQualifiedImports(qmlImports, sourceId, directoryPath, m_storage); + + type.prototype = createImportedTypeName(qmlObject.name(), qualifiedImports); addImports(imports, qmlFile->imports(), sourceId, directoryPath, m_storage); - addPropertyDeclarations(type, qmlObject); + addPropertyDeclarations(type, qmlObject, qualifiedImports); addFunctionAndSignalDeclarations(type, qmlObject); addEnumeraton(type, component); diff --git a/tests/unit/unittest/qmldocumentparser-test.cpp b/tests/unit/unittest/qmldocumentparser-test.cpp index 5e7312a45f..68a7395e44 100644 --- a/tests/unit/unittest/qmldocumentparser-test.cpp +++ b/tests/unit/unittest/qmldocumentparser-test.cpp @@ -160,7 +160,7 @@ TEST_F(QmlDocumentParser, QualifiedPrototype) TEST_F(QmlDocumentParser, Properties) { - auto type = parser.parse("Example{\n property int foo\n}", imports, qmlFileSourceId); + auto type = parser.parse(R"(Example{ property int foo })", imports, qmlFileSourceId); ASSERT_THAT(type.propertyDeclarations, UnorderedElementsAre(IsPropertyDeclaration("foo", @@ -168,12 +168,32 @@ TEST_F(QmlDocumentParser, Properties) Storage::PropertyDeclarationTraits::None))); } +TEST_F(QmlDocumentParser, QualifiedProperties) +{ + auto exampleModuleId = storage.moduleId("Example"); + + auto type = parser.parse(R"(import Example 2.1 as Example + Item{ property Example.Foo foo})", + imports, + qmlFileSourceId); + + ASSERT_THAT(type.propertyDeclarations, + UnorderedElementsAre(IsPropertyDeclaration( + "foo", + Storage::QualifiedImportedType("Foo", + Storage::Import{exampleModuleId, + Storage::Version{2, 1}, + qmlFileSourceId}), + Storage::PropertyDeclarationTraits::None))); +} + TEST_F(QmlDocumentParser, Imports) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); ModuleId qmlModuleId = storage.moduleId("QML"); ModuleId qtQmlModuleId = storage.moduleId("QtQml"); ModuleId qtQuickModuleId = storage.moduleId("QtQuick"); + auto type = parser.parse(R"(import QtQuick import "../foo" Example{})", @@ -246,6 +266,7 @@ TEST_F(QmlDocumentParser, DISABLED_DuplicateImportsAreRemoved) ModuleId qmlModuleId = storage.moduleId("QML"); ModuleId qtQmlModuleId = storage.moduleId("QtQml"); ModuleId qtQuickModuleId = storage.moduleId("QtQuick"); + auto type = parser.parse(R"(import QtQuick import "../foo" import QtQuick |