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>
This commit is contained in:
Marco Bubke
2022-06-07 16:45:54 +02:00
parent 9194300ebe
commit 0bac1fb08e
2 changed files with 38 additions and 4 deletions

View File

@@ -161,6 +161,17 @@ Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName,
foundImport->second}; 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, void addPropertyDeclarations(Storage::Type &type,
QmlDom::QmlObject &rootObject, QmlDom::QmlObject &rootObject,
const QualifiedImports &qualifiedImports, const QualifiedImports &qualifiedImports,
@@ -176,12 +187,15 @@ void addPropertyDeclarations(Storage::Type &type,
auto resolvedAlias = rootObject.resolveAlias(rootObjectItem, auto resolvedAlias = rootObject.resolveAlias(rootObjectItem,
property.ownerAs<QmlDom::ScriptExpression>()); property.ownerAs<QmlDom::ScriptExpression>());
if (resolvedAlias.valid()) { if (resolvedAlias.valid()) {
auto [aliasPropertyName, aliasPropertyNameTail] = createAccessPaths(
resolvedAlias.accessedPath);
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name}, type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},
createImportedTypeName(resolvedAlias.typeName, createImportedTypeName(resolvedAlias.typeName,
qualifiedImports), qualifiedImports),
Storage::PropertyDeclarationTraits::None, Storage::PropertyDeclarationTraits::None,
Utils::SmallString{ aliasPropertyName,
resolvedAlias.accessedPath.join('.')}); aliasPropertyNameTail);
} }
} else { } else {
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name}, type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},

View File

@@ -72,7 +72,26 @@ MATCHER_P4(IsAliasPropertyDeclaration,
return propertyDeclaration.name == name return propertyDeclaration.name == name
&& Storage::ImportedTypeName{typeName} == propertyDeclaration.typeName && Storage::ImportedTypeName{typeName} == propertyDeclaration.typeName
&& propertyDeclaration.traits == traits && 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, MATCHER_P2(IsFunctionDeclaration,
@@ -436,7 +455,8 @@ TEST_F(QmlDocumentParser, IndirectAliasProperties)
UnorderedElementsAre(IsAliasPropertyDeclaration("textSize", UnorderedElementsAre(IsAliasPropertyDeclaration("textSize",
Storage::ImportedType{"Item"}, Storage::ImportedType{"Item"},
Storage::PropertyDeclarationTraits::None, Storage::PropertyDeclarationTraits::None,
"text.size"))); "text",
"size")));
} }
TEST_F(QmlDocumentParser, InvalidAliasPropertiesAreSkipped) TEST_F(QmlDocumentParser, InvalidAliasPropertiesAreSkipped)