From 85a7a79d0044a75ae59de0e52712212c03add242 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sat, 26 Apr 2025 22:23:06 +0200 Subject: [PATCH] QmlDesigner: Refactor `convertTypeToImportAlias` method - Removed `getUrlFromType` function and integrated its logic directly into `convertTypeToImportAlias`. - Simplified the process of extracting the simplified type and URL from the input type. - Utilized C++20 ranges and views for more concise and readable code. - Improved the search for import aliases by using modern C++ features. - Optimized memory allocations by reducing unnecessary QString constructions and copies. Change-Id: Ife1ad69c3b42b7c578659d2342866edeaf354092 Reviewed-by: Thomas Hartmann --- .../libs/designercore/include/rewriterview.h | 2 +- .../designercore/rewriter/rewriterview.cpp | 55 ++++++------------- 2 files changed, 18 insertions(+), 39 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h b/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h index ac64b97cd3f..2b4e5f2f800 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h @@ -129,7 +129,7 @@ public: const QmlJS::ScopeChain *scopeChain() const; #endif - QString convertTypeToImportAlias(const QString &type) const; + QString convertTypeToImportAlias(QStringView type) const; bool checkSemanticErrors() const { return m_checkSemanticErrors; } diff --git a/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp b/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp index d94846d234a..12d547833e4 100644 --- a/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp +++ b/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp @@ -962,50 +962,29 @@ QmlJS::Document::Ptr RewriterView::document() const return textToModelMerger()->document(); } -inline static QString getUrlFromType(const QString &typeName) +QString RewriterView::convertTypeToImportAlias(QStringView type) const { - QStringList nameComponents = typeName.split('.'); - QString result; + auto simplifiedTypeBegin = std::ranges::find(type | std::views::reverse, u'.').base(); + const auto simplifiedType = QStringView{simplifiedTypeBegin, type.end()}.toString(); + if (type.begin() == simplifiedTypeBegin) + return simplifiedType; - for (int i = 0; i < (nameComponents.size() - 1); i++) { - result += nameComponents.at(i); - } + QStringView url{type.begin(), std::prev(simplifiedTypeBegin)}; + auto &&imports = model()->imports(); + auto projection = [](auto &&import) { + return import.isFileImport() ? import.file() : import.url(); + }; + auto found = std::ranges::find(imports, url, projection); - return result; -} + if (found == imports.end()) + return simplifiedType; -QString RewriterView::convertTypeToImportAlias(const QString &type) const -{ - QString url; - QString simplifiedType = type; - if (type.contains('.')) { - QStringList nameComponents = type.split('.'); - url = getUrlFromType(type); - simplifiedType = nameComponents.constLast(); - } + auto &&alias = found->alias(); - QString alias; - if (!url.isEmpty()) { - for (const Import &import : model()->imports()) { - if (import.url() == url) { - alias = import.alias(); - break; - } - if (import.file() == url) { - alias = import.alias(); - break; - } - } - } + if (alias.isEmpty()) + return simplifiedType; - QString result; - - if (!alias.isEmpty()) - result = alias + '.'; - - result += simplifiedType; - - return result; + return alias + '.'_L1 + simplifiedType; } QStringList RewriterView::importDirectories() const