From 018d15a46c4c5d1123af05b3fd0d19546467fece Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sun, 27 Apr 2025 09:28:30 +0200 Subject: [PATCH] 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 --- .../designercore/model/bindingproperty.cpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/libs/designercore/model/bindingproperty.cpp index ea19c0b2a9b..32bda7021e5 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/bindingproperty.cpp @@ -127,26 +127,23 @@ AbstractProperty BindingProperty::resolveToProperty() const if (!isValid()) return {}; - QString binding = expression(); + QStringView binding = expression(); if (binding.isEmpty()) return {}; ModelNode node = parentModelNode(); - QString element; - if (binding.contains(QLatin1Char('.'))) { - element = binding.split(QLatin1Char('.')).constLast(); - QString nodeBinding = binding; - nodeBinding.chop(element.length()); + auto lastElementBegin = std::ranges::find(binding | std::views::reverse, u'.').base(); + QStringView lastElement{lastElementBegin, binding.end()}; + if (binding.begin() != lastElementBegin) { + QStringView nodeBinding{binding.begin(), std::prev(lastElementBegin)}; node = resolveBinding(nodeBinding, parentModelNode()); - } else { - element = binding; } - if (node.isValid() && !element.contains(' ')) - return node.property(element.toUtf8()); - else - return AbstractProperty(); + if (node.isValid() && !lastElement.contains(' ')) + return node.property(lastElement.toUtf8()); + + return {}; } bool BindingProperty::isList() const