summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-02-10 17:48:03 +0100
committerMarco Bubke <marco.bubke@qt.io>2022-02-15 17:18:45 +0000
commit6531a68f554688d70c2ebb2b14d9f9effdc62392 (patch)
treecf1da081161b2e13a016ab8c03fd3c215cbeb75c
parent6e9cb8ad544c1468d7f8bdea1a8562a77749b767 (diff)
downloadqt-creator-6531a68f554688d70c2ebb2b14d9f9effdc62392.tar.gz
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.cpp25
-rw-r--r--tests/unit/unittest/qmldocumentparser-test.cpp23
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