diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2024-10-09 13:43:27 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-10-17 07:34:33 +0200 |
| commit | 848d3e6c751bdeaa11005b5d89c1312caae071d1 (patch) | |
| tree | 1a04c1ca8674b56e1754a11ac48991e8045f57a3 /src | |
| parent | 097712ae79924837dd7ac02965475e152978133d (diff) | |
QmlCompiler: Mark types in function signatures as "named"
We have the TypeByName content variant already for the related concept
of naming a type in script code, for example to perform a type
assertion. We can re-use it for signatures.
Task-number: QTBUG-124670
Change-Id: If13518df2b2217769d02c4618f57203907b3f5f9
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmlcompiler/qqmljsfunctioninitializer.cpp | 17 | ||||
| -rw-r--r-- | src/qmlcompiler/qqmljsshadowcheck.cpp | 1 | ||||
| -rw-r--r-- | src/qmlcompiler/qqmljstyperesolver.cpp | 10 | ||||
| -rw-r--r-- | src/qmlcompiler/qqmljstyperesolver_p.h | 1 |
4 files changed, 21 insertions, 8 deletions
diff --git a/src/qmlcompiler/qqmljsfunctioninitializer.cpp b/src/qmlcompiler/qqmljsfunctioninitializer.cpp index 309bea8dff..c276d2ff4f 100644 --- a/src/qmlcompiler/qqmljsfunctioninitializer.cpp +++ b/src/qmlcompiler/qqmljsfunctioninitializer.cpp @@ -88,11 +88,11 @@ void QQmlJSFunctionInitializer::populateSignature( if (const auto type = m_typeResolver->typeFromAST(argument.typeAnnotation->type)) { function->argumentTypes.append( m_typeResolver->tracked( - m_typeResolver->globalType(type))); + m_typeResolver->namedType(type))); } else { function->argumentTypes.append( m_typeResolver->tracked( - m_typeResolver->globalType(m_typeResolver->varType()))); + m_typeResolver->namedType(m_typeResolver->varType()))); signatureError(u"Cannot resolve the argument type %1."_s .arg(argument.typeAnnotation->type->toString())); } @@ -101,7 +101,7 @@ void QQmlJSFunctionInitializer::populateSignature( alreadyWarnedAboutMissingAnnotations = true; function->argumentTypes.append( m_typeResolver->tracked( - m_typeResolver->globalType(m_typeResolver->varType()))); + m_typeResolver->namedType(m_typeResolver->varType()))); signatureError(u"Functions without type annotations won't be compiled"_s); } } @@ -124,7 +124,7 @@ void QQmlJSFunctionInitializer::populateSignature( if (!function->returnType.isValid()) { if (ast->typeAnnotation) { - function->returnType = m_typeResolver->globalType( + function->returnType = m_typeResolver->namedType( m_typeResolver->typeFromAST(ast->typeAnnotation->type)); if (!function->returnType.isValid()) signatureError(u"Cannot resolve return type %1"_s.arg( @@ -135,7 +135,7 @@ void QQmlJSFunctionInitializer::populateSignature( for (int i = QQmlJSCompilePass::FirstArgument + function->argumentTypes.size(); i < context->registerCountInFunction; ++i) { function->registerTypes.append(m_typeResolver->tracked( - m_typeResolver->globalType(m_typeResolver->voidType()))); + m_typeResolver->namedType(m_typeResolver->voidType()))); } function->addressableScopes = m_typeResolver->objectsById(); @@ -196,10 +196,11 @@ QQmlJSCompilePass::Function QQmlJSFunctionInitializer::run( QtDebugMsg, bindingLocation, errors); function.argumentTypes.append( m_typeResolver->tracked( - m_typeResolver->globalType(m_typeResolver->varType()))); + m_typeResolver->namedType( + m_typeResolver->varType()))); } else { function.argumentTypes.append(m_typeResolver->tracked( - m_typeResolver->globalType(type))); + m_typeResolver->namedType(type))); } } break; @@ -223,7 +224,7 @@ QQmlJSCompilePass::Function QQmlJSFunctionInitializer::run( const auto property = m_objectType->property(propertyName); if (const QQmlJSScope::ConstPtr propertyType = property.type()) { - function.returnType = m_typeResolver->globalType(propertyType->isListProperty() + function.returnType = m_typeResolver->namedType(propertyType->isListProperty() ? m_typeResolver->qObjectListType() : QQmlJSScope::ConstPtr(property.type())); } else { diff --git a/src/qmlcompiler/qqmljsshadowcheck.cpp b/src/qmlcompiler/qqmljsshadowcheck.cpp index a03e660a86..1178f2e8d5 100644 --- a/src/qmlcompiler/qqmljsshadowcheck.cpp +++ b/src/qmlcompiler/qqmljsshadowcheck.cpp @@ -158,6 +158,7 @@ QQmlJSShadowCheck::Shadowability QQmlJSShadowCheck::checkShadowing( switch (baseType.variant()) { case QQmlJSRegisterContent::MethodCall: case QQmlJSRegisterContent::Property: + case QQmlJSRegisterContent::TypeByName: case QQmlJSRegisterContent::Unknown: { const QQmlJSRegisterContent member = m_typeResolver->memberType(baseType, memberName); diff --git a/src/qmlcompiler/qqmljstyperesolver.cpp b/src/qmlcompiler/qqmljstyperesolver.cpp index b6ce166ca2..1205fd2f95 100644 --- a/src/qmlcompiler/qqmljstyperesolver.cpp +++ b/src/qmlcompiler/qqmljstyperesolver.cpp @@ -1036,6 +1036,16 @@ QQmlJSRegisterContent QQmlJSTypeResolver::conversionType(const QQmlJSScope::Cons type, QQmlJSRegisterContent::InvalidLookupIndex, QQmlJSRegisterContent::Conversion); } +/*! + * \internal + * A type named explicitly, for example in "as"-casts or as function annotation. + */ +QQmlJSRegisterContent QQmlJSTypeResolver::namedType(const QQmlJSScope::ConstPtr &type) +{ + return QQmlJSRegisterContent::create( + type, QQmlJSRegisterContent::InvalidLookupIndex, QQmlJSRegisterContent::TypeByName); +} + static QQmlJSRegisterContent::ContentVariant scopeContentVariant(QQmlJSScope::ExtensionKind mode, bool isMethod) { diff --git a/src/qmlcompiler/qqmljstyperesolver_p.h b/src/qmlcompiler/qqmljstyperesolver_p.h index 1e5e922ae2..bc4c24b066 100644 --- a/src/qmlcompiler/qqmljstyperesolver_p.h +++ b/src/qmlcompiler/qqmljstyperesolver_p.h @@ -147,6 +147,7 @@ public: static QQmlJSRegisterContent literalType(const QQmlJSScope::ConstPtr &type); static QQmlJSRegisterContent operationType(const QQmlJSScope::ConstPtr &type); static QQmlJSRegisterContent conversionType(const QQmlJSScope::ConstPtr &type); + static QQmlJSRegisterContent namedType(const QQmlJSScope::ConstPtr &type); QQmlJSRegisterContent builtinType(const QQmlJSScope::ConstPtr &type) const; QQmlJSRegisterContent globalType(const QQmlJSScope::ConstPtr &type) const; QQmlJSScope::ConstPtr scopedType( |
