aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmltyperegistrar/qmltyperegistrar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/qmltyperegistrar/qmltyperegistrar.cpp')
-rw-r--r--tools/qmltyperegistrar/qmltyperegistrar.cpp81
1 files changed, 64 insertions, 17 deletions
diff --git a/tools/qmltyperegistrar/qmltyperegistrar.cpp b/tools/qmltyperegistrar/qmltyperegistrar.cpp
index 5d895bbed7..937c8a356f 100644
--- a/tools/qmltyperegistrar/qmltyperegistrar.cpp
+++ b/tools/qmltyperegistrar/qmltyperegistrar.cpp
@@ -3,12 +3,14 @@
#include <QCoreApplication>
#include <QCommandLineParser>
+#include <QDir>
#include <QFile>
#include <QScopedPointer>
#include <cstdlib>
#include <QtQmlTypeRegistrar/private/qqmltyperegistrar_p.h>
+#include <QtQmlTypeRegistrar/private/qqmltyperegistrarutils_p.h>
using namespace Qt::Literals;
@@ -17,6 +19,11 @@ int main(int argc, char **argv)
// Produce reliably the same output for the same input by disabling QHash's random seeding.
QHashSeed::setDeterministicGlobalSeed();
+ // No, you are not supposed to mess with the message pattern.
+ // Qt Creator wants to read those messages as-is and we want the convenience
+ // of QDebug to print them.
+ qputenv("QT_MESSAGE_PATTERN", "%{if-category}%{category}: %{endif}%{message}");
+
QCoreApplication app(argc, argv);
QCoreApplication::setApplicationName(QStringLiteral("qmltyperegistrar"));
QCoreApplication::setApplicationVersion(QLatin1String(QT_VERSION_STR));
@@ -88,6 +95,13 @@ int main(int argc, char **argv)
"want to follow Qt's versioning scheme."));
parser.addOption(followForeignVersioningOption);
+ QCommandLineOption jsroot(QStringLiteral("jsroot"));
+ jsroot.setDescription(
+ QStringLiteral("Use the JavaScript root object's meta types as sole input and do not "
+ "generate any C++ output. Only useful in combination with "
+ "--generate-qmltypes"));
+ parser.addOption(jsroot);
+
QCommandLineOption extract(u"extract"_s);
extract.setDescription(
u"Extract QML types from a module and use QML_FOREIGN to register them"_s);
@@ -104,20 +118,43 @@ int main(int argc, char **argv)
const QString module = parser.value(importNameOption);
+ const QLatin1String jsrootMetaTypes
+ = QLatin1String(":/qt-project.org/meta_types/jsroot_metatypes.json");
+ QStringList files = parser.positionalArguments();
+ if (parser.isSet(jsroot)) {
+ if (parser.isSet(extract)) {
+ error(module) << "If --jsroot is passed, no type registrations can be extracted.";
+ return EXIT_FAILURE;
+ }
+ if (parser.isSet(outputOption)) {
+ error(module) << "If --jsroot is passed, no C++ output can be generated.";
+ return EXIT_FAILURE;
+ }
+ if (!files.isEmpty() || parser.isSet(foreignTypesOption)) {
+ error(module) << "If --jsroot is passed, no further metatypes can be processed.";
+ return EXIT_FAILURE;
+ }
+
+ files.append(jsrootMetaTypes);
+ }
+
MetaTypesJsonProcessor processor(parser.isSet(privateIncludesOption));
- if (!processor.processTypes(parser.positionalArguments()))
+ if (!processor.processTypes(files))
return EXIT_FAILURE;
processor.postProcessTypes();
- if (parser.isSet(foreignTypesOption))
- processor.processForeignTypes(parser.value(foreignTypesOption).split(QLatin1Char(',')));
+ if (!parser.isSet(jsroot)) {
+ processor.processForeignTypes(jsrootMetaTypes);
+ if (parser.isSet(foreignTypesOption))
+ processor.processForeignTypes(parser.value(foreignTypesOption).split(QLatin1Char(',')));
+ }
processor.postProcessForeignTypes();
if (parser.isSet(extract)) {
if (!parser.isSet(outputOption)) {
- fprintf(stderr, "Error: The output file name must be provided\n");
+ error(module) << "The output file name must be provided";
return EXIT_FAILURE;
}
QString baseName = parser.value(outputOption);
@@ -137,25 +174,35 @@ int main(int argc, char **argv)
parser.isSet(followForeignVersioningOption));
typeRegistrar.setTypes(processor.types(), processor.foreignTypes());
- if (parser.isSet(outputOption)) {
- // extract does its own file handling
- QString outputName = parser.value(outputOption);
- QFile file(outputName);
- if (!file.open(QIODeviceBase::WriteOnly)) {
- fprintf(stderr, "Error: Cannot open %s for writing\n", qPrintable(outputName));
- return EXIT_FAILURE;
+ if (!parser.isSet(jsroot)) {
+ if (module.isEmpty()) {
+ warning(module) << "The module name is empty. Cannot generate C++ code";
+ } else if (parser.isSet(outputOption)) {
+ // extract does its own file handling
+ QString outputName = parser.value(outputOption);
+ QFile file(outputName);
+ if (!file.open(QIODeviceBase::WriteOnly)) {
+ error(QDir::toNativeSeparators(outputName))
+ << "Cannot open file for writing:" << file.errorString();
+ return EXIT_FAILURE;
+ }
+ QTextStream output(&file);
+ typeRegistrar.write(output, outputName);
+ } else {
+ QTextStream output(stdout);
+ typeRegistrar.write(output, "stdout");
}
- QTextStream output(&file);
- typeRegistrar.write(output);
- } else {
- QTextStream output(stdout);
- typeRegistrar.write(output);
}
if (!parser.isSet(pluginTypesOption))
return EXIT_SUCCESS;
typeRegistrar.setReferencedTypes(processor.referencedTypes());
- typeRegistrar.generatePluginTypes(parser.value(pluginTypesOption));
+ typeRegistrar.setUsingDeclarations(processor.usingDeclarations());
+ const QString qmltypes = parser.value(pluginTypesOption);
+ if (!typeRegistrar.generatePluginTypes(qmltypes)) {
+ error(qmltypes) << "Cannot generate qmltypes file";
+ return EXIT_FAILURE;
+ }
return EXIT_SUCCESS;
}