diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsutils.cpp')
| -rw-r--r-- | src/qmlcompiler/qqmljsutils.cpp | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/src/qmlcompiler/qqmljsutils.cpp b/src/qmlcompiler/qqmljsutils.cpp index 9e506ca6bb..430d864933 100644 --- a/src/qmlcompiler/qqmljsutils.cpp +++ b/src/qmlcompiler/qqmljsutils.cpp @@ -28,6 +28,7 @@ #include "qqmljsutils_p.h" #include "qqmljstyperesolver_p.h" +#include "qqmljsscopesbyid_p.h" #include <algorithm> @@ -38,16 +39,15 @@ using namespace Qt::StringLiterals; Fully resolves alias \a property and returns the information about the origin, which is not an alias. */ -QQmlJSUtils::ResolvedAlias -QQmlJSUtils::resolveAlias(const QQmlJSTypeResolver *typeResolver, - const QQmlJSMetaProperty &property, - const QQmlJSScope::ConstPtr &owner, - const QQmlJSUtils::AliasResolutionVisitor &visitor) +template<typename ScopeForId> +static QQmlJSUtils::ResolvedAlias +resolveAlias(ScopeForId scopeForId, const QQmlJSMetaProperty &property, + const QQmlJSScope::ConstPtr &owner, const QQmlJSUtils::AliasResolutionVisitor &visitor) { Q_ASSERT(property.isAlias()); Q_ASSERT(owner); - ResolvedAlias result {}; + QQmlJSUtils::ResolvedAlias result {}; result.owner = owner; for (QQmlJSMetaProperty nextProperty = property; nextProperty.isAlias();) { @@ -56,13 +56,13 @@ QQmlJSUtils::resolveAlias(const QQmlJSTypeResolver *typeResolver, // we have an alias pointing to an alias. this way we avoid a check // whether a property is an alias at the very end of the loop body QQmlJSScope::ConstPtr resultOwner = result.owner; - result = ResolvedAlias {}; + result = QQmlJSUtils::ResolvedAlias {}; visitor.reset(); auto aliasExprBits = nextProperty.aliasExpression().split(u'.'); // resolve id first: - resultOwner = typeResolver->scopeForId(aliasExprBits[0], resultOwner); + resultOwner = scopeForId(aliasExprBits[0], resultOwner); if (!resultOwner) return {}; @@ -92,6 +92,30 @@ QQmlJSUtils::resolveAlias(const QQmlJSTypeResolver *typeResolver, return result; } +QQmlJSUtils::ResolvedAlias QQmlJSUtils::resolveAlias(const QQmlJSTypeResolver *typeResolver, + const QQmlJSMetaProperty &property, + const QQmlJSScope::ConstPtr &owner, + const AliasResolutionVisitor &visitor) +{ + return ::resolveAlias( + [&](const QString &id, const QQmlJSScope::ConstPtr &referrer) { + return typeResolver->scopeForId(id, referrer); + }, + property, owner, visitor); +} + +QQmlJSUtils::ResolvedAlias QQmlJSUtils::resolveAlias(const QQmlJSScopesById &idScopes, + const QQmlJSMetaProperty &property, + const QQmlJSScope::ConstPtr &owner, + const AliasResolutionVisitor &visitor) +{ + return ::resolveAlias( + [&](const QString &id, const QQmlJSScope::ConstPtr &referrer) { + return idScopes.scope(id, referrer); + }, + property, owner, visitor); +} + std::optional<FixSuggestion> QQmlJSUtils::didYouMean(const QString &userInput, QStringList candidates, QQmlJS::SourceLocation location) |
