aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-06-07 16:45:54 +0200
committerMarco Bubke <marco.bubke@qt.io>2022-06-09 16:33:42 +0000
commit0bac1fb08e2e76815d9646e43ae45b4945cb1a2c (patch)
tree648fe67f708c76681fda68bdbfefc7e2431a8759
parent9194300ebe76eaf0864919c40f7086e7a760e88e (diff)
QmlDesigner: Improve alias property name support
Use aliasPropertyNameTail member in updater. Task-number: QDS-7117 Change-Id: Ic77f220de3d144af4dc870979d3287b66a32949f Reviewed-by: Marco Bubke <marco.bubke@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp18
-rw-r--r--tests/unit/unittest/qmldocumentparser-test.cpp24
2 files changed, 38 insertions, 4 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
index 4bbeebddf8..7b3b091f63 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
@@ -161,6 +161,17 @@ Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName,
foundImport->second};
}
+std::pair<Utils::SmallString, Utils::SmallString> createAccessPaths(const QStringList &accessPath)
+{
+ if (accessPath.size() == 1)
+ return {accessPath[0], {}};
+
+ if (accessPath.size() == 2)
+ return {accessPath[0], accessPath[1]};
+
+ return {};
+}
+
void addPropertyDeclarations(Storage::Type &type,
QmlDom::QmlObject &rootObject,
const QualifiedImports &qualifiedImports,
@@ -176,12 +187,15 @@ void addPropertyDeclarations(Storage::Type &type,
auto resolvedAlias = rootObject.resolveAlias(rootObjectItem,
property.ownerAs<QmlDom::ScriptExpression>());
if (resolvedAlias.valid()) {
+ auto [aliasPropertyName, aliasPropertyNameTail] = createAccessPaths(
+ resolvedAlias.accessedPath);
+
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},
createImportedTypeName(resolvedAlias.typeName,
qualifiedImports),
Storage::PropertyDeclarationTraits::None,
- Utils::SmallString{
- resolvedAlias.accessedPath.join('.')});
+ aliasPropertyName,
+ aliasPropertyNameTail);
}
} else {
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},
diff --git a/tests/unit/unittest/qmldocumentparser-test.cpp b/tests/unit/unittest/qmldocumentparser-test.cpp
index dce80cc05e..5a1992ebb6 100644
--- a/tests/unit/unittest/qmldocumentparser-test.cpp
+++ b/tests/unit/unittest/qmldocumentparser-test.cpp
@@ -72,7 +72,26 @@ MATCHER_P4(IsAliasPropertyDeclaration,
return propertyDeclaration.name == name
&& Storage::ImportedTypeName{typeName} == propertyDeclaration.typeName
&& propertyDeclaration.traits == traits
- && propertyDeclaration.aliasPropertyName == aliasPropertyName;
+ && propertyDeclaration.aliasPropertyName == aliasPropertyName
+ && propertyDeclaration.aliasPropertyNameTail.empty();
+}
+
+MATCHER_P5(IsAliasPropertyDeclaration,
+ name,
+ typeName,
+ traits,
+ aliasPropertyName,
+ aliasPropertyNameTail,
+ std::string(negation ? "isn't " : "is ")
+ + PrintToString(Storage::PropertyDeclaration{name, typeName, traits, aliasPropertyName}))
+{
+ const Storage::PropertyDeclaration &propertyDeclaration = arg;
+
+ return propertyDeclaration.name == name
+ && Storage::ImportedTypeName{typeName} == propertyDeclaration.typeName
+ && propertyDeclaration.traits == traits
+ && propertyDeclaration.aliasPropertyName == aliasPropertyName
+ && propertyDeclaration.aliasPropertyNameTail == aliasPropertyNameTail;
}
MATCHER_P2(IsFunctionDeclaration,
@@ -436,7 +455,8 @@ TEST_F(QmlDocumentParser, IndirectAliasProperties)
UnorderedElementsAre(IsAliasPropertyDeclaration("textSize",
Storage::ImportedType{"Item"},
Storage::PropertyDeclarationTraits::None,
- "text.size")));
+ "text",
+ "size")));
}
TEST_F(QmlDocumentParser, InvalidAliasPropertiesAreSkipped)