summaryrefslogtreecommitdiff
path: root/tools/qmljsrootgen
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-09-30 13:11:23 +0200
committerUlf Hermann <ulf.hermann@qt.io>2021-10-05 12:53:14 +0200
commit478d0d5d33a7ae431c418440f1a4663e208dcd8a (patch)
treeb5de498f83bef5b4a0a0e35757cd6527e65e7274 /tools/qmljsrootgen
parent1d014e772203a8d01cf2f63dd344c6eaf8fd7574 (diff)
downloadqtdeclarative-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.cpp31
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 {});