QmlDesigner: Refactor resolveToProperty method to use QStringView and modern C++ ranges

- Changed the binding variable type from QString to QStringView for
improved performance.
- Utilized std::ranges and std::views to simplify string manipulation
and element extraction.
- Enhanced readability and efficiency by removing redundant string
operations.
- Ensured consistent return of AbstractProperty when node or element is
invalid.

Change-Id: Id221e665211aa3f0354c7cf4de15bb3fc1e90d51
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2025-04-27 09:28:30 +02:00
parent 2caf52bb97
commit 018d15a46c

View File

@@ -127,26 +127,23 @@ AbstractProperty BindingProperty::resolveToProperty() const
if (!isValid()) if (!isValid())
return {}; return {};
QString binding = expression(); QStringView binding = expression();
if (binding.isEmpty()) if (binding.isEmpty())
return {}; return {};
ModelNode node = parentModelNode(); ModelNode node = parentModelNode();
QString element; auto lastElementBegin = std::ranges::find(binding | std::views::reverse, u'.').base();
if (binding.contains(QLatin1Char('.'))) { QStringView lastElement{lastElementBegin, binding.end()};
element = binding.split(QLatin1Char('.')).constLast(); if (binding.begin() != lastElementBegin) {
QString nodeBinding = binding; QStringView nodeBinding{binding.begin(), std::prev(lastElementBegin)};
nodeBinding.chop(element.length());
node = resolveBinding(nodeBinding, parentModelNode()); node = resolveBinding(nodeBinding, parentModelNode());
} else {
element = binding;
} }
if (node.isValid() && !element.contains(' ')) if (node.isValid() && !lastElement.contains(' '))
return node.property(element.toUtf8()); return node.property(lastElement.toUtf8());
else
return AbstractProperty(); return {};
} }
bool BindingProperty::isList() const bool BindingProperty::isList() const