diff options
author | Leander Beernaert <leander.beernaert@qt.io> | 2019-11-18 16:15:01 +0100 |
---|---|---|
committer | Leander Beernaert <leander.beernaert@qt.io> | 2019-11-25 15:34:40 +0100 |
commit | f1f395b37da163bce2dc3b5fc4e298bb4f56a3e7 (patch) | |
tree | 9ce2ba89a86ed754a8ecb8f52181770853e21a08 /tools | |
parent | ba494aaa24defe1401f621b791891e696b308756 (diff) | |
parent | 0ee087f5a5edd7d1aa39fd15e0dc85985320c09a (diff) |
Merge remote-tracking branch 'origin/dev' into wip/cmake
Change-Id: I48b9c2e4f3a75c18470c55f73f2089dc1401de54
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qmlcachegen/qmlcachegen.pro | 8 | ||||
-rw-r--r-- | tools/qmlimportscanner/main.cpp | 11 | ||||
-rw-r--r-- | tools/qmlimportscanner/qmlimportscanner.pro | 1 | ||||
-rw-r--r-- | tools/qmllint/findunqualified.cpp | 2 | ||||
-rw-r--r-- | tools/qmllint/main.cpp | 6 | ||||
-rw-r--r-- | tools/qmlmin/main.cpp | 2 | ||||
-rw-r--r-- | tools/qmlplugindump/main.cpp | 68 | ||||
-rw-r--r-- | tools/qmlplugindump/qmlplugindump.pro | 10 | ||||
-rw-r--r-- | tools/shared/qmlstreamwriter.cpp (renamed from tools/qmlplugindump/qmlstreamwriter.cpp) | 0 | ||||
-rw-r--r-- | tools/shared/qmlstreamwriter.h (renamed from tools/qmlplugindump/qmlstreamwriter.h) | 0 | ||||
-rw-r--r-- | tools/shared/resourcefilemapper.cpp (renamed from tools/qmlcachegen/resourcefilemapper.cpp) | 7 | ||||
-rw-r--r-- | tools/shared/resourcefilemapper.h (renamed from tools/qmlcachegen/resourcefilemapper.h) | 6 | ||||
-rw-r--r-- | tools/shared/shared.pri | 9 |
13 files changed, 83 insertions, 47 deletions
diff --git a/tools/qmlcachegen/qmlcachegen.pro b/tools/qmlcachegen/qmlcachegen.pro index bee0b9a37e..ec65cdb5e6 100644 --- a/tools/qmlcachegen/qmlcachegen.pro +++ b/tools/qmlcachegen/qmlcachegen.pro @@ -5,8 +5,10 @@ DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII SOURCES = qmlcachegen.cpp \ resourcefilter.cpp \ - generateloader.cpp \ - resourcefilemapper.cpp + generateloader.cpp + +include(../shared/shared.pri) + TARGET = qmlcachegen build_integration.files = qmlcache.prf qtquickcompiler.prf @@ -38,5 +40,3 @@ QMAKE_TARGET_DESCRIPTION = QML Cache Generator load(qt_tool) -HEADERS += \ - resourcefilemapper.h diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp index 6d48f6203d..c37910bdaf 100644 --- a/tools/qmlimportscanner/main.cpp +++ b/tools/qmlimportscanner/main.cpp @@ -49,6 +49,8 @@ #include <QtCore/QJsonDocument> #include <QtCore/QLibraryInfo> +#include <resourcefilemapper.h> + #include <iostream> #include <algorithm> @@ -80,7 +82,8 @@ void printUsage(const QString &appNameIn) #endif std::wcerr << "Usage: " << appName << " -rootPath path/to/app/qml/directory -importPath path/to/qt/qml/directory\n" - " " << appName << " -qmlFiles file1 file2 -importPath path/to/qt/qml/directory\n\n" + " " << appName << " -qmlFiles file1 file2 -importPath path/to/qt/qml/directory\n" + " " << appName << " -qrcFiles file1.qrc file2.qrc -importPath path/to/qt/qml/directory\n\n" "Example: " << appName << " -rootPath . -importPath " << QDir::toNativeSeparators(qmlPath).toStdWString() << '\n'; @@ -542,6 +545,7 @@ int main(int argc, char *argv[]) QStringList qmlRootPaths; QStringList scanFiles; QStringList qmlImportPaths; + QStringList qrcFiles; bool generateCmakeContent = false; int i = 1; @@ -569,6 +573,8 @@ int main(int argc, char *argv[]) argReceiver = &qmlImportPaths; } else if (arg == QLatin1String("-cmake-output")) { generateCmakeContent = true; + } else if (arg == QLatin1String("-qrcFiles")) { + argReceiver = &qrcFiles; } else { std::cerr << qPrintable(appName) << ": Invalid argument: \"" << qPrintable(arg) << "\"\n"; @@ -590,6 +596,9 @@ int main(int argc, char *argv[]) } } + if (!qrcFiles.isEmpty()) + scanFiles << ResourceFileMapper(qrcFiles).qmlCompilerFiles(ResourceFileMapper::FileOutput::AbsoluteFilePath); + g_qmlImportPaths = qmlImportPaths; // Find the imports! diff --git a/tools/qmlimportscanner/qmlimportscanner.pro b/tools/qmlimportscanner/qmlimportscanner.pro index a29b582274..d69f1a3b0b 100644 --- a/tools/qmlimportscanner/qmlimportscanner.pro +++ b/tools/qmlimportscanner/qmlimportscanner.pro @@ -4,6 +4,7 @@ QT = core qmldevtools-private DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII SOURCES += main.cpp +include(../shared/shared.pri) load(cmake_functions) diff --git a/tools/qmllint/findunqualified.cpp b/tools/qmllint/findunqualified.cpp index ee2a0c38c1..d72f02b94a 100644 --- a/tools/qmllint/findunqualified.cpp +++ b/tools/qmllint/findunqualified.cpp @@ -530,7 +530,7 @@ void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::Catch *) bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::WithStatement *withStatement) { m_colorOut.write(QString::asprintf("Warning: "), Warning); - m_colorOut.write(QString::asprintf("%d:%d: with statements are strongly discouraged in QML and might cause false positives when analying unqalified identifiers\n", withStatement->firstSourceLocation().startLine, withStatement->firstSourceLocation().startColumn), Normal); + m_colorOut.write(QString::asprintf("%d:%d: with statements are strongly discouraged in QML and might cause false positives when analysing unqalified identifiers\n", withStatement->firstSourceLocation().startLine, withStatement->firstSourceLocation().startColumn), Normal); enterEnvironment(ScopeType::JSLexicalScope, "with"); return true; } diff --git a/tools/qmllint/main.cpp b/tools/qmllint/main.cpp index 56f72dd020..232b31934e 100644 --- a/tools/qmllint/main.cpp +++ b/tools/qmllint/main.cpp @@ -62,11 +62,13 @@ static bool lint_file(const QString &filename, const bool silent, const bool war QQmlJS::Lexer lexer(&engine); QFileInfo info(filename); - bool isJavaScript = info.suffix().toLower() == QLatin1String("js"); + const QString lowerSuffix = info.suffix().toLower(); + const bool isJavaScript = (lowerSuffix == QLatin1String("js") || lowerSuffix == QLatin1String("mjs")); + const bool isESModule = lowerSuffix == QLatin1String("mjs"); lexer.setCode(code, /*line = */ 1, /*qmlMode=*/ !isJavaScript); QQmlJS::Parser parser(&engine); - bool success = isJavaScript ? parser.parseProgram() : parser.parse(); + bool success = isJavaScript ? (isESModule ? parser.parseModule() : parser.parseProgram()) : parser.parse(); if (!success && !silent) { const auto diagnosticMessages = parser.diagnosticMessages(); diff --git a/tools/qmlmin/main.cpp b/tools/qmlmin/main.cpp index 26833d2a08..3c9b3c7251 100644 --- a/tools/qmlmin/main.cpp +++ b/tools/qmlmin/main.cpp @@ -638,6 +638,8 @@ int runQmlmin(int argc, char *argv[]) return 0; } + std::cerr << "qmlmin: This tool is deprecated and will be removed in Qt 6. It is not needed anymore due to QtQml's built-in caching." << std::endl; + QFile file(fileName); if (! file.open(QFile::ReadOnly)) { std::cerr << "qmlmin: '" << qPrintable(fileName) << "' no such file or directory" << std::endl; diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index 5e999c557a..1556718471 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -380,23 +380,21 @@ public: relocatableModuleUri = uri; } - const QString getExportString(QString qmlTyName, int majorVersion, int minorVersion) + QString getExportString(const QQmlType &type, const QmlVersionInfo &versionInfo) { - if (qmlTyName.startsWith(relocatableModuleUri + QLatin1Char('/'))) { - qmlTyName.remove(0, relocatableModuleUri.size() + 1); - } - if (qmlTyName.startsWith("./")) { - qmlTyName.remove(0, 2); - } - if (qmlTyName.startsWith(QLatin1Char('/'))) { - qmlTyName.remove(0, 1); - } - const QString exportString = enquote( - QString("%1 %2.%3").arg( - qmlTyName, - QString::number(majorVersion), - QString::number(minorVersion))); - return exportString; + const QString module = type.module().isEmpty() ? versionInfo.pluginImportUri + : type.module(); + const int majorVersion = type.majorVersion() >= 0 ? type.majorVersion() + : versionInfo.majorVersion; + const int minorVersion = type.minorVersion() >= 0 ? type.minorVersion() + : versionInfo.minorVersion; + + const QString versionedElement = type.elementName() + + QString::fromLatin1(" %1.%2").arg(majorVersion).arg(minorVersion); + + return enquote((module == relocatableModuleUri) + ? versionedElement + : module + QLatin1Char('/') + versionedElement); } void writeMetaContent(const QMetaObject *meta, KnownAttributes *knownAttributes = nullptr) @@ -441,8 +439,9 @@ public: } } - QString getPrototypeNameForCompositeType(const QMetaObject *metaObject, QSet<QByteArray> &defaultReachableNames, - QList<const QMetaObject *> *objectsToMerge, const QmlVersionInfo &versionInfo) + QString getPrototypeNameForCompositeType( + const QMetaObject *metaObject, QList<const QMetaObject *> *objectsToMerge, + const QmlVersionInfo &versionInfo) { auto ty = QQmlMetaType::qmlType(metaObject); QString prototypeName; @@ -454,24 +453,28 @@ public: && !objectsToMerge->contains(metaObject)) objectsToMerge->append(metaObject); const QMetaObject *superMetaObject = metaObject->superClass(); - if (!superMetaObject) + if (!superMetaObject) { prototypeName = "QObject"; - else + } else { + QQmlType superType = QQmlMetaType::qmlType(superMetaObject); + if (superType.isValid() && !superType.isComposite()) + return convertToId(superMetaObject->className()); prototypeName = getPrototypeNameForCompositeType( - superMetaObject, defaultReachableNames, objectsToMerge, versionInfo); + superMetaObject, objectsToMerge, versionInfo); + } } else { prototypeName = convertToId(metaObject->className()); } return prototypeName; } - void dumpComposite(QQmlEngine *engine, const QList<QQmlType> &compositeType, QSet<QByteArray> &defaultReachableNames, const QmlVersionInfo &versionInfo) + void dumpComposite(QQmlEngine *engine, const QList<QQmlType> &compositeType, const QmlVersionInfo &versionInfo) { for (const QQmlType &type : compositeType) - dumpCompositeItem(engine, type, defaultReachableNames, versionInfo); + dumpCompositeItem(engine, type, versionInfo); } - void dumpCompositeItem(QQmlEngine *engine, const QQmlType &compositeType, QSet<QByteArray> &defaultReachableNames, const QmlVersionInfo &versionInfo) + void dumpCompositeItem(QQmlEngine *engine, const QQmlType &compositeType, const QmlVersionInfo &versionInfo) { QQmlComponent e(engine, compositeType.sourceUrl()); if (!e.isReady()) { @@ -492,13 +495,17 @@ public: QList<const QMetaObject *> objectsToMerge; KnownAttributes knownAttributes; // Get C++ base class name for the composite type - QString prototypeName = getPrototypeNameForCompositeType(mainMeta, defaultReachableNames, - &objectsToMerge, versionInfo); + QString prototypeName = getPrototypeNameForCompositeType(mainMeta, &objectsToMerge, + versionInfo); qml->writeScriptBinding(QLatin1String("prototype"), enquote(prototypeName)); QString qmlTyName = compositeType.qmlTypeName(); - const QString exportString = getExportString(qmlTyName, compositeType.majorVersion(), compositeType.minorVersion()); + const QString exportString = getExportString(compositeType, versionInfo); + + // TODO: why don't we simply output the compositeType.elementName() here? + // That would make more sense, but it would change the format quite a bit. qml->writeScriptBinding(QLatin1String("name"), exportString); + qml->writeArrayBinding(QLatin1String("exports"), QStringList() << exportString); qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() << QString::number(compositeType.minorVersion())); qml->writeBooleanBinding(QLatin1String("isComposite"), true); @@ -565,7 +572,7 @@ public: if (attachedType != meta) attachedTypeId = convertToId(attachedType); } - const QString exportString = getExportString(type.qmlTypeName(), type.majorVersion(), type.minorVersion()); + const QString exportString = getExportString(type, { QString(), -1, -1, false }); int metaObjectRevision = type.metaObjectRevision(); if (extendedObject) { // emulate custom metaobjectrevision out of import @@ -1239,9 +1246,6 @@ int main(int argc, char *argv[]) QSet<const QMetaObject *> uncreatableMetas; QSet<const QMetaObject *> singletonMetas; - // QQuickKeyEvent, QQuickPinchEvent, QQuickDropEvent are not exported - QSet<QByteArray> defaultReachableNames; - // this will hold the meta objects we want to dump information of QSet<const QMetaObject *> metas; @@ -1370,7 +1374,7 @@ int main(int argc, char *argv[]) QMap<QString, QList<QQmlType>>::const_iterator iter = compositeTypes.constBegin(); for (; iter != compositeTypes.constEnd(); ++iter) - dumper.dumpComposite(&engine, iter.value(), defaultReachableNames, info); + dumper.dumpComposite(&engine, iter.value(), info); // define QEasingCurve as an extension of QQmlEasingValueType, this way // properties using the QEasingCurve type get useful type information. diff --git a/tools/qmlplugindump/qmlplugindump.pro b/tools/qmlplugindump/qmlplugindump.pro index 62b08e9334..e374ae45f4 100644 --- a/tools/qmlplugindump/qmlplugindump.pro +++ b/tools/qmlplugindump/qmlplugindump.pro @@ -5,14 +5,16 @@ CONFIG += no_import_scan QTPLUGIN.platforms = qminimal +INCLUDEPATH += ../shared + SOURCES += \ main.cpp \ - qmlstreamwriter.cpp \ - qmltypereader.cpp + qmltypereader.cpp \ + ../shared/qmlstreamwriter.cpp HEADERS += \ - qmlstreamwriter.h \ - qmltypereader.h + qmltypereader.h \ + ../shared/qmlstreamwriter.h macx { # Prevent qmlplugindump from popping up in the dock when launched. diff --git a/tools/qmlplugindump/qmlstreamwriter.cpp b/tools/shared/qmlstreamwriter.cpp index b0fbc4e443..b0fbc4e443 100644 --- a/tools/qmlplugindump/qmlstreamwriter.cpp +++ b/tools/shared/qmlstreamwriter.cpp diff --git a/tools/qmlplugindump/qmlstreamwriter.h b/tools/shared/qmlstreamwriter.h index cb642159ea..cb642159ea 100644 --- a/tools/qmlplugindump/qmlstreamwriter.h +++ b/tools/shared/qmlstreamwriter.h diff --git a/tools/qmlcachegen/resourcefilemapper.cpp b/tools/shared/resourcefilemapper.cpp index 244874717f..b9cf463575 100644 --- a/tools/qmlcachegen/resourcefilemapper.cpp +++ b/tools/shared/resourcefilemapper.cpp @@ -58,7 +58,7 @@ QStringList ResourceFileMapper::resourcePaths(const QString &fileName) return resourcePaths; } -QStringList ResourceFileMapper::qmlCompilerFiles() const +QStringList ResourceFileMapper::qmlCompilerFiles(FileOutput fo) const { QStringList files; for (auto it = qrcPathToFileSystemPath.constBegin(), end = qrcPathToFileSystemPath.constEnd(); @@ -67,7 +67,10 @@ QStringList ResourceFileMapper::qmlCompilerFiles() const const QString suffix = QFileInfo(qrcPath).suffix(); if (suffix != QStringLiteral("qml") && suffix != QStringLiteral("js") && suffix != QStringLiteral("mjs")) continue; - files << qrcPath; + if (fo == FileOutput::AbsoluteFilePath) + files << it.value(); + else + files << qrcPath; } return files; } diff --git a/tools/qmlcachegen/resourcefilemapper.h b/tools/shared/resourcefilemapper.h index 2e0ab45171..ed3e486149 100644 --- a/tools/qmlcachegen/resourcefilemapper.h +++ b/tools/shared/resourcefilemapper.h @@ -34,12 +34,16 @@ struct ResourceFileMapper { + enum class FileOutput { + RelativeFilePath, + AbsoluteFilePath + }; ResourceFileMapper(const QStringList &resourceFiles); bool isEmpty() const; QStringList resourcePaths(const QString &fileName); - QStringList qmlCompilerFiles() const; + QStringList qmlCompilerFiles(FileOutput fo = FileOutput::RelativeFilePath) const; private: void populateFromQrcFile(QFile &file); diff --git a/tools/shared/shared.pri b/tools/shared/shared.pri new file mode 100644 index 0000000000..1438c3b3da --- /dev/null +++ b/tools/shared/shared.pri @@ -0,0 +1,9 @@ +INCLUDEPATH += $$PWD + +SOURCES += \ + $$PWD/resourcefilemapper.cpp \ + $$PWD/qmlstreamwriter.cpp + +HEADERS += \ + $$PWD/resourcefilemapper.h \ + $$PWD/qmlstreamwriter.h |