From 9236b1b01980e5fba1c19e46ef7214a0eed07cd7 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 4 Oct 2023 22:42:30 +0200 Subject: [PATCH] QmlDesigner: Modernize the code a little bit Change-Id: I24dffa459ad8a948fd58d83249cb07c827a6343f Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Tim Jenssen --- src/libs/utils/algorithm.h | 4 +- src/libs/utils/array.h | 2 + .../designercore/include/modelfwd.h | 1 + .../designercore/model/modelnode.cpp | 50 +++++++------- .../designercore/model/modelutils.h | 10 +++ .../designercore/model/texttomodelmerger.cpp | 67 ++++++++++--------- 6 files changed, 77 insertions(+), 57 deletions(-) diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index 496a2f06298..3c0a4b45c1f 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -1410,13 +1410,13 @@ OutputContainer setUnionMerge(InputContainer1 &&input1, } template -auto usize(const Container &container) +constexpr auto usize(const Container &container) { return static_cast>(std::size(container)); } template -auto ssize(const Container &container) +constexpr auto ssize(const Container &container) { return static_cast>(std::size(container)); } diff --git a/src/libs/utils/array.h b/src/libs/utils/array.h index 0d9a6047281..c89778871ca 100644 --- a/src/libs/utils/array.h +++ b/src/libs/utils/array.h @@ -3,6 +3,8 @@ #pragma once +#include + namespace Utils { namespace Internal { diff --git a/src/plugins/qmldesigner/designercore/include/modelfwd.h b/src/plugins/qmldesigner/designercore/include/modelfwd.h index eedc46e3b56..0a062289fd0 100644 --- a/src/plugins/qmldesigner/designercore/include/modelfwd.h +++ b/src/plugins/qmldesigner/designercore/include/modelfwd.h @@ -48,6 +48,7 @@ public: /* */ using TypeName = QByteArray; +using TypeNameView = QByteArrayView; using PropertyTypeList = QList; using IdName = QByteArray; class Model; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index fe973f04abd..56f50223c9e 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -7,6 +7,7 @@ #include "bindingproperty.h" #include "internalnode_p.h" #include "model_p.h" +#include "modelutils.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "nodeproperty.h" @@ -19,12 +20,15 @@ #include #include +#include #include #include #include #include +#include + namespace QmlDesigner { using namespace QmlDesigner::Internal; @@ -84,44 +88,42 @@ QString ModelNode::validId() return id(); } -static bool idIsQmlKeyWord(const QString &id) +namespace { +bool isQmlKeyWord(QStringView id) { - static const QSet keywords = {"as", "break", "case", "catch", - "continue", "debugger", "default", "delete", - "do", "else", "finally", "for", - "function", "if", "import", "in", - "instanceof", "new", "print", "return", - "switch", "this", "throw", "try", - "typeof", "var", "void", "while", - "with"}; + static constexpr auto keywords = Utils::to_array( + {u"as", u"break", u"case", u"catch", u"continue", u"debugger", + u"default", u"delete", u"do", u"else", u"finally", u"for", + u"function", u"if", u"import", u"in", u"instanceof", u"new", + u"print", u"return", u"switch", u"this", u"throw", u"try", + u"typeof", u"var", u"void", u"while", u"with"}); - return keywords.contains(id); + return std::binary_search(keywords.begin(), keywords.end(), ModelUtils::toStdStringView(id)); } -static bool isIdToAvoid(const QString &id) +bool isIdToAvoid(QStringView id) { - static const QSet ids = {"top", "bottom", "left", "right", - "width", "height", "x", "y", - "opacity", "parent", "item", "flow", - "color", "margin", "padding", "border", - "font", "text", "source", "state", - "visible", "focus", "data", "clip", - "layer", "scale", "enabled", "anchors", - "texture", "shaderInfo", "sprite", "spriteSequence", - "baseState", "rect"}; + static constexpr auto token = Utils::to_array( + {u"anchors", u"baseState", u"border", u"bottom", u"clip", u"color", + u"data", u"enabled", u"flow", u"focus", u"font", u"height", + u"item", u"layer", u"left", u"margin", u"opacity", u"padding", + u"parent", u"rect", u"right", u"scale", u"shaderInfo", u"source", + u"sprite", u"spriteSequence", u"state", u"text", u"texture", u"top", + u"visible", u"width", u"x", u"y"}); - return ids.contains(id); + return std::binary_search(token.begin(), token.end(), ModelUtils::toStdStringView(id)); } -static bool idContainsWrongLetter(const QString &id) +bool idContainsWrongLetter(const QString &id) { static QRegularExpression idExpr(QStringLiteral("^[a-z_][a-zA-Z0-9_]*$")); return !id.contains(idExpr); } +} // namespace bool ModelNode::isValidId(const QString &id) { - return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id) && !isIdToAvoid(id)); + return id.isEmpty() || (!idContainsWrongLetter(id) && !isQmlKeyWord(id) && !isIdToAvoid(id)); } QString ModelNode::getIdValidityErrorMessage(const QString &id) @@ -138,7 +140,7 @@ QString ModelNode::getIdValidityErrorMessage(const QString &id) if (id.contains(' ')) return QObject::tr("ID cannot include whitespace (%1).").arg(id); - if (idIsQmlKeyWord(id)) + if (isQmlKeyWord(id)) return QObject::tr("%1 is a reserved QML keyword.").arg(id); if (isIdToAvoid(id)) diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.h b/src/plugins/qmldesigner/designercore/model/modelutils.h index 3f8ddeab56b..2cef2e1fb26 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.h +++ b/src/plugins/qmldesigner/designercore/model/modelutils.h @@ -5,10 +5,15 @@ #include "qmldesignercorelib_global.h" +#include + #include #include +#include + #include +#include namespace QmlDesigner { class PropertyMetaInfo; @@ -41,4 +46,9 @@ QMLDESIGNERCORE_EXPORT QList allModelNodesWithId(AbstractView *view); QMLDESIGNERCORE_EXPORT bool isThisOrAncestorLocked(const ModelNode &node); QMLDESIGNERCORE_EXPORT ModelNode lowestCommonAncestor(Utils::span nodes); +constexpr std::u16string_view toStdStringView(QStringView view) +{ + return {view.utf16(), Utils::usize(view)}; +} + } // namespace QmlDesigner::ModelUtils diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index def00f395d3..75a272931de 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -37,6 +38,7 @@ #include #include +#include #include #include @@ -78,43 +80,46 @@ bool isSupportedVersion(QmlDesigner::Version version) bool isGlobalQtEnums(QStringView value) { - static constexpr QLatin1StringView list[] = { - "Horizontal"_L1, "Vertical"_L1, "AlignVCenter"_L1, "AlignLeft"_L1, - "LeftToRight"_L1, "RightToLeft"_L1, "AlignHCenter"_L1, "AlignRight"_L1, - "AlignBottom"_L1, "AlignBaseline"_L1, "AlignTop"_L1, "BottomLeft"_L1, - "LeftEdge"_L1, "RightEdge"_L1, "BottomEdge"_L1, "TopEdge"_L1, - "TabFocus"_L1, "ClickFocus"_L1, "StrongFocus"_L1, "WheelFocus"_L1, - "NoFocus"_L1, "ArrowCursor"_L1, "UpArrowCursor"_L1, "CrossCursor"_L1, - "WaitCursor"_L1, "IBeamCursor"_L1, "SizeVerCursor"_L1, "SizeHorCursor"_L1, - "SizeBDiagCursor"_L1, "SizeFDiagCursor"_L1, "SizeAllCursor"_L1, "BlankCursor"_L1, - "SplitVCursor"_L1, "SplitHCursor"_L1, "PointingHandCursor"_L1, "ForbiddenCursor"_L1, - "WhatsThisCursor"_L1, "BusyCursor"_L1, "OpenHandCursor"_L1, "ClosedHandCursor"_L1, - "DragCopyCursor"_L1, "DragMoveCursor"_L1, "DragLinkCursor"_L1, "TopToBottom"_L1, - "LeftButton"_L1, "RightButton"_L1, "MiddleButton"_L1, "BackButton"_L1, - "ForwardButton"_L1, "AllButtons"_L1}; + static constexpr auto list = Utils::to_array( + {u"AlignBaseline", u"AlignBottom", u"AlignHCenter", u"AlignLeft", + u"AlignRight", u"AlignTop", u"AlignVCenter", u"AllButtons", + u"ArrowCursor", u"BackButton", u"BlankCursor", u"BottomEdge", + u"BottomLeft", u"BusyCursor", u"ClickFocus", u"ClosedHandCursor", + u"CrossCursor", u"DragCopyCursor", u"DragLinkCursor", u"DragMoveCursor", + u"ForbiddenCursor", u"ForwardButton", u"Horizontal", u"IBeamCursor", + u"LeftButton", u"LeftEdge", u"LeftToRight", u"MiddleButton", + u"NoFocus", u"OpenHandCursor", u"PointingHandCursor", u"RightButton", + u"RightEdge", u"RightToLeft", u"SizeAllCursor", u"SizeBDiagCursor", + u"SizeFDiagCursor", u"SizeHorCursor", u"SizeVerCursor", u"SplitHCursor", + u"SplitVCursor", u"StrongFocus", u"TabFocus", u"TopEdge", + u"TopToBottom", u"UpArrowCursor", u"Vertical", u"WaitCursor", + u"WhatsThisCursor", u"WheelFocus"}); - return std::find(std::begin(list), std::end(list), value) != std::end(list); + return std::binary_search(std::begin(list), + std::end(list), + QmlDesigner::ModelUtils::toStdStringView(value)); } bool isKnownEnumScopes(QStringView value) { - static constexpr QLatin1StringView list[] = {"TextInput"_L1, - "TextEdit"_L1, - "Material"_L1, - "Universal"_L1, - "Font"_L1, - "Shape"_L1, - "ShapePath"_L1, - "AbstractButton"_L1, - "Text"_L1, - "ShaderEffectSource"_L1, - "Grid"_L1, - "ItemLayer"_L1, - "ImageLayer"_L1, - "SpriteLayer"_L1, - "Light"_L1}; + static constexpr auto list = Utils::to_array({u"TextInput", + u"TextEdit", + u"Material", + u"Universal", + u"Font", + u"Shape", + u"ShapePath", + u"AbstractButton", + u"Text", + u"ShaderEffectSource", + u"Grid", + u"ItemLayer", + u"ImageLayer", + u"SpriteLayer", + u"Light"}); - return std::find(std::begin(list), std::end(list), value) != std::end(list); + return std::find(std::begin(list), std::end(list), QmlDesigner::ModelUtils::toStdStringView(value)) + != std::end(list); } bool supportedQtQuickVersion(const QmlDesigner::Import &import)