diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-09-30 13:11:23 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2021-10-05 12:53:14 +0200 |
commit | 478d0d5d33a7ae431c418440f1a4663e208dcd8a (patch) | |
tree | b5de498f83bef5b4a0a0e35757cd6527e65e7274 /tools/qmljsrootgen | |
parent | 1d014e772203a8d01cf2f63dd344c6eaf8fd7574 (diff) | |
download | qtdeclarative-478d0d5d33a7ae431c418440f1a4663e208dcd8a.tar.gz |
Amend JS root with more precise type information
Methods on the "Math" object preferably deal with numbers, and if we
pass them numbers, they also return numbers. Model this as overrides of
the generic methods.
Change-Id: I419093630577c371846e5c8ac153f90ed6ffa87e
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tools/qmljsrootgen')
-rw-r--r-- | tools/qmljsrootgen/main.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/tools/qmljsrootgen/main.cpp b/tools/qmljsrootgen/main.cpp index c721d79964..a356ea2801 100644 --- a/tools/qmljsrootgen/main.cpp +++ b/tools/qmljsrootgen/main.cpp @@ -115,6 +115,25 @@ static QString findClassName(const QJSManagedValue &value) return QString(); } +static QJsonValue createPublicNumberMethod(const QString &name, int numArguments) +{ + QJsonObject method; + method.insert(QStringLiteral("access"), QStringLiteral("public")); + method.insert(QStringLiteral("name"), name); + method.insert(QStringLiteral("returnType"), QStringLiteral("number")); + QJsonArray arguments; + // arguments look nicer when 1-based than 0-based. + for (int i = 1; i <= numArguments; ++i) { + QJsonObject argument; + argument.insert(QStringLiteral("name"), QStringLiteral("arg%1").arg(i)); + argument.insert(QStringLiteral("type"), QStringLiteral("number")); + arguments.append(argument); + } + method.insert(QStringLiteral("arguments"), arguments); + return method; + +} + static QString buildClass(const QJSManagedValue &value, QJsonArray *classes, State *seen, const QString &name) { @@ -202,6 +221,7 @@ static QString buildClass(const QJSManagedValue &value, QJsonArray *classes, methodObject.insert(QStringLiteral("access"), QStringLiteral("public")); methodObject.insert(QStringLiteral("name"), info.name); + const int formalParams = propFunction->getLength(); if (propFunction->isConstructor()) { methodObject.insert(QStringLiteral("isConstructor"), true); @@ -223,10 +243,17 @@ static QString buildClass(const QJSManagedValue &value, QJsonArray *classes, methodObject.insert( QStringLiteral("returnType"), buildConstructor(prop, classes, seen, ctorName)); + } else if (name == QStringLiteral("Math")) { + // All methods of Math return numbers when given numbers. + // We model this as overloads of the generic methods. + methods.append(createPublicNumberMethod(info.name, formalParams)); + + // If there is no formal parameter, it doesn't matter what you pass. + // You always get number back. + if (formalParams == 0) + continue; } - const int formalParams = propFunction->getLength(); - QJsonArray arguments; for (int i = 0; i < formalParams; i++) arguments.append(QJsonObject {}); |