diff options
-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 |