diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsutils.cpp')
-rw-r--r-- | src/qmlcompiler/qqmljsutils.cpp | 63 |
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 |