diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsimportvisitor.cpp')
| -rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp index b55dbb4d60..92b5319347 100644 --- a/src/qmlcompiler/qqmljsimportvisitor.cpp +++ b/src/qmlcompiler/qqmljsimportvisitor.cpp @@ -759,10 +759,40 @@ void QQmlJSImportVisitor::processPropertyTypes() void QQmlJSImportVisitor::processMethodTypes() { + const auto isEnumUsedAsType = [&](QStringView typeName, const QQmlJS::SourceLocation &loc) { + if (typeName == "enum"_L1) { + m_logger->log("QML does not have an `enum` type. Use the enum's underlying type " + "(int or double)."_L1, + qmlEnumsAreNotTypes, loc); + return true; + } + + const auto split = typeName.tokenize(u'.').toContainer<QVarLengthArray<QStringView, 4>>(); + if (split.size() != 2) + return false; + + const QStringView scopeName = split[0]; + const QStringView enumName = split[1]; + + if (auto scope = QQmlJSScope::findType(scopeName.toString(), + m_rootScopeImports.contextualTypes()).scope) { + if (scope->enumeration(enumName.toString()).isValid()) { + m_logger->log("QML enumerations are not types. Use underlying type " + "(int or double) instead."_L1, + qmlEnumsAreNotTypes, loc); + return true; + } + } + return false; + }; + for (const auto &method : std::as_const(m_pendingMethodTypeAnnotations)) { for (auto [it, end] = method.scope->mutableOwnMethodsRange(method.methodName); it != end; ++it) { const auto [parameterBegin, parameterEnd] = it->mutableParametersRange(); for (auto parameter = parameterBegin; parameter != parameterEnd; ++parameter) { + const int parameterIndex = parameter - parameterBegin; + if (isEnumUsedAsType(parameter->typeName(), method.locations[parameterIndex])) + continue; if (const auto parameterType = QQmlJSScope::findType( parameter->typeName(), m_rootScopeImports.contextualTypes()).scope) { parameter->setType({ parameterType }); @@ -774,6 +804,8 @@ void QQmlJSImportVisitor::processMethodTypes() } } + if (isEnumUsedAsType(it->returnTypeName(), method.locations.last())) + continue; if (const auto returnType = QQmlJSScope::findType( it->returnTypeName(), m_rootScopeImports.contextualTypes()).scope) { it->setReturnType({ returnType }); |
