aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2022-04-27 15:04:46 +0200
committerMaximilian Goldstein <max.goldstein@qt.io>2022-04-28 15:39:52 +0200
commit4b330fa07b01b4ad8051a97af7c04d9a9a574b95 (patch)
tree5df6a6a1eab363a2efe1a2155ed9772460b97b03 /src
parent12d5d7d30613dd09cbdf4fba2decf282d3d8db39 (diff)
qqmljsscope: Add static prettyName() function
Implements QQmlJSScope::prettyName() which will strip off any internal prefixes (such as $internal$ and $anonymous$) and also return some more user recognizable type names (i.e. null instead of std::nullptr_t). Change-Id: I085b51ea9fe6b348fb24efa93726c47b79846a8b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qmlcompiler/qqmljsliteralbindingcheck.cpp5
-rw-r--r--src/qmlcompiler/qqmljsscope.cpp23
-rw-r--r--src/qmlcompiler/qqmljsscope_p.h3
-rw-r--r--src/qmlcompiler/qqmljstypepropagator.cpp8
-rw-r--r--src/qmlcompiler/qqmljstyperesolver.cpp10
-rw-r--r--src/qmlcompiler/qqmljstyperesolver_p.h3
6 files changed, 43 insertions, 9 deletions
diff --git a/src/qmlcompiler/qqmljsliteralbindingcheck.cpp b/src/qmlcompiler/qqmljsliteralbindingcheck.cpp
index 2518cd2d19..ec0c3380ec 100644
--- a/src/qmlcompiler/qqmljsliteralbindingcheck.cpp
+++ b/src/qmlcompiler/qqmljsliteralbindingcheck.cpp
@@ -58,8 +58,9 @@ void QQmlJSLiteralBindingCheck::run(QQmlJSImportVisitor *visitor, QQmlJSTypeReso
}
if (!resolver->canConvertFromTo(binding.literalType(resolver), property.type())) {
- logger->log(u"Cannot assign binding of type %1 to %2"_qs
- .arg(binding.literalTypeName(), property.typeName()),
+ logger->log(u"Cannot assign binding of type %1 to %2"_qs.arg(
+ QQmlJSScope::prettyName(binding.literalTypeName()),
+ QQmlJSScope::prettyName(property.typeName())),
Log_Type, binding.sourceLocation());
continue;
}
diff --git a/src/qmlcompiler/qqmljsscope.cpp b/src/qmlcompiler/qqmljsscope.cpp
index 5b23b247b3..ded18e8163 100644
--- a/src/qmlcompiler/qqmljsscope.cpp
+++ b/src/qmlcompiler/qqmljsscope.cpp
@@ -40,6 +40,8 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
/*! \internal
Utility method that returns proper value according to the type To. This
@@ -246,6 +248,27 @@ QHash<QString, QQmlJSMetaEnum> QQmlJSScope::enumerations() const
return results;
}
+QString QQmlJSScope::prettyName(QAnyStringView name)
+{
+ const auto internal = "$internal$."_L1;
+ const QString anonymous = "$anonymous$."_L1;
+
+ QString pretty = name.toString();
+
+ if (pretty.startsWith(internal))
+ pretty = pretty.mid(internal.size());
+ else if (pretty.startsWith(anonymous))
+ pretty = pretty.mid(anonymous.size());
+
+ if (pretty == u"std::nullptr_t")
+ return u"null"_s;
+
+ if (pretty == u"void")
+ return u"undefined"_s;
+
+ return pretty;
+}
+
/*!
Returns if assigning \a assignedType to \a property would require an
implicit component wrapping.
diff --git a/src/qmlcompiler/qqmljsscope_p.h b/src/qmlcompiler/qqmljsscope_p.h
index 09cdb53cdc..4609b18fb6 100644
--- a/src/qmlcompiler/qqmljsscope_p.h
+++ b/src/qmlcompiler/qqmljsscope_p.h
@@ -306,6 +306,9 @@ public:
return m_internalName + suffix;
}
+ // This returns a more user readable version of internalName / baseTypeName
+ static QString prettyName(QAnyStringView name);
+
static bool causesImplicitComponentWrapping(const QQmlJSMetaProperty &property,
const QQmlJSScope::ConstPtr &assignedType);
bool isComponentRootElement() const;
diff --git a/src/qmlcompiler/qqmljstypepropagator.cpp b/src/qmlcompiler/qqmljstypepropagator.cpp
index 2492b52c3c..86bed50390 100644
--- a/src/qmlcompiler/qqmljstypepropagator.cpp
+++ b/src/qmlcompiler/qqmljstypepropagator.cpp
@@ -105,8 +105,8 @@ void QQmlJSTypePropagator::generate_Ret()
m_returnType.descriptiveName()));
m_logger->log(u"Cannot assign binding of type %1 to %2"_qs.arg(
- m_typeResolver->containedTypeName(m_state.accumulatorIn()),
- m_typeResolver->containedTypeName(m_returnType)),
+ m_typeResolver->containedTypeName(m_state.accumulatorIn(), true),
+ m_typeResolver->containedTypeName(m_returnType, true)),
Log_Type, getCurrentBindingSourceLocation());
return;
}
@@ -734,7 +734,7 @@ void QQmlJSTypePropagator::propagatePropertyLookup(const QString &propertyName)
if (isRestrictedProperty)
return;
- const QString typeName = m_typeResolver->containedTypeName(m_state.accumulatorIn());
+ const QString typeName = m_typeResolver->containedTypeName(m_state.accumulatorIn(), true);
if (typeName == u"QVariant")
return;
@@ -973,7 +973,7 @@ void QQmlJSTypePropagator::generate_CallProperty(int nameIndex, int base, int ar
}
m_logger->log(u"Property \"%1\" not found on type \"%2\""_qs.arg(
- propertyName, m_typeResolver->containedTypeName(callBase)),
+ propertyName, m_typeResolver->containedTypeName(callBase, true)),
Log_Type, getCurrentSourceLocation(), true, true, fixSuggestion);
return;
}
diff --git a/src/qmlcompiler/qqmljstyperesolver.cpp b/src/qmlcompiler/qqmljstyperesolver.cpp
index ed425ccfc6..ab9d5f81e1 100644
--- a/src/qmlcompiler/qqmljstyperesolver.cpp
+++ b/src/qmlcompiler/qqmljstyperesolver.cpp
@@ -481,7 +481,8 @@ void QQmlJSTypeResolver::generalizeType(const QQmlJSScope::ConstPtr &type) const
it->original = genericType(it->original);
}
-QString QQmlJSTypeResolver::containedTypeName(const QQmlJSRegisterContent &container) const
+QString QQmlJSTypeResolver::containedTypeName(const QQmlJSRegisterContent &container,
+ bool useFancyName) const
{
QQmlJSScope::ConstPtr type;
@@ -496,7 +497,12 @@ QString QQmlJSTypeResolver::containedTypeName(const QQmlJSRegisterContent &conta
break;
}
- return type->internalName().isEmpty() ? type->baseTypeName() : type->internalName();
+ QString typeName = type->internalName().isEmpty() ? type->baseTypeName() : type->internalName();
+
+ if (useFancyName)
+ return QQmlJSScope::prettyName(typeName);
+
+ return typeName;
}
bool QQmlJSTypeResolver::canConvertFromTo(const QQmlJSScope::ConstPtr &from,
diff --git a/src/qmlcompiler/qqmljstyperesolver_p.h b/src/qmlcompiler/qqmljstyperesolver_p.h
index a4a1a88f35..165705e50a 100644
--- a/src/qmlcompiler/qqmljstyperesolver_p.h
+++ b/src/qmlcompiler/qqmljstyperesolver_p.h
@@ -130,7 +130,8 @@ public:
bool registerContains(const QQmlJSRegisterContent &reg,
const QQmlJSScope::ConstPtr &type) const;
QQmlJSScope::ConstPtr containedType(const QQmlJSRegisterContent &container) const;
- QString containedTypeName(const QQmlJSRegisterContent &container) const;
+ QString containedTypeName(const QQmlJSRegisterContent &container,
+ bool useFancyName = false) const;
QQmlJSRegisterContent tracked(const QQmlJSRegisterContent &type) const;
QQmlJSRegisterContent original(const QQmlJSRegisterContent &type) const;