6#include <private/qqmljsmemorypool_p.h>
8#include <QtCore/qloggingcategory.h>
9#include <QtCore/qfileinfo.h>
11#include <QtQml/private/qqmlsignalnames_p.h>
32 return u
"a boolean"_s;
40 return u
"a translation"_s;
42 return u
"a translation by id"_s;
46 return u
"an object"_s;
48 return u
"an attached property"_s;
50 return u
"a grouped property"_s;
56void QQmlJSFunctionInitializer::populateSignature(
64 function->isFullyTyped =
false;
68 signatureError(u
"Ignoring type annotations as requested "
69 "by pragma FunctionSignatureBehavior"_s);
82 if (function->argumentTypes.isEmpty()) {
86 function->argumentTypes.append(
90 function->argumentTypes.append(
93 signatureError(u
"Cannot resolve the argument type %1."_s
97 function->argumentTypes.append(
100 signatureError(u
"Functions without type annotations won't be compiled"_s);
109 signatureError(u
"Type annotation %1 on signal handler "
110 "contradicts signal argument type %2"_s
112 function->argumentTypes[
i].descriptiveName()));
119 if (!function->returnType.isValid()) {
121 function->returnType = m_typeResolver->
globalType(
123 if (!function->returnType.isValid())
124 signatureError(u
"Cannot resolve return type %1"_s.arg(
130 i <
context->registerCountInFunction; ++
i) {
131 function->registerTypes.append(m_typeResolver->
tracked(
135 function->addressableScopes = m_typeResolver->
objectsById();
136 function->code =
context->code;
137 function->sourceLocations =
context->sourceLocationTable.get();
159 bindingLocation.
startLine = irBinding.location.line();
160 bindingLocation.startColumn = irBinding.location.column();
163 function.qmlScope = m_scopeType;
166 diagnose(u
"Binding is not a script binding, but %1."_s.arg(
171 function.isProperty = m_objectType->
hasProperty(propertyName);
172 if (!function.isProperty) {
174 if (
auto actualPropertyName =
176 actualPropertyName && m_objectType->
hasProperty(*actualPropertyName)) {
177 function.isSignalHandler =
true;
184 if (
method.methodType() == QQmlJSMetaMethodType::Signal) {
185 function.isSignalHandler =
true;
190 diagnose(u
"Cannot resolve the argument type %1."_s.arg(
193 function.argumentTypes.append(
197 function.argumentTypes.append(m_typeResolver->
tracked(
204 if (!function.isSignalHandler) {
205 diagnose(u
"Could not compile signal handler for %1: The signal does not exist"_s.arg(
213 if (!function.isSignalHandler) {
214 if (!function.isProperty) {
215 diagnose(u
"Could not compile binding for %1: The property does not exist"_s.arg(
220 const auto property = m_objectType->
property(propertyName);
222 function.returnType = m_typeResolver->
globalType(propertyType->isListProperty()
226 QString message = u
"Cannot resolve property type %1 for binding on %2."_s
232 message += u
" You may want use ID-based grouped properties here.";
238 function.isQPropertyBinding =
true;
246 Q_ASSERT(astNode->expressionCast());
255 pool.newString(
name),
nullptr, body);
273 function.qmlScope = m_scopeType;
static JNINativeMethod methods[]
qsizetype size() const noexcept
bool isEmpty() const noexcept
QQmlJSCompilePass::Function run(const QV4::Compiler::Context *context, const QString &propertyName, QQmlJS::AST::Node *astNode, const QmlIR::Binding &irBinding, QQmlJS::DiagnosticMessage *error)
bool isNameDeferred(const QString &name) const
QHash< QString, QQmlJSMetaMethod > methods() const
Returns all methods visible from this scope including those of base types and extensions.
QDeferredSharedPointer< const QQmlJSScope > ConstPtr
QQmlJSMetaProperty property(const QString &name) const
bool hasProperty(const QString &name) const
const QQmlJSScopesById & objectsById() const
QQmlJSRegisterContent tracked(const QQmlJSRegisterContent &type) const
QQmlJSScope::ConstPtr qObjectListType() const
bool registerContains(const QQmlJSRegisterContent ®, const QQmlJSScope::ConstPtr &type) const
QQmlJSRegisterContent globalType(const QQmlJSScope::ConstPtr &type) const
QQmlJSScope::ConstPtr voidType() const
QQmlJSScope::ConstPtr typeFromAST(QQmlJS::AST::Type *type) const
QQmlJSScope::ConstPtr varType() const
bool canCallJSFunctions() const
ExpressionNode * expressionCast() override
FormalParameterList * formals
SourceLocation firstSourceLocation() const override
FunctionExpression * asFunctionDefinition() override
SourceLocation functionToken
SourceLocation lbraceToken
SourceLocation rbraceToken
TypeAnnotation * typeAnnotation
Statement * statementCast() override
static std::optional< QString > changedHandlerNameToPropertyName(QStringView handler)
static bool isHandlerName(QStringView signalName)
static std::optional< QString > handlerNameToSignalName(QStringView handler)
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
QList< QVariant > arguments
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
DBusConnection const char DBusError * error
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
GLuint GLsizei const GLchar * message
static void diagnose(const QString &message, QtMsgType type, const QQmlJS::SourceLocation &location, QQmlJS::DiagnosticMessage *error)
static QString bindingTypeDescription(QmlIR::Binding::Type type)
static QString asString(QQmlJS::AST::UiQualifiedId *node)