aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljsutils.cpp')
-rw-r--r--src/qmlcompiler/qqmljsutils.cpp63
1 files changed, 36 insertions, 27 deletions
diff --git a/src/qmlcompiler/qqmljsutils.cpp b/src/qmlcompiler/qqmljsutils.cpp
index 410f6b0d14..c6eb09b313 100644
--- a/src/qmlcompiler/qqmljsutils.cpp
+++ b/src/qmlcompiler/qqmljsutils.cpp
@@ -80,7 +80,10 @@ QQmlJSUtils::ResolvedAlias QQmlJSUtils::resolveAlias(const QQmlJSTypeResolver *t
{
return ::resolveAlias(
[&](const QString &id, const QQmlJSScope::ConstPtr &referrer) {
- return typeResolver->scopeForId(id, referrer);
+ const QQmlJSRegisterContent content = typeResolver->scopedType(referrer, id);
+ if (content.variant() == QQmlJSRegisterContent::ObjectById)
+ return content.type();
+ return QQmlJSScope::ConstPtr();
},
property, owner, visitor);
}
@@ -97,7 +100,7 @@ QQmlJSUtils::ResolvedAlias QQmlJSUtils::resolveAlias(const QQmlJSScopesById &idS
property, owner, visitor);
}
-std::optional<FixSuggestion> QQmlJSUtils::didYouMean(const QString &userInput,
+std::optional<QQmlJSFixSuggestion> QQmlJSUtils::didYouMean(const QString &userInput,
QStringList candidates,
QQmlJS::SourceLocation location)
{
@@ -144,10 +147,12 @@ std::optional<FixSuggestion> QQmlJSUtils::didYouMean(const QString &userInput,
}
if (shortestDistance
- < std::min(std::max(userInput.size() / 2, qsizetype(3)), userInput.size())) {
- return FixSuggestion { { FixSuggestion::Fix {
- u"Did you mean \"%1\"?"_s.arg(shortestDistanceWord), location,
- shortestDistanceWord } } };
+ < std::min(std::max(userInput.size() / 2, qsizetype(3)), userInput.size())) {
+ return QQmlJSFixSuggestion {
+ u"Did you mean \"%1\"?"_s.arg(shortestDistanceWord),
+ location,
+ shortestDistanceWord
+ };
} else {
return {};
}
@@ -202,24 +207,16 @@ QQmlJSUtils::sourceDirectoryPath(const QQmlJSImporter *importer, const QString &
Utility method that checks if one of the registers is var, and the other can be
efficiently compared to it
*/
-bool canStrictlyCompareWithVar(const QQmlJSTypeResolver *typeResolver,
- const QQmlJSRegisterContent &lhsContent,
- const QQmlJSRegisterContent &rhsContent)
+bool canStrictlyCompareWithVar(
+ const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType,
+ const QQmlJSScope::ConstPtr &rhsType)
{
Q_ASSERT(typeResolver);
- const auto varType = typeResolver->varType();
- const auto nullType = typeResolver->nullType();
- const auto voidType = typeResolver->voidType();
-
- // Use containedType() because nullptr is not a stored type.
- const auto lhsType = typeResolver->containedType(lhsContent);
- const auto rhsType = typeResolver->containedType(rhsContent);
-
- return (typeResolver->equals(lhsType, varType)
- && (typeResolver->equals(rhsType, nullType) || typeResolver->equals(rhsType, voidType)))
- || (typeResolver->equals(rhsType, varType)
- && (typeResolver->equals(lhsType, nullType)
- || typeResolver->equals(lhsType, voidType)));
+
+ const QQmlJSScope::ConstPtr varType = typeResolver->varType();
+ const bool leftIsVar = typeResolver->equals(lhsType, varType);
+ const bool righttIsVar = typeResolver->equals(rhsType, varType);
+ return leftIsVar != righttIsVar;
}
/*! \internal
@@ -227,13 +224,11 @@ bool canStrictlyCompareWithVar(const QQmlJSTypeResolver *typeResolver,
Utility method that checks if one of the registers is qobject, and the other can be
efficiently compared to it
*/
-bool canCompareWithQObject(const QQmlJSTypeResolver *typeResolver,
- const QQmlJSRegisterContent &lhsContent,
- const QQmlJSRegisterContent &rhsContent)
+bool canCompareWithQObject(
+ const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType,
+ const QQmlJSScope::ConstPtr &rhsType)
{
Q_ASSERT(typeResolver);
- const auto lhsType = typeResolver->containedType(lhsContent);
- const auto rhsType = typeResolver->containedType(rhsContent);
return (lhsType->isReferenceType()
&& (rhsType->isReferenceType()
|| typeResolver->equals(rhsType, typeResolver->nullType())))
@@ -242,4 +237,18 @@ bool canCompareWithQObject(const QQmlJSTypeResolver *typeResolver,
|| typeResolver->equals(lhsType, typeResolver->nullType())));
}
+/*! \internal
+
+ Utility method that checks if both sides are QUrl type. In future, that might be extended to
+ support comparison with other types i.e QUrl vs string
+*/
+bool canCompareWithQUrl(
+ const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType,
+ const QQmlJSScope::ConstPtr &rhsType)
+{
+ Q_ASSERT(typeResolver);
+ return typeResolver->equals(lhsType, typeResolver->urlType())
+ && typeResolver->equals(rhsType, typeResolver->urlType());
+}
+
QT_END_NAMESPACE