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 <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2025-04-26 22:23:06 +02:00
parent f00999d61d
commit 85a7a79d00
2 changed files with 18 additions and 39 deletions

View File

@@ -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; }

View File

@@ -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