diff options
Diffstat (limited to 'src/tools')
28 files changed, 532 insertions, 410 deletions
diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 3dc539707a..5a263d17d5 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -93,7 +93,6 @@ struct Options , internalSf(false) , sectionsOnly(false) , protectedAuthenticationPath(false) - , jarSigner(false) , installApk(false) , uninstallApk(false) , qmlImportScannerBinaryPath() @@ -191,7 +190,6 @@ struct Options bool internalSf; bool sectionsOnly; bool protectedAuthenticationPath; - bool jarSigner; QString apkPath; // Installation information @@ -218,6 +216,7 @@ struct Options // Override qml import scanner path QString qmlImportScannerBinaryPath; + bool qmlSkipImportScanning = false; }; static const QHash<QByteArray, QByteArray> elfArchitectures = { @@ -359,7 +358,6 @@ Options parseOptions() } else if (argument.compare("--aab"_L1, Qt::CaseInsensitive) == 0) { options.buildAAB = true; options.build = true; - options.jarSigner = true; } else if (!options.buildAAB && argument.compare("--no-build"_L1, Qt::CaseInsensitive) == 0) { options.build = false; } else if (argument.compare("--install"_L1, Qt::CaseInsensitive) == 0) { @@ -425,6 +423,7 @@ Options parseOptions() const QString storeAlias = qEnvironmentVariable("QT_ANDROID_KEYSTORE_ALIAS"); if (keyStore.isEmpty() || storeAlias.isEmpty()) { options.helpRequested = true; + fprintf(stderr, "Package signing path and alias values are not specified.\n"); } else { fprintf(stdout, "Using package signing path and alias values found from the " @@ -433,10 +432,15 @@ Options parseOptions() options.keyStore = keyStore; options.keyStoreAlias = storeAlias; } - } else { + } else if (!arguments.at(i + 1).startsWith("--"_L1) && + !arguments.at(i + 2).startsWith("--"_L1)) { options.releasePackage = true; options.keyStore = arguments.at(++i); options.keyStoreAlias = arguments.at(++i); + } else { + options.helpRequested = true; + fprintf(stderr, "Package signing path and alias values are not " + "specified.\n"); } // Do not override if the passwords are provided through arguments @@ -496,8 +500,6 @@ Options parseOptions() options.sectionsOnly = true; } else if (argument.compare("--protected"_L1, Qt::CaseInsensitive) == 0) { options.protectedAuthenticationPath = true; - } else if (argument.compare("--jarsigner"_L1, Qt::CaseInsensitive) == 0) { - options.jarSigner = true; } else if (argument.compare("--aux-mode"_L1, Qt::CaseInsensitive) == 0) { options.auxMode = true; } else if (argument.compare("--qml-importscanner-binary"_L1, Qt::CaseInsensitive) == 0) { @@ -590,8 +592,7 @@ void printHelp() " --internalsf: Include the .SF file inside the signature block.\n" " --sectionsonly: Don't compute hash of entire manifest.\n" " --protected: Keystore has protected authentication path.\n" - " --jarsigner: Force jarsigner usage, otherwise apksigner will be\n" - " used if available.\n" + " --jarsigner: Deprecated, ignored.\n" "\n" " NOTE: To conceal the keystore information, the environment variables\n" " QT_ANDROID_KEYSTORE_PATH, and QT_ANDROID_KEYSTORE_ALIAS are used to\n" @@ -651,10 +652,10 @@ bool quasiLexicographicalReverseLessThan(const QFileInfo &fi1, const QFileInfo & QString s1 = fi1.baseName(); QString s2 = fi2.baseName(); - if (s1.length() == s2.length()) + if (s1.size() == s2.size()) return s1 > s2; else - return s1.length() > s2.length(); + return s1.size() > s2.size(); } // Files which contain templates that need to be overwritten by build data should be overwritten every @@ -744,10 +745,10 @@ QString cleanPackageName(QString packageName) // No keywords qsizetype index = -1; - while (index < packageName.length()) { + while (index < packageName.size()) { qsizetype next = packageName.indexOf(u'.', index + 1); if (next == -1) - next = packageName.length(); + next = packageName.size(); QString word = packageName.mid(index + 1, next - index - 1); if (!word.isEmpty()) { QChar c = word[0]; @@ -1033,6 +1034,12 @@ bool readInputFile(Options *options) } { + const QJsonValue qmlSkipImportScanning = jsonObject.value("qml-skip-import-scanning"_L1); + if (!qmlSkipImportScanning.isUndefined()) + options->qmlSkipImportScanning = qmlSkipImportScanning.toBool(); + } + + { const QJsonValue extraPlugins = jsonObject.value("android-extra-plugins"_L1); if (!extraPlugins.isUndefined()) options->extraPlugins = extraPlugins.toString().split(u','); @@ -1132,7 +1139,7 @@ bool readInputFile(Options *options) QString subPath = iterator.filePath(); auto arch = fileArchitecture(*options, subPath); if (!arch.isEmpty()) { - options->qtDependencies[arch].append(QtDependency(subPath.mid(options->qtInstallDirectory.length() + 1), + options->qtDependencies[arch].append(QtDependency(subPath.mid(options->qtInstallDirectory.size() + 1), subPath)); } else if (options->verbose) { fprintf(stderr, "Skipping \"%s\", unknown architecture\n", qPrintable(subPath)); @@ -1406,7 +1413,7 @@ bool updateFile(const QString &fileName, const QHash<QString, QString> &replacem forever { int index = contents.indexOf(it.key().toUtf8()); if (index >= 0) { - contents.replace(index, it.key().length(), it.value().toUtf8()); + contents.replace(index, it.key().size(), it.value().toUtf8()); hasReplacements = true; } else { break; @@ -1489,15 +1496,9 @@ bool updateLibsXml(Options *options) if (localLibs.isEmpty()) { QString plugin; for (const QtDependency &qtDependency : options->qtDependencies[it.key()]) { - if (qtDependency.relativePath.endsWith("libqtforandroid.so"_L1) - || qtDependency.relativePath.endsWith("libqtforandroidGL.so"_L1)) { - if (!plugin.isEmpty() && plugin != qtDependency.relativePath) { - fprintf(stderr, "Both platform plugins libqtforandroid.so and libqtforandroidGL.so included in package. Please include only one.\n"); - return false; - } - + if (qtDependency.relativePath.endsWith("libqtforandroid.so"_L1)) plugin = qtDependency.relativePath; - } + if (qtDependency.relativePath.contains( QString::asprintf("libQt%dOpenGL", QT_VERSION_MAJOR)) || qtDependency.relativePath.contains( @@ -1509,7 +1510,8 @@ bool updateLibsXml(Options *options) if (plugin.isEmpty()) { fflush(stdout); - fprintf(stderr, "No platform plugin, neither libqtforandroid.so or libqtforandroidGL.so, included in package. Please include one.\n"); + fprintf(stderr, "No platform plugin (libqtforandroid.so) included in " + "the deployment. Make sure the app links to Qt Gui library.\n"); fflush(stderr); return false; } @@ -1592,12 +1594,12 @@ bool updateAndroidManifest(Options &options) replacements[QStringLiteral("package=\"org.qtproject.example\"")] = "package=\"%1\""_L1.arg(options.packageName); QString permissions; - for (const QString &permission : qAsConst(options.permissions)) + for (const QString &permission : std::as_const(options.permissions)) permissions += " <uses-permission android:name=\"%1\" />\n"_L1.arg(permission); replacements[QStringLiteral("<!-- %%INSERT_PERMISSIONS -->")] = permissions.trimmed(); QString features; - for (const QString &feature : qAsConst(options.features)) + for (const QString &feature : std::as_const(options.features)) features += " <uses-feature android:name=\"%1\" android:required=\"false\" />\n"_L1.arg(feature); if (options.usesOpenGL) features += " <uses-feature android:glEsVersion=\"0x00020000\" android:required=\"true\" />"_L1; @@ -1720,7 +1722,7 @@ QList<QtDependency> findFilesRecursively(const Options &options, const QFileInfo return ret; } else { - return QList<QtDependency>() << QtDependency(info.absoluteFilePath().mid(rootPath.length()), info.absoluteFilePath()); + return QList<QtDependency>() << QtDependency(info.absoluteFilePath().mid(rootPath.size()), info.absoluteFilePath()); } } @@ -1918,7 +1920,7 @@ bool readDependenciesFromElf(Options *options, dependenciesToCheck.append(dependency); } - for (const QString &dependency : qAsConst(dependenciesToCheck)) { + for (const QString &dependency : std::as_const(dependenciesToCheck)) { QString qtBaseName = dependency.mid(sizeof("lib/lib") - 1); qtBaseName = qtBaseName.left(qtBaseName.size() - (sizeof(".so") - 1)); if (!readAndroidDependencyXml(options, qtBaseName, usedDependencies, remainingDependencies)) { @@ -1931,7 +1933,7 @@ bool readDependenciesFromElf(Options *options, bool goodToCopy(const Options *options, const QString &file, QStringList *unmetDependencies); bool checkCanImportFromRootPaths(const Options *options, const QString &absolutePath, - const QUrl &moduleUrl); + const QString &moduleUrlPath); bool scanImports(Options *options, QSet<QString> *usedDependencies) { @@ -1963,7 +1965,7 @@ bool scanImports(Options *options, QSet<QString> *usedDependencies) importPaths += shellQuote(prefix + "/qml"_L1); // These are provided by both CMake and qmake. - for (const QString &qmlImportPath : qAsConst(options->qmlImportPaths)) { + for (const QString &qmlImportPath : std::as_const(options->qmlImportPaths)) { if (QFile::exists(qmlImportPath)) { importPaths += shellQuote(qmlImportPath); } else { @@ -2071,21 +2073,17 @@ bool scanImports(Options *options, QSet<QString> *usedDependencies) const QUrl url(object.value("name"_L1).toString()); - if (checkCanImportFromRootPaths(options, info.absolutePath(), url)) { + const QString moduleUrlPath = u"/"_s + url.toString().replace(u'.', u'/'); + if (checkCanImportFromRootPaths(options, info.absolutePath(), moduleUrlPath)) { if (options->verbose) fprintf(stdout, " -- Skipping because path is in QML root path.\n"); continue; } QString importPathOfThisImport; - for (const QString &importPath : qAsConst(importPaths)) { -#if defined(Q_OS_WIN32) - Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive; -#else - Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive; -#endif + for (const QString &importPath : std::as_const(importPaths)) { QString cleanImportPath = QDir::cleanPath(importPath); - if (info.absoluteFilePath().startsWith(cleanImportPath, caseSensitivity)) { + if (QFile::exists(cleanImportPath + moduleUrlPath)) { importPathOfThisImport = importPath; break; } @@ -2164,11 +2162,10 @@ bool scanImports(Options *options, QSet<QString> *usedDependencies) } bool checkCanImportFromRootPaths(const Options *options, const QString &absolutePath, - const QUrl &moduleUrl) + const QString &moduleUrlPath) { - const QString pathFromUrl = u"/"_s + moduleUrl.toString().replace(u'.', u'/'); for (auto rootPath : options->rootPaths) { - if ((rootPath + pathFromUrl) == absolutePath) + if ((rootPath + moduleUrlPath) == absolutePath) return true; } return false; @@ -2298,11 +2295,10 @@ bool readDependencies(Options *options) } } - if ((!options->rootPaths.empty() || options->qrcFiles.isEmpty()) && - !scanImports(options, &usedDependencies)) - return false; - - return true; + if (options->qmlSkipImportScanning + || (options->rootPaths.empty() && options->qrcFiles.isEmpty())) + return true; + return scanImports(options, &usedDependencies); } bool containsApplicationBinary(Options *options) @@ -2402,7 +2398,7 @@ bool copyQtFiles(Options *options) // Copy other Qt dependencies auto assetsDestinationDirectory = "assets/android_rcc_bundle/"_L1; - for (const QtDependency &qtDependency : qAsConst(options->qtDependencies[options->currentArchitecture])) { + for (const QtDependency &qtDependency : std::as_const(options->qtDependencies[options->currentArchitecture])) { QString sourceFileName = qtDependency.absolutePath; QString destinationFileName; bool isSharedLibrary = qtDependency.relativePath.endsWith(".so"_L1); @@ -2579,6 +2575,24 @@ void checkAndWarnGradleLongPaths(const QString &outputDirectory) } #endif +bool gradleSetsLegacyPackagingProperty(const QString &path) +{ + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) + return false; + + const auto lines = file.readAll().split('\n'); + for (const auto &line : lines) { + if (line.contains("useLegacyPackaging")) { + const auto trimmed = line.trimmed(); + if (!trimmed.startsWith("//") && !trimmed.startsWith('*') && !trimmed.startsWith("/*")) + return true; + } + } + + return false; +} + bool buildAndroidProject(const Options &options) { GradleProperties localProperties; @@ -2587,9 +2601,13 @@ bool buildAndroidProject(const Options &options) if (!mergeGradleProperties(localPropertiesPath, localProperties)) return false; - QString gradlePropertiesPath = options.outputDirectory + "gradle.properties"_L1; + const QString gradlePropertiesPath = options.outputDirectory + "gradle.properties"_L1; GradleProperties gradleProperties = readGradleProperties(gradlePropertiesPath); - gradleProperties["android.bundle.enableUncompressedNativeLibs"] = "false"; + + const QString gradleBuildFilePath = options.outputDirectory + "build.gradle"_L1; + if (!gradleSetsLegacyPackagingProperty(gradleBuildFilePath)) + gradleProperties["android.bundle.enableUncompressedNativeLibs"] = "false"; + gradleProperties["buildDir"] = "build"; gradleProperties["qtAndroidDir"] = (options.qtInstallDirectory + "/src/android/java"_L1).toUtf8(); // The following property "qt5AndroidDir" is only for compatibility. @@ -2814,7 +2832,7 @@ static QString zipalignPath(const Options &options, bool *ok) return zipAlignTool; } -bool jarSignerSignPackage(const Options &options) +bool signAAB(const Options &options) { if (options.verbose) fprintf(stdout, "Signing Android package.\n"); @@ -2868,7 +2886,7 @@ bool jarSignerSignPackage(const Options &options) if (options.protectedAuthenticationPath) jarSignerTool += " -protected"_L1; - auto signPackage = [&](const QString &file) { + auto jarSignPackage = [&](const QString &file) { fprintf(stdout, "Signing file %s\n", qPrintable(file)); fflush(stdout); QString command = jarSignerTool + " %1 %2"_L1.arg(shellQuote(file)) @@ -2896,49 +2914,15 @@ bool jarSignerSignPackage(const Options &options) return true; }; - if (!signPackage(packagePath(options, UnsignedAPK))) - return false; - if (options.buildAAB && !signPackage(packagePath(options, AAB))) - return false; - - bool ok; - QString zipAlignTool = zipalignPath(options, &ok); - if (!ok) + if (options.buildAAB && !jarSignPackage(packagePath(options, AAB))) return false; - - zipAlignTool = "%1%2 -f 4 %3 %4"_L1.arg(shellQuote(zipAlignTool), - options.verbose ? " -v"_L1 : QLatin1StringView(), - shellQuote(packagePath(options, UnsignedAPK)), - shellQuote(packagePath(options, SignedAPK))); - - FILE *zipAlignCommand = openProcess(zipAlignTool); - if (zipAlignCommand == 0) { - fprintf(stderr, "Couldn't run zipalign.\n"); - return false; - } - - char buffer[512]; - while (fgets(buffer, sizeof(buffer), zipAlignCommand) != 0) - fprintf(stdout, "%s", buffer); - - int errorCode = pclose(zipAlignCommand); - if (errorCode != 0) { - fprintf(stderr, "zipalign command failed.\n"); - if (!options.verbose) - fprintf(stderr, " -- Run with --verbose for more information.\n"); - return false; - } - - return QFile::remove(packagePath(options, UnsignedAPK)); + return true; } bool signPackage(const Options &options) { const QString apksignerTool = batSuffixAppended(options.sdkPath + "/build-tools/"_L1 + options.sdkBuildToolsVersion + "/apksigner"_L1); - if (options.jarSigner || !QFile::exists(apksignerTool)) - return jarSignerSignPackage(options); - // APKs signed with apksigner must not be changed after they're signed, // therefore we need to zipalign it before we sign it. @@ -3043,6 +3027,9 @@ bool signPackage(const Options &options) "%1 verify --verbose %2"_L1 .arg(shellQuote(apksignerTool), shellQuote(packagePath(options, SignedAPK))); + if (options.buildAAB && !signAAB(options)) + return false; + // Verify the package and remove the unsigned apk return apkSignerRunner(apkVerifyCommand, true) && QFile::remove(packagePath(options, UnsignedAPK)); } diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index 489560a3e0..a5e249affc 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -313,7 +313,7 @@ static bool parseTestArgs() QString file; QString logType; - QString unhandledArgs; + QStringList unhandledArgs; for (int i = 0; i < g_options.testArgsList.size(); ++i) { const QString &arg = g_options.testArgsList[i].trimmed(); if (arg == QStringLiteral("--")) @@ -335,7 +335,7 @@ static bool parseTestArgs() if (match.hasMatch()) { logType = match.capturedTexts().at(1); } else { - unhandledArgs += QStringLiteral(" %1").arg(arg); + unhandledArgs << QStringLiteral(" \\\"%1\\\"").arg(arg); } } } @@ -345,10 +345,13 @@ static bool parseTestArgs() for (const auto &format : g_options.outFiles.keys()) g_options.testArgs += QStringLiteral(" -o output.%1,%1").arg(format); - g_options.testArgs += unhandledArgs; - g_options.testArgs = QStringLiteral("shell am start -e applicationArguments \\\"%1\\\" -n %2/%3").arg(shellQuote(g_options.testArgs.trimmed()), - g_options.package, - g_options.activity); + g_options.testArgs += unhandledArgs.join(u' '); + + g_options.testArgs = QStringLiteral("shell am start -e applicationArguments \"%1\" -n %2/%3") + .arg(shellQuote(g_options.testArgs.trimmed())) + .arg(g_options.package) + .arg(g_options.activity); + return true; } diff --git a/src/tools/configure.cmake b/src/tools/configure.cmake index 86b9fa7000..aab76ea2e8 100644 --- a/src/tools/configure.cmake +++ b/src/tools/configure.cmake @@ -2,7 +2,7 @@ qt_feature("androiddeployqt" PRIVATE SECTION "Deployment" LABEL "Android deployment tool" PURPOSE "The Android deployment tool automates the process of creating Android packages." - CONDITION NOT CMAKE_CROSSCOMPILING AND QT_FEATURE_regularexpression) + CONDITION NOT CMAKE_CROSSCOMPILING AND QT_FEATURE_regularexpression AND QT_FEATURE_settings) qt_feature("macdeployqt" PRIVATE SECTION "Deployment" diff --git a/src/tools/macdeployqt/shared/shared.cpp b/src/tools/macdeployqt/shared/shared.cpp index fa22b47067..643fe5390a 100644 --- a/src/tools/macdeployqt/shared/shared.cpp +++ b/src/tools/macdeployqt/shared/shared.cpp @@ -161,7 +161,7 @@ OtoolInfo findDependencyInfo(const QString &binaryPath) static const QRegularExpression regexp(QStringLiteral( "^\\t(.+) \\(compatibility version (\\d+\\.\\d+\\.\\d+), " - "current version (\\d+\\.\\d+\\.\\d+)(, weak)?\\)$")); + "current version (\\d+\\.\\d+\\.\\d+)(, weak|, reexport)?\\)$")); QString output = otool.readAllStandardOutput(); QStringList outputLines = output.split("\n", Qt::SkipEmptyParts); @@ -627,7 +627,8 @@ QStringList getBinaryDependencies(const QString executablePath, } // copies everything _inside_ sourcePath to destinationPath -bool recursiveCopy(const QString &sourcePath, const QString &destinationPath) +bool recursiveCopy(const QString &sourcePath, const QString &destinationPath, + const QRegularExpression &ignoreRegExp = QRegularExpression()) { if (!QDir(sourcePath).exists()) return false; @@ -636,7 +637,10 @@ bool recursiveCopy(const QString &sourcePath, const QString &destinationPath) LogNormal() << "copy:" << sourcePath << destinationPath; QStringList files = QDir(sourcePath).entryList(QStringList() << "*", QDir::Files | QDir::NoDotAndDotDot); - for (const QString &file : files) { + const bool hasValidRegExp = ignoreRegExp.isValid() && ignoreRegExp.pattern().length() > 0; + foreach (QString file, files) { + if (hasValidRegExp && ignoreRegExp.match(file).hasMatch()) + continue; const QString fileSourcePath = sourcePath + "/" + file; const QString fileDestinationPath = destinationPath + "/" + file; copyFilePrintStatus(fileSourcePath, fileDestinationPath); @@ -768,14 +772,16 @@ QString copyFramework(const FrameworkInfo &framework, const QString path) // Copy Resources/, Libraries/ and Helpers/ const QString resourcesSourcePath = framework.frameworkPath + "/Resources"; - const QString resourcesDestianationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Resources"; - recursiveCopy(resourcesSourcePath, resourcesDestianationPath); + const QString resourcesDestinationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Resources"; + // Ignore *.prl files that are in the Resources directory + recursiveCopy(resourcesSourcePath, resourcesDestinationPath, + QRegularExpression("\\A(?:[^/]*\\.prl)\\z")); const QString librariesSourcePath = framework.frameworkPath + "/Libraries"; - const QString librariesDestianationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Libraries"; - bool createdLibraries = recursiveCopy(librariesSourcePath, librariesDestianationPath); + const QString librariesDestinationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Libraries"; + bool createdLibraries = recursiveCopy(librariesSourcePath, librariesDestinationPath); const QString helpersSourcePath = framework.frameworkPath + "/Helpers"; - const QString helpersDestianationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Helpers"; - bool createdHelpers = recursiveCopy(helpersSourcePath, helpersDestianationPath); + const QString helpersDestinationPath = frameworkDestinationDirectory + "/Versions/" + framework.version + "/Helpers"; + bool createdHelpers = recursiveCopy(helpersSourcePath, helpersDestinationPath); // Create symlink structure. Links at the framework root point to Versions/Current/ // which again points to the actual version: @@ -868,7 +874,8 @@ void deployRPaths(const QString &bundlePath, const QList<QString> &rpaths, const continue; } if (rpaths.contains(resolveDyldPrefix(rpath, binaryPath, binaryPath))) { - args << "-delete_rpath" << rpath; + if (!args.contains(rpath)) + args << "-delete_rpath" << rpath; } } if (!args.length()) { @@ -1100,8 +1107,10 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl const QString libInfix = getLibInfix(deploymentInfo.deployedFrameworks); // Network - if (deploymentInfo.containsModule("Network", libInfix)) + if (deploymentInfo.containsModule("Network", libInfix)) { addPlugins(QStringLiteral("tls")); + addPlugins(QStringLiteral("networkinformation")); + } // All image formats (svg if QtSvg is used) const bool usesSvg = deploymentInfo.containsModule("Svg", libInfix); @@ -1152,7 +1161,7 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl } static const std::map<QString, std::vector<QString>> map { - {QStringLiteral("Multimedia"), {QStringLiteral("mediaservice"), QStringLiteral("audio")}}, + {QStringLiteral("Multimedia"), {QStringLiteral("multimedia")}}, {QStringLiteral("3DRender"), {QStringLiteral("sceneparsers"), QStringLiteral("geometryloaders"), QStringLiteral("renderers")}}, {QStringLiteral("3DQuickRender"), {QStringLiteral("renderplugins")}}, {QStringLiteral("Positioning"), {QStringLiteral("position")}}, diff --git a/src/tools/moc/collectjson.cpp b/src/tools/moc/collectjson.cpp index c0a4b64d7e..d542e2abc4 100644 --- a/src/tools/moc/collectjson.cpp +++ b/src/tools/moc/collectjson.cpp @@ -60,7 +60,7 @@ int collectJson(const QStringList &jsonFiles, const QString &outputFile, bool sk QStringList jsonFilesSorted = jsonFiles; jsonFilesSorted.sort(); - for (const QString &jsonFile : qAsConst(jsonFilesSorted)) { + for (const QString &jsonFile : std::as_const(jsonFilesSorted)) { QFile f(jsonFile); if (!f.open(QIODevice::ReadOnly)) { fprintf(stderr, "Error opening %s for reading\n", qPrintable(jsonFile)); diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index e6d89d1082..c8e7c5dd27 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -72,23 +72,23 @@ QT_FOR_EACH_STATIC_TYPE(RETURN_METATYPENAME_STRING) static inline int lengthOfEscapeSequence(const QByteArray &s, int i) { - if (s.at(i) != '\\' || i >= s.length() - 1) + if (s.at(i) != '\\' || i >= s.size() - 1) return 1; const int startPos = i; ++i; char ch = s.at(i); if (ch == 'x') { ++i; - while (i < s.length() && is_hex_char(s.at(i))) + while (i < s.size() && is_hex_char(s.at(i))) ++i; } else if (is_octal_char(ch)) { while (i < startPos + 4 - && i < s.length() + && i < s.size() && is_octal_char(s.at(i))) { ++i; } } else { // single character escape sequence - i = qMin(i + 1, s.length()); + i = qMin(i + 1, s.size()); } return i - startPos; } @@ -96,14 +96,14 @@ static inline int lengthOfEscapeSequence(const QByteArray &s, int i) static inline uint lengthOfEscapedString(const QByteArray &str) { int extra = 0; - for (int j = 0; j < str.length(); ++j) { + for (int j = 0; j < str.size(); ++j) { if (str.at(j) == '\\') { int cnt = lengthOfEscapeSequence(str, j) - 1; extra += cnt; j += cnt; } } - return str.length() - extra; + return str.size() - extra; } // Prints \a s to \a out, breaking it into lines of at most ColumnWidth. The @@ -111,7 +111,7 @@ static inline uint lengthOfEscapedString(const QByteArray &str) static void printStringWithIndentation(FILE *out, const QByteArray &s) { static constexpr int ColumnWidth = 72; - int len = s.length(); + int len = s.size(); int idx = 0; do { @@ -146,8 +146,8 @@ int Generator::stridx(const QByteArray &s) static int aggregateParameterCount(const QList<FunctionDef> &list) { int sum = 0; - for (int i = 0; i < list.count(); ++i) - sum += list.at(i).arguments.count() + 1; // +1 for return type + for (int i = 0; i < list.size(); ++i) + sum += list.at(i).arguments.size() + 1; // +1 for return type return sum; } @@ -218,7 +218,7 @@ void Generator::generateCode() // filter out undeclared enumerators and sets { QList<EnumDef> enumList; - for (int i = 0; i < cdef->enumList.count(); ++i) { + for (int i = 0; i < cdef->enumList.size(); ++i) { EnumDef def = cdef->enumList.at(i); if (cdef->enumDeclarations.contains(def.name)) { enumList += def; @@ -280,7 +280,7 @@ void Generator::generateCode() int idx = 0; for (int i = 0; i < strings.size(); ++i) { const QByteArray &str = strings.at(i); - const QByteArray comment = str.length() > 32 ? str.left(29) + "..." : str; + const QByteArray comment = str.size() > 32 ? str.left(29) + "..." : str; const char *comma = (i != strings.size() - 1 ? "," : " "); int len = lengthOfEscapedString(str); fprintf(out, "\n QT_MOC_LITERAL(%d, %d)%s // \"%s\"", idx, len, comma, @@ -294,7 +294,7 @@ void Generator::generateCode() // // Build stringdata arrays // - for (const QByteArray &s : qAsConst(strings)) { + for (const QByteArray &s : std::as_const(strings)) { fputc(',', out); printStringWithIndentation(out, s); } @@ -314,10 +314,10 @@ void Generator::generateCode() fprintf(out, "\n // content:\n"); fprintf(out, " %4d, // revision\n", int(QMetaObjectPrivate::OutputRevision)); fprintf(out, " %4d, // classname\n", stridx(cdef->qualified)); - fprintf(out, " %4d, %4d, // classinfo\n", int(cdef->classInfoList.count()), int(cdef->classInfoList.count() ? index : 0)); - index += cdef->classInfoList.count() * 2; + fprintf(out, " %4d, %4d, // classinfo\n", int(cdef->classInfoList.size()), int(cdef->classInfoList.size() ? index : 0)); + index += cdef->classInfoList.size() * 2; - int methodCount = cdef->signalList.count() + cdef->slotList.count() + cdef->methodList.count(); + int methodCount = cdef->signalList.size() + cdef->slotList.size() + cdef->methodList.size(); fprintf(out, " %4d, %4d, // methods\n", methodCount, methodCount ? index : 0); index += methodCount * QMetaObjectPrivate::IntsPerMethod; if (cdef->revisionedMethods) @@ -329,16 +329,16 @@ void Generator::generateCode() + aggregateParameterCount(cdef->constructorList); index += totalParameterCount * 2 // types and parameter names - methodCount // return "parameters" don't have names - - cdef->constructorList.count(); // "this" parameters don't have names + - cdef->constructorList.size(); // "this" parameters don't have names - fprintf(out, " %4d, %4d, // properties\n", int(cdef->propertyList.count()), int(cdef->propertyList.count() ? index : 0)); - index += cdef->propertyList.count() * QMetaObjectPrivate::IntsPerProperty; - fprintf(out, " %4d, %4d, // enums/sets\n", int(cdef->enumList.count()), cdef->enumList.count() ? index : 0); + fprintf(out, " %4d, %4d, // properties\n", int(cdef->propertyList.size()), int(cdef->propertyList.size() ? index : 0)); + index += cdef->propertyList.size() * QMetaObjectPrivate::IntsPerProperty; + fprintf(out, " %4d, %4d, // enums/sets\n", int(cdef->enumList.size()), cdef->enumList.size() ? index : 0); int enumsIndex = index; - for (int i = 0; i < cdef->enumList.count(); ++i) - index += 5 + (cdef->enumList.at(i).values.count() * 2); - fprintf(out, " %4d, %4d, // constructors\n", isConstructible ? int(cdef->constructorList.count()) : 0, + for (int i = 0; i < cdef->enumList.size(); ++i) + index += 5 + (cdef->enumList.at(i).values.size() * 2); + fprintf(out, " %4d, %4d, // constructors\n", isConstructible ? int(cdef->constructorList.size()) : 0, isConstructible ? index : 0); int flags = 0; @@ -348,7 +348,7 @@ void Generator::generateCode() flags |= PropertyAccessInStaticMetaCall; } fprintf(out, " %4d, // flags\n", flags); - fprintf(out, " %4d, // signalCount\n", int(cdef->signalList.count())); + fprintf(out, " %4d, // signalCount\n", int(cdef->signalList.size())); // @@ -357,7 +357,7 @@ void Generator::generateCode() generateClassInfos(); // all property metatypes, + 1 for the type of the current class itself - int initialMetaTypeOffset = cdef->propertyList.count() + 1; + int initialMetaTypeOffset = cdef->propertyList.size() + 1; // // Build signals array first, otherwise the signal indices would be wrong @@ -420,7 +420,7 @@ void Generator::generateCode() QMultiHash<QByteArray, QByteArray> knownExtraMetaObject(knownGadgets); knownExtraMetaObject.unite(knownQObjectClasses); - for (int i = 0; i < cdef->propertyList.count(); ++i) { + for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); if (isBuiltinType(p.type)) continue; @@ -480,7 +480,7 @@ void Generator::generateCode() if (!extraList.isEmpty()) { fprintf(out, "Q_CONSTINIT static const QMetaObject::SuperData qt_meta_extradata_%s[] = {\n", qualifiedClassNameIdentifier.constData()); - for (int i = 0; i < extraList.count(); ++i) { + for (int i = 0; i < extraList.size(); ++i) { fprintf(out, " QMetaObject::SuperData::link<%s::staticMetaObject>(),\n", extraList.at(i).constData()); } fprintf(out, " nullptr\n};\n\n"); @@ -528,7 +528,7 @@ void Generator::generateCode() fprintf(out, " qt_metaTypeArray<"); } // metatypes for properties - for (int i = 0; i < cdef->propertyList.count(); ++i) { + for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); fprintf(out, "%s\n // property '%s'\n %s", comma, p.name.constData(), stringForType(p.type, true).constData()); @@ -545,7 +545,7 @@ void Generator::generateCode() // because we definitely printed something above, this section doesn't need comma control for (const QList<FunctionDef> &methodContainer : { cdef->signalList, cdef->slotList, cdef->methodList }) { - for (int i = 0; i< methodContainer.count(); ++i) { + for (int i = 0; i< methodContainer.size(); ++i) { const FunctionDef& fdef = methodContainer.at(i); fprintf(out, ",\n // method '%s'\n %s", fdef.name.constData(), stringForType(fdef.type.name, false).constData()); @@ -555,7 +555,7 @@ void Generator::generateCode() } // but constructors have no return types, so this needs comma control again - for (int i = 0; i< cdef->constructorList.count(); ++i) { + for (int i = 0; i< cdef->constructorList.size(); ++i) { const FunctionDef& fdef = cdef->constructorList.at(i); if (fdef.arguments.isEmpty()) continue; @@ -641,7 +641,7 @@ void Generator::generateCode() fprintf(out, "// a) You are using a NOTIFY signal that does not exist. Fix it.\n"); fprintf(out, "// b) You are using a NOTIFY signal that does exist (in a parent class) but has a non-empty parameter list. This is a moc limitation.\n"); fprintf(out, "[[maybe_unused]] static void checkNotifySignalValidity_%s(%s *t) {\n", qualifiedClassNameIdentifier.constData(), cdef->qualified.constData()); - for (const QByteArray &nonClassSignal : qAsConst(cdef->nonClassSignalList)) + for (const QByteArray &nonClassSignal : std::as_const(cdef->nonClassSignalList)) fprintf(out, " t->%s();\n", nonClassSignal.constData()); fprintf(out, "}\n"); } @@ -672,7 +672,7 @@ void Generator::generateClassInfos() void Generator::registerFunctionStrings(const QList<FunctionDef> &list) { - for (int i = 0; i < list.count(); ++i) { + for (int i = 0; i < list.size(); ++i) { const FunctionDef &f = list.at(i); strreg(f.name); @@ -680,7 +680,7 @@ void Generator::registerFunctionStrings(const QList<FunctionDef> &list) strreg(f.normalizedType); strreg(f.tag); - int argsCount = f.arguments.count(); + int argsCount = f.arguments.size(); for (int j = 0; j < argsCount; ++j) { const ArgumentDef &a = f.arguments.at(j); if (!isBuiltinType(a.normalizedType)) @@ -703,7 +703,7 @@ void Generator::generateFunctions(const QList<FunctionDef> &list, const char *fu return; fprintf(out, "\n // %ss: name, argc, parameters, tag, flags, initial metatype offsets\n", functype); - for (int i = 0; i < list.count(); ++i) { + for (int i = 0; i < list.size(); ++i) { const FunctionDef &f = list.at(i); QByteArray comment; @@ -740,7 +740,7 @@ void Generator::generateFunctions(const QList<FunctionDef> &list, const char *fu comment.append(" | MethodIsConst "); } - int argc = f.arguments.count(); + int argc = f.arguments.size(); fprintf(out, " %4d, %4d, %4d, %4d, 0x%02x, %4d /* %s */,\n", stridx(f.name), argc, paramsIndex, stridx(f.tag), flags, initialMetatypeOffset, comment.constData()); @@ -752,9 +752,9 @@ void Generator::generateFunctions(const QList<FunctionDef> &list, const char *fu void Generator::generateFunctionRevisions(const QList<FunctionDef> &list, const char *functype) { - if (list.count()) + if (list.size()) fprintf(out, "\n // %ss: revision\n", functype); - for (int i = 0; i < list.count(); ++i) { + for (int i = 0; i < list.size(); ++i) { const FunctionDef &f = list.at(i); fprintf(out, " %4d,\n", f.revision); } @@ -765,12 +765,12 @@ void Generator::generateFunctionParameters(const QList<FunctionDef> &list, const if (list.isEmpty()) return; fprintf(out, "\n // %ss: parameters\n", functype); - for (int i = 0; i < list.count(); ++i) { + for (int i = 0; i < list.size(); ++i) { const FunctionDef &f = list.at(i); fprintf(out, " "); // Types - int argsCount = f.arguments.count(); + int argsCount = f.arguments.size(); for (int j = -1; j < argsCount; ++j) { if (j > -1) fputc(' ', out); @@ -816,7 +816,7 @@ void Generator::generateTypeInfo(const QByteArray &typeName, bool allowEmptyName void Generator::registerPropertyStrings() { - for (int i = 0; i < cdef->propertyList.count(); ++i) { + for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); strreg(p.name); if (!isBuiltinType(p.type)) @@ -830,9 +830,9 @@ void Generator::generateProperties() // Create meta data // - if (cdef->propertyList.count()) + if (cdef->propertyList.size()) fprintf(out, "\n // properties: name, type, flags\n"); - for (int i = 0; i < cdef->propertyList.count(); ++i) { + for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); uint flags = Invalid; if (!isBuiltinType(p.type)) @@ -886,12 +886,12 @@ void Generator::generateProperties() void Generator::registerEnumStrings() { - for (int i = 0; i < cdef->enumList.count(); ++i) { + for (int i = 0; i < cdef->enumList.size(); ++i) { const EnumDef &e = cdef->enumList.at(i); strreg(e.name); if (!e.enumName.isNull()) strreg(e.enumName); - for (int j = 0; j < e.values.count(); ++j) + for (int j = 0; j < e.values.size(); ++j) strreg(e.values.at(j)); } } @@ -902,9 +902,9 @@ void Generator::generateEnums(int index) return; fprintf(out, "\n // enums: name, alias, flags, count, data\n"); - index += 5 * cdef->enumList.count(); + index += 5 * cdef->enumList.size(); int i; - for (i = 0; i < cdef->enumList.count(); ++i) { + for (i = 0; i < cdef->enumList.size(); ++i) { const EnumDef &e = cdef->enumList.at(i); int flags = 0; if (cdef->enumDeclarations.value(e.name)) @@ -915,15 +915,15 @@ void Generator::generateEnums(int index) stridx(e.name), e.enumName.isNull() ? stridx(e.name) : stridx(e.enumName), flags, - int(e.values.count()), + int(e.values.size()), index); - index += e.values.count() * 2; + index += e.values.size() * 2; } fprintf(out, "\n // enum data: key, value\n"); - for (i = 0; i < cdef->enumList.count(); ++i) { + for (i = 0; i < cdef->enumList.size(); ++i) { const EnumDef &e = cdef->enumList.at(i); - for (int j = 0; j < e.values.count(); ++j) { + for (int j = 0; j < e.values.size(); ++j) { const QByteArray &val = e.values.at(j); QByteArray code = cdef->qualified.constData(); if (e.isEnumClass) @@ -989,7 +989,7 @@ void Generator::generateMetacall() " || _c == QMetaObject::ResetProperty || _c == QMetaObject::BindableProperty\n" " || _c == QMetaObject::RegisterPropertyMetaType) {\n" " qt_static_metacall(this, _c, _id, _a);\n" - " _id -= %d;\n }", int(cdef->propertyList.count())); + " _id -= %d;\n }", int(cdef->propertyList.size())); } if (methodList.size() || cdef->propertyList.size()) fprintf(out, "\n "); @@ -1015,7 +1015,7 @@ Generator::methodsWithAutomaticTypesHelper(const QList<FunctionDef> &methodList) QMap<int, QMultiMap<QByteArray, int> > methodsWithAutomaticTypes; for (int i = 0; i < methodList.size(); ++i) { const FunctionDef &f = methodList.at(i); - for (int j = 0; j < f.arguments.count(); ++j) { + for (int j = 0; j < f.arguments.size(); ++j) { const QByteArray argType = f.arguments.at(j).normalizedType; if (registerableMetaType(argType) && !isBuiltinType(argType)) methodsWithAutomaticTypes[i].insert(argType, j); @@ -1035,13 +1035,13 @@ void Generator::generateStaticMetacall() if (!cdef->constructorList.isEmpty()) { fprintf(out, " if (_c == QMetaObject::CreateInstance) {\n"); fprintf(out, " switch (_id) {\n"); - for (int ctorindex = 0; ctorindex < cdef->constructorList.count(); ++ctorindex) { + for (int ctorindex = 0; ctorindex < cdef->constructorList.size(); ++ctorindex) { fprintf(out, " case %d: { %s *_r = new %s(", ctorindex, cdef->classname.constData(), cdef->classname.constData()); const FunctionDef &f = cdef->constructorList.at(ctorindex); int offset = 1; - int argsCount = f.arguments.count(); + int argsCount = f.arguments.size(); for (int j = 0; j < argsCount; ++j) { const ArgumentDef &a = f.arguments.at(j); if (j) @@ -1100,7 +1100,7 @@ void Generator::generateStaticMetacall() if (f.isRawSlot) { fprintf(out, "QMethodRawArguments{ _a }"); } else { - int argsCount = f.arguments.count(); + int argsCount = f.arguments.size(); for (int j = 0; j < argsCount; ++j) { const ArgumentDef &a = f.arguments.at(j); if (j) @@ -1170,7 +1170,7 @@ void Generator::generateStaticMetacall() fprintf(out, " {\n"); fprintf(out, " using _t = %s (%s::*)(",f.type.rawName.constData() , cdef->classname.constData()); - int argsCount = f.arguments.count(); + int argsCount = f.arguments.size(); for (int j = 0; j < argsCount; ++j) { const ArgumentDef &a = f.arguments.at(j); if (j) @@ -1427,7 +1427,7 @@ void Generator::generateSignal(FunctionDef *def,int index) } int offset = 1; - for (int j = 0; j < def->arguments.count(); ++j) { + for (int j = 0; j < def->arguments.size(); ++j) { const ArgumentDef &a = def->arguments.at(j); if (j) fputs(", ", out); @@ -1460,7 +1460,7 @@ void Generator::generateSignal(FunctionDef *def,int index) } int i; for (i = 1; i < offset; ++i) - if (i <= def->arguments.count() && def->arguments.at(i - 1).type.isVolatile) + if (i <= def->arguments.size() && def->arguments.at(i - 1).type.isVolatile) fprintf(out, ", const_cast<void*>(reinterpret_cast<const volatile void*>(std::addressof(_t%d)))", i); else fprintf(out, ", const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t%d)))", i); diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp index 71b9757ebc..eb359f4dbb 100644 --- a/src/tools/moc/main.cpp +++ b/src/tools/moc/main.cpp @@ -330,7 +330,7 @@ int runMoc(int argc, char **argv) if (parser.isSet(collectOption)) return collectJson(files, output, hasOptionFiles); - if (files.count() > 1) { + if (files.size() > 1) { error(qPrintable("Too many input files specified: '"_L1 + files.join("' '"_L1) + u'\'')); parser.showHelp(1); } else if (!files.isEmpty()) { diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index a8a1fb372c..2f751e02bc 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -368,7 +368,7 @@ QTypeRevision Moc::parseRevision() revisionString.remove(0, 1); revisionString.chop(1); const QList<QByteArray> majorMinor = revisionString.split(','); - switch (majorMinor.length()) { + switch (majorMinor.size()) { case 1: { bool ok = false; const int revision = revisionString.toInt(&ok); @@ -595,6 +595,12 @@ void Moc::parse() QByteArray nsName = lexem(); QByteArrayList nested; while (test(SCOPE)) { + /* treat (C++20's) namespace A::inline B {} as A::B + this is mostly to not break compilation when encountering such + a construct in a header; the interaction of Qt's meta-macros with + inline namespaces is still rather poor. + */ + test(INLINE); next(IDENTIFIER); nested.append(nsName); nsName = lexem(); @@ -967,7 +973,7 @@ void Moc::parse() classHash.insert(def.qualified, def.qualified); } } - for (const auto &n : qAsConst(namespaceList)) { + for (const auto &n : std::as_const(namespaceList)) { if (!n.hasQNamespace) continue; ClassDef def; @@ -1060,7 +1066,7 @@ static QByteArrayList requiredQtContainers(const QList<ClassDef> &classes) void Moc::generate(FILE *out, FILE *jsonOutput) { QByteArray fn = filename; - int i = filename.length()-1; + int i = filename.size()-1; while (i > 0 && filename.at(i - 1) != '/' && filename.at(i - 1) != '\\') --i; // skip path if (i >= 0) @@ -1133,7 +1139,7 @@ void Moc::generate(FILE *out, FILE *jsonOutput) QJsonArray classesJsonFormatted; - for (const ClassDef &cdef: qAsConst(classList)) + for (const ClassDef &cdef: std::as_const(classList)) classesJsonFormatted.append(cdef.toJson()); if (!classesJsonFormatted.isEmpty()) @@ -1309,7 +1315,7 @@ void Moc::parsePropertyAttributes(PropertyDef &propDef) QByteArray v, v2; if (test(LPAREN)) { v = lexemUntil(RPAREN); - v = v.mid(1, v.length() - 2); // removes the '(' and ')' + v = v.mid(1, v.size() - 2); // removes the '(' and ')' } else if (test(INTEGER_LITERAL)) { v = lexem(); if (l != "REVISION") @@ -1590,7 +1596,7 @@ void Moc::parseInterfaces(ClassDef *def) } } // resolve from classnames to interface ids - for (int i = 0; i < iface.count(); ++i) { + for (int i = 0; i < iface.size(); ++i) { const QByteArray iid = interface2IdMap.value(iface.at(i).className); if (iid.isEmpty()) error("Undefined interface"); @@ -1786,7 +1792,7 @@ void Moc::checkSuperClasses(ClassDef *def) #endif return; } - for (int i = 1; i < def->superclassList.count(); ++i) { + for (int i = 1; i < def->superclassList.size(); ++i) { const QByteArray superClass = def->superclassList.at(i).first; if (knownQObjectClasses.contains(superClass)) { const QByteArray msg @@ -1802,7 +1808,7 @@ void Moc::checkSuperClasses(ClassDef *def) if (interface2IdMap.contains(superClass)) { bool registeredInterface = false; - for (int i = 0; i < def->interfaceList.count(); ++i) + for (int i = 0; i < def->interfaceList.size(); ++i) if (def->interfaceList.at(i).constFirst().className == superClass) { registeredInterface = true; break; @@ -1829,8 +1835,8 @@ void Moc::checkProperties(ClassDef *cdef) // specify get function, for compatibility we accept functions // returning pointers, or const char * for QByteArray. // - QDuplicateTracker<QByteArray> definedProperties(cdef->propertyList.count()); - for (int i = 0; i < cdef->propertyList.count(); ++i) { + QDuplicateTracker<QByteArray> definedProperties(cdef->propertyList.size()); + for (int i = 0; i < cdef->propertyList.size(); ++i) { PropertyDef &p = cdef->propertyList[i]; if (definedProperties.hasSeen(p.name)) { QByteArray msg = "The property '" + p.name + "' is defined multiple times in class " + cdef->classname + "."; @@ -1852,7 +1858,7 @@ void Moc::checkProperties(ClassDef *cdef) continue; } - for (int j = 0; j < cdef->publicList.count(); ++j) { + for (int j = 0; j < cdef->publicList.size(); ++j) { const FunctionDef &f = cdef->publicList.at(j); if (f.name != p.read) continue; @@ -1879,7 +1885,7 @@ void Moc::checkProperties(ClassDef *cdef) } if (!p.notify.isEmpty()) { int notifyId = -1; - for (int j = 0; j < cdef->signalList.count(); ++j) { + for (int j = 0; j < cdef->signalList.size(); ++j) { const FunctionDef &f = cdef->signalList.at(j); if (f.name != p.notify) { continue; @@ -1893,7 +1899,7 @@ void Moc::checkProperties(ClassDef *cdef) int index = cdef->nonClassSignalList.indexOf(p.notify); if (index == -1) { cdef->nonClassSignalList << p.notify; - p.notifyId = -1 - cdef->nonClassSignalList.count(); + p.notifyId = -1 - cdef->nonClassSignalList.size(); } else { p.notifyId = -2 - index; } @@ -1909,7 +1915,7 @@ QJsonObject ClassDef::toJson() const cls["qualifiedClassName"_L1] = QString::fromUtf8(qualified.constData()); QJsonArray classInfos; - for (const auto &info: qAsConst(classInfoList)) { + for (const auto &info: std::as_const(classInfoList)) { QJsonObject infoJson; infoJson["name"_L1] = QString::fromUtf8(info.name); infoJson["value"_L1] = QString::fromUtf8(info.value); @@ -1936,7 +1942,7 @@ QJsonObject ClassDef::toJson() const QJsonArray props; - for (const PropertyDef &propDef: qAsConst(propertyList)) + for (const PropertyDef &propDef: std::as_const(propertyList)) props.append(propDef.toJson()); if (!props.isEmpty()) @@ -1951,7 +1957,7 @@ QJsonObject ClassDef::toJson() const QJsonArray superClasses; - for (const auto &super: qAsConst(superclassList)) { + for (const auto &super: std::as_const(superclassList)) { const auto name = super.first; const auto access = super.second; QJsonObject superCls; @@ -1964,7 +1970,7 @@ QJsonObject ClassDef::toJson() const cls["superClasses"_L1] = superClasses; QJsonArray enums; - for (const EnumDef &enumDef: qAsConst(enumList)) + for (const EnumDef &enumDef: std::as_const(enumList)) enums.append(enumDef.toJson(*this)); if (!enums.isEmpty()) cls["enums"_L1] = enums; diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index c27b2c633f..af2a95c391 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -13,7 +13,8 @@ #include <qjsonobject.h> #include <qversionnumber.h> #include <stdio.h> -#include <ctype.h> + +#include <private/qtools_p.h> QT_BEGIN_NAMESPACE @@ -102,7 +103,7 @@ struct PropertyDef { bool stdCppSet() const { QByteArray s("set"); - s += toupper(name[0]); + s += QtMiscUtils::toAsciiUpper(name[0]); s += name.mid(1); return (s == write); } @@ -276,8 +277,8 @@ inline QByteArray noRef(const QByteArray &type) { if (type.endsWith('&')) { if (type.endsWith("&&")) - return type.left(type.length()-2); - return type.left(type.length()-1); + return type.left(type.size()-2); + return type.left(type.size()-1); } return type; } diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index a0c0b7ffaa..0958e26be3 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -980,7 +980,7 @@ static void mergeStringLiterals(Symbols *_symbols) for (Symbols::iterator j = mergeSymbol + 1; j != i; ++j) mergeSymbolLexem.append(j->lex.constData() + j->from + 1, j->len - 2); // append j->unquotedLexem() mergeSymbolLexem.append('"'); - mergeSymbol->len = mergeSymbol->lex.length(); + mergeSymbol->len = mergeSymbol->lex.size(); mergeSymbol->from = 0; i = symbols.erase(mergeSymbol + 1, i); } @@ -1284,7 +1284,7 @@ void Preprocessor::parseDefineArguments(Macro *m) if (!test(PP_RPAREN)) error("missing ')' in macro argument list"); break; - } else if (!is_identifier(l.constData(), l.length())) { + } else if (!is_identifier(l.constData(), l.size())) { error("Unexpected character in macro argument list."); } } diff --git a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp index 90fa13503d..11a6fda3a0 100644 --- a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp +++ b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp @@ -110,13 +110,13 @@ static QString addFunction(const FunctionDef &mm, bool isSignal = false) { qWarning() << qPrintable(errorMsg); return QString(); // invalid form } - if (isSignal && inputCount + 1 != types.count()) + if (isSignal && inputCount + 1 != types.size()) return QString(); // signal with output arguments? if (isSignal && types.at(inputCount) == QDBusMetaTypeId::message()) return QString(); // signal with QDBusMessage argument? bool isScriptable = mm.isScriptable; - for (int j = 1; j < types.count(); ++j) { + for (int j = 1; j < types.size(); ++j) { // input parameter for a slot or output for a signal if (types.at(j) == QDBusMetaTypeId::message()) { isScriptable = true; @@ -253,7 +253,7 @@ QString qDBusInterfaceFromClassDef(const ClassDef *mo) if (interface.startsWith("QDBus"_L1)) { interface.prepend("org.qtproject.QtDBus."_L1); } else if (interface.startsWith(u'Q') && - interface.length() >= 2 && interface.at(1).isUpper()) { + interface.size() >= 2 && interface.at(1).isUpper()) { // assume it's Qt interface.prepend("local.org.qtproject.Qt."_L1); } else { @@ -333,7 +333,7 @@ static std::deque<CustomType> s_customTypes; static void parseCmdLine(QStringList &arguments) { flags = 0; - for (int i = 0; i < arguments.count(); ++i) { + for (int i = 0; i < arguments.size(); ++i) { const QString arg = arguments.at(i); if (arg == "--help"_L1) @@ -373,7 +373,7 @@ static void parseCmdLine(QStringList &arguments) break; case 't': - if (arguments.count() < i + 2) { + if (arguments.size() < i + 2) { printf("-t expects a type=dbustype argument\n"); exit(1); } else { @@ -394,7 +394,7 @@ static void parseCmdLine(QStringList &arguments) break; case 'o': - if (arguments.count() < i + 2 || arguments.at(i + 1).startsWith(u'-')) { + if (arguments.size() < i + 2 || arguments.at(i + 1).startsWith(u'-')) { printf("-o expects a filename\n"); exit(1); } @@ -431,7 +431,7 @@ int main(int argc, char **argv) QList<ClassDef> classes; - for (int i = 0; i < args.count(); ++i) { + for (int i = 0; i < args.size(); ++i) { const QString arg = args.at(i); if (arg.startsWith(u'-')) @@ -478,7 +478,7 @@ int main(int argc, char **argv) output.write(docTypeHeader); output.write("<node>\n"); - for (const ClassDef &cdef : qAsConst(classes)) { + for (const ClassDef &cdef : std::as_const(classes)) { QString xml = qDBusGenerateClassDefXml(&cdef); output.write(std::move(xml).toLocal8Bit()); } diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp index 672242d665..7e017a8a07 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -121,7 +121,7 @@ static QString moc(const QString &name) if (retval.isEmpty()) return retval; - retval.truncate(retval.length() - 1); // drop the h in .h + retval.truncate(retval.size() - 1); // drop the h in .h retval += "moc"_L1; return retval; } @@ -247,8 +247,8 @@ static QStringList makeArgNames(const QDBusIntrospection::Arguments &inputArgs, QDBusIntrospection::Arguments()) { QStringList retval; - const int numInputArgs = inputArgs.count(); - const int numOutputArgs = outputArgs.count(); + const int numInputArgs = inputArgs.size(); + const int numOutputArgs = outputArgs.size(); retval.reserve(numInputArgs + numOutputArgs); for (int i = 0; i < numInputArgs; ++i) { const QDBusIntrospection::Argument &arg = inputArgs.at(i); @@ -283,7 +283,7 @@ static void writeArgList(QTextStream &ts, const QStringList &argNames, // input args: bool first = true; int argPos = 0; - for (int i = 0; i < inputArgs.count(); ++i) { + for (int i = 0; i < inputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = inputArgs.at(i); QString type = constRefArg(qtTypeName(arg.name, arg.type, annotations, i, "In")); @@ -297,7 +297,7 @@ static void writeArgList(QTextStream &ts, const QStringList &argNames, // output args // yes, starting from 1 - for (int i = 1; i < outputArgs.count(); ++i) { + for (int i = 1; i < outputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); if (!first) @@ -314,7 +314,7 @@ static void writeSignalArgList(QTextStream &ts, const QStringList &argNames, { bool first = true; int argPos = 0; - for (int i = 0; i < outputArgs.count(); ++i) { + for (int i = 0; i < outputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); QString type = constRefArg( qtTypeName(arg.name, arg.type, annotations, i, "Out", true /* isSignal */)); @@ -379,14 +379,14 @@ static QString stringify(const QString &data) { QString retval; int i; - for (i = 0; i < data.length(); ++i) { + for (i = 0; i < data.size(); ++i) { retval += u'\"'; - for ( ; i < data.length() && data[i] != u'\n' && data[i] != u'\r'; ++i) + for ( ; i < data.size() && data[i] != u'\n' && data[i] != u'\r'; ++i) if (data[i] == u'\"') retval += "\\\""_L1; else retval += data[i]; - if (i+1 < data.length() && data[i] == u'\r' && data[i+1] == u'\n') + if (i+1 < data.size() && data[i] == u'\r' && data[i+1] == u'\n') i++; retval += "\\n\"\n"_L1; } @@ -453,7 +453,7 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf hs << "#include <QtDBus/QDBusPendingReply>" << Qt::endl; #endif - for (const QString &include : qAsConst(includes)) { + for (const QString &include : std::as_const(includes)) { hs << "#include \"" << include << "\"" << Qt::endl; if (headerName.isEmpty()) cs << "#include \"" << include << "\"" << Qt::endl; @@ -562,9 +562,9 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf hs << "Q_NOREPLY void "; } else { hs << "QDBusPendingReply<"; - for (int i = 0; i < method.outputArgs.count(); ++i) + for (int i = 0; i < method.outputArgs.size(); ++i) hs << (i > 0 ? ", " : "") - << templateArg(qtTypeName(method.name, method.outputArgs.at(i).type, + << templateArg(qtTypeName(method.outputArgs.at(i).name, method.outputArgs.at(i).type, method.annotations, i, "Out")); hs << "> "; } @@ -580,7 +580,7 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf if (!method.inputArgs.isEmpty()) { hs << " argumentList"; - for (int argPos = 0; argPos < method.inputArgs.count(); ++argPos) + for (int argPos = 0; argPos < method.inputArgs.size(); ++argPos) hs << " << QVariant::fromValue(" << argNames.at(argPos) << ')'; hs << ";" << Qt::endl; } @@ -595,10 +595,10 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf // close the function: hs << " }" << Qt::endl; - if (method.outputArgs.count() > 1) { + if (method.outputArgs.size() > 1) { // generate the old-form QDBusReply methods with multiple incoming parameters hs << " inline " << (isDeprecated ? "Q_DECL_DEPRECATED " : "") << "QDBusReply<" - << templateArg(qtTypeName(method.name, method.outputArgs.first().type, + << templateArg(qtTypeName(method.outputArgs.first().name, method.outputArgs.first().type, method.annotations, 0, "Out")) << "> "; hs << method.name << "("; @@ -613,7 +613,7 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf int argPos = 0; if (!method.inputArgs.isEmpty()) { hs << " argumentList"; - for (argPos = 0; argPos < method.inputArgs.count(); ++argPos) + for (argPos = 0; argPos < method.inputArgs.size(); ++argPos) hs << " << QVariant::fromValue(" << argNames.at(argPos) << ')'; hs << ";" << Qt::endl; } @@ -623,12 +623,12 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf argPos++; hs << " if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == " - << method.outputArgs.count() << ") {" << Qt::endl; + << method.outputArgs.size() << ") {" << Qt::endl; // yes, starting from 1 - for (int i = 1; i < method.outputArgs.count(); ++i) + for (int i = 1; i < method.outputArgs.size(); ++i) hs << " " << argNames.at(argPos++) << " = qdbus_cast<" - << templateArg(qtTypeName(method.name, method.outputArgs.at(i).type, + << templateArg(qtTypeName(method.outputArgs.at(i).name, method.outputArgs.at(i).type, method.annotations, i, "Out")) << ">(reply.arguments().at(" << i << "));" << Qt::endl; hs << " }" << Qt::endl @@ -671,21 +671,21 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf } int i = 0; - while (i < current.count() && i < last.count() && current.at(i) == last.at(i)) + while (i < current.size() && i < last.size() && current.at(i) == last.at(i)) ++i; // i parts matched // close last.arguments().count() - i namespaces: - for (int j = i; j < last.count(); ++j) - hs << QString((last.count() - j - 1 + i) * 2, u' ') << "}" << Qt::endl; + for (int j = i; j < last.size(); ++j) + hs << QString((last.size() - j - 1 + i) * 2, u' ') << "}" << Qt::endl; // open current.arguments().count() - i namespaces - for (int j = i; j < current.count(); ++j) + for (int j = i; j < current.size(); ++j) hs << QString(j * 2, u' ') << "namespace " << current.at(j) << " {" << Qt::endl; // add this class: if (!name.isEmpty()) { - hs << QString(current.count() * 2, u' ') + hs << QString(current.size() * 2, u' ') << "using " << name << " = ::" << classNameForInterface(it->constData()->name, Proxy) << ";" << Qt::endl; } @@ -766,7 +766,7 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte hs << "#include <QtDBus/QDBusObjectPath>" << Qt::endl; #endif - for (const QString &include : qAsConst(includes)) { + for (const QString &include : std::as_const(includes)) { hs << "#include \"" << include << "\"" << Qt::endl; if (headerName.isEmpty()) cs << "#include \"" << include << "\"" << Qt::endl; @@ -899,7 +899,7 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte hs << "void "; cs << "void "; } else { - returnType = qtTypeName(method.name, method.outputArgs.first().type, + returnType = qtTypeName(method.outputArgs.first().name, method.outputArgs.first().type, method.annotations, 0, "Out"); hs << returnType << " "; cs << returnType << " "; @@ -920,14 +920,14 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte // make the call bool usingInvokeMethod = false; - if (parentClassName.isEmpty() && method.inputArgs.count() <= 10 - && method.outputArgs.count() <= 1) + if (parentClassName.isEmpty() && method.inputArgs.size() <= 10 + && method.outputArgs.size() <= 1) usingInvokeMethod = true; if (usingInvokeMethod) { // we are using QMetaObject::invokeMethod if (!returnType.isEmpty()) - cs << " " << returnType << " " << argNames.at(method.inputArgs.count()) + cs << " " << returnType << " " << argNames.at(method.inputArgs.size()) << ";" << Qt::endl; static const char invoke[] = " QMetaObject::invokeMethod(parent(), \""; @@ -935,20 +935,20 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte if (!method.outputArgs.isEmpty()) cs << ", Q_RETURN_ARG(" - << qtTypeName(method.name, method.outputArgs.at(0).type, method.annotations, + << qtTypeName(method.outputArgs.at(0).name, method.outputArgs.at(0).type, method.annotations, 0, "Out") - << ", " << argNames.at(method.inputArgs.count()) << ")"; + << ", " << argNames.at(method.inputArgs.size()) << ")"; - for (int i = 0; i < method.inputArgs.count(); ++i) + for (int i = 0; i < method.inputArgs.size(); ++i) cs << ", Q_ARG(" - << qtTypeName(method.name, method.inputArgs.at(i).type, method.annotations, + << qtTypeName(method.inputArgs.at(i).name, method.inputArgs.at(i).type, method.annotations, i, "In") << ", " << argNames.at(i) << ")"; cs << ");" << Qt::endl; if (!returnType.isEmpty()) - cs << " return " << argNames.at(method.inputArgs.count()) << ";" << Qt::endl; + cs << " return " << argNames.at(method.inputArgs.size()) << ";" << Qt::endl; } else { if (parentClassName.isEmpty()) cs << " //"; @@ -966,12 +966,12 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte int argPos = 0; bool first = true; - for (int i = 0; i < method.inputArgs.count(); ++i) { + for (int i = 0; i < method.inputArgs.size(); ++i) { cs << (first ? "" : ", ") << argNames.at(argPos++); first = false; } ++argPos; // skip retval, if any - for (int i = 1; i < method.outputArgs.count(); ++i) { + for (int i = 1; i < method.outputArgs.size(); ++i) { cs << (first ? "" : ", ") << argNames.at(argPos++); first = false; } diff --git a/src/tools/qlalr/compress.cpp b/src/tools/qlalr/compress.cpp index c6d0ef14b7..6ee083f7e9 100644 --- a/src/tools/qlalr/compress.cpp +++ b/src/tools/qlalr/compress.cpp @@ -139,7 +139,7 @@ void Compress::operator () (int *table, int row_count, int column_count) #ifndef QLALR_NO_CHECK_SORTED_TABLE int previous_zeros = INT_MAX; - for (const UncompressedRow &row : qAsConst(sortedTable)) + for (const UncompressedRow &row : std::as_const(sortedTable)) { int zeros = row.count (0); @@ -151,7 +151,7 @@ void Compress::operator () (int *table, int row_count, int column_count) index.fill (-999999, row_count); - for (const UncompressedRow &row : qAsConst(sortedTable)) + for (const UncompressedRow &row : std::as_const(sortedTable)) { int first_token = std::distance (row.begin (), row.beginNonZeros ()); QList<int>::iterator pos = info.begin(); @@ -226,7 +226,7 @@ void Compress::operator () (int *table, int row_count, int column_count) } #if 0 - for (const UncompressedRow &row : qAsConst(sortedTable)) + for (const UncompressedRow &row : std::as_const(sortedTable)) { int i = row.index (); Q_ASSERT (i < sortedTable.size ()); diff --git a/src/tools/qlalr/cppgenerator.cpp b/src/tools/qlalr/cppgenerator.cpp index a41aa87835..51e151b4fb 100644 --- a/src/tools/qlalr/cppgenerator.cpp +++ b/src/tools/qlalr/cppgenerator.cpp @@ -214,7 +214,7 @@ void CppGenerator::operator () () } auto rule = grammar.rules.begin(); - for (int i = 0; i < used_rules.count (); ++i, ++rule) + for (int i = 0; i < used_rules.size(); ++i, ++rule) { if (! used_rules.testBit (i)) { @@ -413,7 +413,7 @@ void CppGenerator::generateDecl (QTextStream &out) << "public:" << Qt::endl << " enum VariousConstants {" << Qt::endl; - for (const Name &t : qAsConst(grammar.terminals)) + for (const Name &t : std::as_const(grammar.terminals)) { QString name = *t; int value = std::distance (grammar.names.begin (), t); diff --git a/src/tools/qlalr/lalr.cpp b/src/tools/qlalr/lalr.cpp index 460be04272..e7496e94b5 100644 --- a/src/tools/qlalr/lalr.cpp +++ b/src/tools/qlalr/lalr.cpp @@ -351,7 +351,7 @@ void Automaton::closure (StatePointer state) if (_M_grammar->isNonTerminal (*item->dot)) { - const auto range = qAsConst(_M_grammar->rule_map).equal_range(*item->dot); + const auto range = std::as_const(_M_grammar->rule_map).equal_range(*item->dot); for (auto it = range.first; it != range.second; ++it) { const RulePointer &rule = *it; @@ -399,7 +399,7 @@ void Automaton::buildLookbackSets () if (! _M_grammar->isNonTerminal (A)) continue; - const auto range = qAsConst(_M_grammar->rule_map).equal_range(A); + const auto range = std::as_const(_M_grammar->rule_map).equal_range(A); for (auto it = range.first; it != range.second; ++it) { const RulePointer &rule = *it; @@ -594,7 +594,7 @@ void Automaton::buildIncludesDigraph () if (! _M_grammar->isNonTerminal (name)) continue; - const auto range = qAsConst(_M_grammar->rule_map).equal_range(name); + const auto range = std::as_const(_M_grammar->rule_map).equal_range(name); for (auto it = range.first; it != range.second; ++it) { const RulePointer &rule = *it; @@ -696,7 +696,7 @@ void Automaton::buildLookaheads () { for (ItemPointer item = p->closure.begin (); item != p->closure.end (); ++item) { - const auto range = qAsConst(lookbacks).equal_range(item); + const auto range = std::as_const(lookbacks).equal_range(item); for (auto it = range.first; it != range.second; ++it) { const Lookback &lookback = *it; diff --git a/src/tools/qlalr/recognizer.h b/src/tools/qlalr/recognizer.h index ce07ff361f..31d606e657 100644 --- a/src/tools/qlalr/recognizer.h +++ b/src/tools/qlalr/recognizer.h @@ -1,6 +1,9 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#ifndef RECOGNIZER_H +#define RECOGNIZER_H + #include "grammar_p.h" #include "lalr.h" @@ -72,3 +75,5 @@ protected: QString _M_current_value; bool _M_no_lines; }; + +#endif // RECOGNIZER_H diff --git a/src/tools/qvkgen/qvkgen.cpp b/src/tools/qvkgen/qvkgen.cpp index 98d87be1b5..84903c2a43 100644 --- a/src/tools/qvkgen/qvkgen.cpp +++ b/src/tools/qvkgen/qvkgen.cpp @@ -606,7 +606,7 @@ int main(int argc, char **argv) QStringLiteral("vkGetInstanceProcAddr"), QStringLiteral("vkEnumerateInstanceVersion") }; - for (int i = 0; i < commands.count(); ++i) { + for (int i = 0; i < commands.size(); ++i) { if (ignoredFuncs.contains(commands[i].cmd.name)) commands.remove(i--); } diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index 7323fc9bbb..2751bc39d6 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -227,12 +227,16 @@ int runRcc(int argc, char *argv[]) if (parser.isSet(compressionAlgoOption)) library.setCompressionAlgorithm(RCCResourceLibrary::parseCompressionAlgorithm(parser.value(compressionAlgoOption), &errorMsg)); - if (formatVersion < 3 && library.compressionAlgorithm() == RCCResourceLibrary::CompressionAlgorithm::Zstd) - errorMsg = "Zstandard compression requires format version 3 or higher"_L1; - if (parser.isSet(nocompressOption)) - library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None); if (parser.isSet(noZstdOption)) library.setNoZstd(true); + if (library.compressionAlgorithm() == RCCResourceLibrary::CompressionAlgorithm::Zstd) { + if (formatVersion < 3) + errorMsg = "Zstandard compression requires format version 3 or higher"_L1; + if (library.noZstd()) + errorMsg = "--compression-algo=zstd and --no-zstd both specified."_L1; + } + if (parser.isSet(nocompressOption)) + library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None); if (parser.isSet(compressOption) && errorMsg.isEmpty()) { int level = library.parseCompressionLevel(library.compressionAlgorithm(), parser.value(compressOption), &errorMsg); library.setCompressLevel(level); diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp index 1f641dd7e1..3227c585b7 100644 --- a/src/tools/rcc/rcc.cpp +++ b/src/tools/rcc/rcc.cpp @@ -35,14 +35,6 @@ enum { CONSTANT_COMPRESSTHRESHOLD_DEFAULT = 70 }; -#if QT_CONFIG(zstd) && QT_VERSION >= QT_VERSION_CHECK(6,0,0) -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zstd -#elif !defined(QT_NO_COMPRESS) -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zlib -#else -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::None -#endif - void RCCResourceLibrary::write(const char *str, int len) { int n = m_out.size(); @@ -87,7 +79,7 @@ public: QLocale::Language language = QLocale::C, QLocale::Territory territory = QLocale::AnyTerritory, uint flags = NoFlags, - RCCResourceLibrary::CompressionAlgorithm compressAlgo = CONSTANT_COMPRESSALGO_DEFAULT, + RCCResourceLibrary::CompressionAlgorithm compressAlgo = RCCResourceLibrary::CompressionAlgorithm::Best, int compressLevel = CONSTANT_COMPRESSLEVEL_DEFAULT, int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT, bool noZstd = false); @@ -379,7 +371,7 @@ qint64 RCCFileInfo::writeDataName(RCCResourceLibrary &lib, qint64 offset) } // write the length - lib.writeNumber2(m_name.length()); + lib.writeNumber2(m_name.size()); if (text || pass1) lib.writeString("\n "); else if (python) @@ -396,14 +388,14 @@ qint64 RCCFileInfo::writeDataName(RCCResourceLibrary &lib, qint64 offset) // write the m_name const QChar *unicode = m_name.unicode(); - for (int i = 0; i < m_name.length(); ++i) { + for (int i = 0; i < m_name.size(); ++i) { lib.writeNumber2(unicode[i].unicode()); if ((text || pass1) && i % 16 == 0) lib.writeString("\n "); else if (python && i % 16 == 0) lib.writeString("\\\n"); } - offset += m_name.length()*2; + offset += m_name.size()*2; // done if (text || pass1) @@ -438,7 +430,7 @@ RCCResourceLibrary::RCCResourceLibrary(quint8 formatVersion) : m_root(nullptr), m_format(C_Code), m_verbose(false), - m_compressionAlgo(CONSTANT_COMPRESSALGO_DEFAULT), + m_compressionAlgo(CompressionAlgorithm::Best), m_compressLevel(CONSTANT_COMPRESSLEVEL_DEFAULT), m_compressThreshold(CONSTANT_COMPRESSTHRESHOLD_DEFAULT), m_treeOffset(0), @@ -514,7 +506,7 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, QString attribute = attributes.value(m_strings.ATTRIBUTE_LANG).toString(); QLocale lang = QLocale(attribute); language = lang.language(); - if (2 == attribute.length()) { + if (2 == attribute.size()) { // Language only territory = QLocale::AnyTerritory; } else { @@ -733,7 +725,7 @@ bool RCCResourceLibrary::addFile(const QString &alias, const RCCFileInfo &file) for (auto it = cbegin; it != cend; ++it) { if (it.key() == filename && it.value()->m_language == s->m_language && it.value()->m_territory == s->m_territory) { - for (const QString &name : qAsConst(m_fileNames)) { + for (const QString &name : std::as_const(m_fileNames)) { qWarning("%s: Warning: potential duplicate alias detected: '%s'", qPrintable(name), qPrintable(filename)); } diff --git a/src/tools/shared/shellquote_shared.h b/src/tools/shared/shellquote_shared.h index ea72c89ab3..7a9ab691da 100644 --- a/src/tools/shared/shellquote_shared.h +++ b/src/tools/shared/shellquote_shared.h @@ -11,7 +11,7 @@ // Copy-pasted from qmake/library/ioutil.cpp inline static bool hasSpecialChars(const QString &arg, const uchar (&iqm)[16]) { - for (int x = arg.length() - 1; x >= 0; --x) { + for (int x = arg.size() - 1; x >= 0; --x) { ushort c = arg.unicode()[x].unicode(); if ((c < sizeof(iqm) * 8) && (iqm[c / 8] & (1 << (c & 7)))) return true; @@ -27,7 +27,7 @@ static QString shellQuoteUnix(const QString &arg) 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x78 }; // 0-32 \'"$`<>|;&(){}*?#!~[] - if (!arg.length()) + if (!arg.size()) return QLatin1String("\"\""); QString ret(arg); @@ -50,7 +50,7 @@ static QString shellQuoteWin(const QString &arg) 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10 }; - if (!arg.length()) + if (!arg.size()) return QLatin1String("\"\""); QString ret(arg); @@ -62,7 +62,7 @@ static QString shellQuoteWin(const QString &arg) // The argument must not end with a \ since this would be interpreted // as escaping the quote -- rather put the \ behind the quote: e.g. // rather use "foo"\ than "foo\" - int i = ret.length(); + int i = ret.size(); while (i > 0 && ret.at(i - 1) == QLatin1Char('\\')) --i; ret.insert(i, QLatin1Char('"')); diff --git a/src/tools/uic/cpp/cppwritedeclaration.cpp b/src/tools/uic/cpp/cppwritedeclaration.cpp index 2730ef9797..e4ea2fbd40 100644 --- a/src/tools/uic/cpp/cppwritedeclaration.cpp +++ b/src/tools/uic/cpp/cppwritedeclaration.cpp @@ -55,7 +55,7 @@ void WriteDeclaration::acceptUI(DomUI *node) exportMacro.append(u' '); QStringList namespaceList = qualifiedClassName.split("::"_L1); - if (namespaceList.count()) { + if (namespaceList.size()) { className = namespaceList.last(); namespaceList.removeLast(); } @@ -65,7 +65,7 @@ void WriteDeclaration::acceptUI(DomUI *node) // is a User using Qt-in-namespace having his own classes not in a namespace. // In this case the generated Ui helper classes will also end up in // the Qt namespace (which is harmless, but not "pretty") - const bool needsMacro = namespaceList.count() == 0 + const bool needsMacro = namespaceList.size() == 0 || namespaceList[0] == "qdesigner_internal"_L1; if (needsMacro) @@ -73,7 +73,7 @@ void WriteDeclaration::acceptUI(DomUI *node) openNameSpaces(namespaceList, m_output); - if (namespaceList.count()) + if (namespaceList.size()) m_output << "\n"; m_output << "class " << exportMacro << m_option.prefix << className << "\n" @@ -98,7 +98,7 @@ void WriteDeclaration::acceptUI(DomUI *node) closeNameSpaces(namespaceList, m_output); - if (namespaceList.count()) + if (namespaceList.size()) m_output << "\n"; if (m_option.generateNamespace && !m_option.prefix.isEmpty()) { @@ -110,7 +110,7 @@ void WriteDeclaration::acceptUI(DomUI *node) closeNameSpaces(namespaceList, m_output); - if (namespaceList.count()) + if (namespaceList.size()) m_output << "\n"; } diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index e9ad0352af..5939ba9411 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -513,7 +513,7 @@ void WriteInitialization::acceptUI(DomUI *node) if (!m_buddies.empty()) m_output << language::openQtConfig(shortcutConfigKey()); - for (const Buddy &b : qAsConst(m_buddies)) { + for (const Buddy &b : std::as_const(m_buddies)) { const QString buddyVarName = m_driver->widgetVariableName(b.buddyAttributeName); if (buddyVarName.isEmpty()) { fprintf(stderr, "%s: Warning: Buddy assignment: '%s' is not a valid widget.\n", @@ -601,7 +601,7 @@ void WriteInitialization::addWizardPage(const QString &pageVarName, const DomWid void WriteInitialization::acceptWidget(DomWidget *node) { - m_layoutMarginType = m_widgetChain.count() == 1 ? TopLevelMargin : ChildMargin; + m_layoutMarginType = m_widgetChain.size() == 1 ? TopLevelMargin : ChildMargin; const QString className = node->attributeClass(); const QString varName = m_driver->findOrInsertWidget(node); @@ -977,7 +977,7 @@ void WriteInitialization::writePropertyList(const QString &varName, if (value.isEmpty()) return; const QStringList list = value.split(u','); - const int count = list.count(); + const int count = list.size(); for (int i = 0; i < count; i++) { if (list.at(i) != defaultValue) { m_output << m_indent << varName << language::derefPointer << setFunction @@ -1180,7 +1180,7 @@ void WriteInitialization::writeProperties(const QString &varName, const DomPropertyList &lst, unsigned flags) { - const bool isTopLevel = m_widgetChain.count() == 1; + const bool isTopLevel = m_widgetChain.size() == 1; if (m_uic->customWidgetsInfo()->extends(className, "QAxWidget")) { DomPropertyMap properties = propertyMap(lst); @@ -1350,11 +1350,12 @@ void WriteInitialization::writeProperties(const QString &varName, Buddy buddy = { varName, p->elementCstring() }; m_buddies.append(std::move(buddy)); } else { + const bool useQByteArray = !stdset && language::language() == Language::Cpp; QTextStream str(&propertyValue); - if (!stdset) + if (useQByteArray) str << "QByteArray("; str << language::charliteral(p->elementCstring(), m_dindent); - if (!stdset) + if (useQByteArray) str << ')'; } break; @@ -1827,9 +1828,8 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i) writeResourceIcon(m_output, iconName, m_dindent, i); else writePixmapFunctionIcon(m_output, iconName, m_dindent, i); - m_output << m_indent; if (isCpp) - m_output << '}'; + m_output << m_indent << '}'; m_output << '\n'; return iconName; } @@ -2329,7 +2329,7 @@ void WriteInitialization::initializeTreeWidget(DomWidget *w) QString tempName = disableSorting(w, varName); const auto items = initializeTreeWidgetItems(w->elementItem()); - for (int i = 0; i < items.count(); i++) { + for (int i = 0; i < items.size(); i++) { Item *itm = items[i]; itm->writeSetupUi(varName); QString parentPath; @@ -2605,6 +2605,10 @@ ConnectionSyntax WriteInitialization::connectionSyntax(const language::SignalSlo return ConnectionSyntax::StringBased; } + // QTBUG-110952, ambiguous overloads of display() + if (receiver.className == u"QLCDNumber" && receiver.signature.startsWith(u"display(")) + return ConnectionSyntax::StringBased; + if ((sender.name == m_mainFormVarName && m_customSignals.contains(sender.signature)) || (receiver.name == m_mainFormVarName && m_customSlots.contains(receiver.signature))) { return ConnectionSyntax::StringBased; @@ -2734,7 +2738,7 @@ QString WriteInitialization::Item::writeSetupUi(const QString &parent, Item::Emp m_setupUiStream << language::closeQtConfig(it.key()); ++it; } - for (Item *child : qAsConst(m_children)) + for (Item *child : std::as_const(m_children)) child->writeSetupUi(uniqueName); return uniqueName; } diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp index 01712da485..6648ab7171 100644 --- a/src/tools/uic/main.cpp +++ b/src/tools/uic/main.cpp @@ -89,6 +89,11 @@ int runUic(int argc, char *argv[]) fromImportsOption.setDescription(QStringLiteral("Python: generate imports relative to '.'")); parser.addOption(fromImportsOption); + // FIXME Qt 7: Flip the default? + QCommandLineOption rcPrefixOption(QStringLiteral("rc-prefix")); + rcPrefixOption.setDescription(QStringLiteral("Python: Generate \"rc_file\" instead of \"file_rc\" import")); + parser.addOption(rcPrefixOption); + // FIXME Qt 7: Remove? QCommandLineOption useStarImportsOption(QStringLiteral("star-imports")); useStarImportsOption.setDescription(QStringLiteral("Python: Use * imports")); @@ -117,6 +122,9 @@ int runUic(int argc, char *argv[]) driver.option().forceStringConnectionSyntax = 1; } + if (parser.isSet(rcPrefixOption)) + driver.option().rcPrefix = 1; + Language language = Language::Cpp; if (parser.isSet(generatorOption)) { if (parser.value(generatorOption).compare("python"_L1) == 0) diff --git a/src/tools/uic/option.h b/src/tools/uic/option.h index 277655b3ad..9b4c98344f 100644 --- a/src/tools/uic/option.h +++ b/src/tools/uic/option.h @@ -24,6 +24,7 @@ struct Option unsigned int forceMemberFnPtrConnectionSyntax: 1; unsigned int forceStringConnectionSyntax: 1; unsigned int useStarImports: 1; + unsigned int rcPrefix: 1; // Python: Generate "rc_file" instead of "file_rc" import QString inputFile; QString outputFile; @@ -48,6 +49,7 @@ struct Option forceMemberFnPtrConnectionSyntax(0), forceStringConnectionSyntax(0), useStarImports(0), + rcPrefix(0), prefix(QLatin1StringView("Ui_")) { indent.fill(u' ', 4); } diff --git a/src/tools/uic/python/pythonwriteimports.cpp b/src/tools/uic/python/pythonwriteimports.cpp index a894a00a8d..a268f87bb4 100644 --- a/src/tools/uic/python/pythonwriteimports.cpp +++ b/src/tools/uic/python/pythonwriteimports.cpp @@ -56,14 +56,17 @@ static WriteImports::ClassesPerModule defaultClasses() // Change the name of a qrc file "dir/foo.qrc" file to the Python // module name "foo_rc" according to project conventions. -static QString pythonResource(QString resource) +static QString pythonResource(QString resource, bool prefix) { const qsizetype lastSlash = resource.lastIndexOf(u'/'); if (lastSlash != -1) resource.remove(0, lastSlash + 1); if (resource.endsWith(".qrc"_L1)) { resource.chop(4); - resource.append("_rc"_L1); + if (prefix) + resource.prepend("rc_"_L1); + else + resource.append("_rc"_L1); } return resource; } @@ -140,7 +143,8 @@ void WriteImports::acceptUI(DomUI *node) const auto includes = resources->elementInclude(); for (auto include : includes) { if (include->hasAttributeLocation()) - writeImport(pythonResource(include->attributeLocation())); + writeImport(pythonResource(include->attributeLocation(), + uic()->option().rcPrefix)); } output << '\n'; } diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h index 236fd97449..e9e4cfde12 100644 --- a/src/tools/uic/qclass_lib_map.h +++ b/src/tools/uic/qclass_lib_map.h @@ -837,6 +837,7 @@ QT_CLASS_LIB(QGraphicsSvgItem, QtSvgWidgets, qgraphicssvgitem.h) QT_CLASS_LIB(QSvgWidget, QtSvgWidgets, qsvgwidget.h) QT_CLASS_LIB(QSvgGenerator, QtSvg, qsvggenerator.h) QT_CLASS_LIB(QSvgRenderer, QtSvg, qsvgrenderer.h) +QT_CLASS_LIB(QPdfView, QtPdfWidgets, qpdfview.h) QT_CLASS_LIB(QQuickWidget, QtQuickWidgets, qquickwidget.h) QT_CLASS_LIB(QVideoWidget, QtMultimediaWidgets, qvideowidget.h) QT_CLASS_LIB(QWebEngineView, QtWebEngineWidgets, qwebengineview.h) diff --git a/src/tools/windeployqt/main.cpp b/src/tools/windeployqt/main.cpp index 9d483e123f..a8ab3790ea 100644 --- a/src/tools/windeployqt/main.cpp +++ b/src/tools/windeployqt/main.cpp @@ -22,6 +22,7 @@ #define IMAGE_FILE_MACHINE_ARM64 0xaa64 #endif +#include <bitset> #include <algorithm> #include <iostream> #include <iterator> @@ -31,62 +32,89 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; +using ModuleBitset = std::bitset<76>; + enum QtModule #if defined(Q_COMPILER_CLASS_ENUM) || defined(Q_CC_MSVC) : quint64 #endif { - QtBluetoothModule = 0x0000000000000001, - QtConcurrentModule = 0x0000000000000002, - QtCoreModule = 0x0000000000000004, - QtDeclarativeModule = 0x0000000000000008, - QtDesignerComponents = 0x0000000000000010, - QtDesignerModule = 0x0000000000000020, - QtGuiModule = 0x0000000000000040, - QtHelpModule = 0x0000000000000080, - QtMultimediaModule = 0x0000000000000100, - QtMultimediaWidgetsModule = 0x0000000000000200, - QtMultimediaQuickModule = 0x0000000000000400, - QtNetworkModule = 0x0000000000000800, - QtNfcModule = 0x0000000000001000, - QtOpenGLModule = 0x0000000000002000, - QtOpenGLWidgetsModule = 0x0000000000004000, - QtPositioningModule = 0x0000000000008000, - QtPrintSupportModule = 0x0000000000010000, - QtQmlModule = 0x0000000000020000, - QtQuickModule = 0x0000000000040000, - QtQuickParticlesModule = 0x0000000000080000, - QtScriptModule = 0x0000000000100000, - QtScriptToolsModule = 0x0000000000200000, - QtSensorsModule = 0x0000000000400000, - QtSerialPortModule = 0x0000000000800000, - QtSqlModule = 0x0000000001000000, - QtSvgModule = 0x0000000002000000, - QtSvgWidgetsModule = 0x0000000004000000, - QtTestModule = 0x0000000008000000, - QtWidgetsModule = 0x0000000010000000, - QtWinExtrasModule = 0x0000000020000000, - QtXmlModule = 0x0000000040000000, - QtQuickWidgetsModule = 0x0000000100000000, - QtWebSocketsModule = 0x0000000200000000, - QtWebEngineCoreModule = 0x0000000800000000, - QtWebEngineModule = 0x0000001000000000, - QtWebEngineWidgetsModule = 0x0000002000000000, - QtQmlToolingModule = 0x0000004000000000, - Qt3DCoreModule = 0x0000008000000000, - Qt3DRendererModule = 0x0000010000000000, - Qt3DQuickModule = 0x0000020000000000, - Qt3DQuickRendererModule = 0x0000040000000000, - Qt3DInputModule = 0x0000080000000000, - QtLocationModule = 0x0000100000000000, - QtWebChannelModule = 0x0000200000000000, - QtTextToSpeechModule = 0x0000400000000000, - QtSerialBusModule = 0x0000800000000000, - QtGamePadModule = 0x0001000000000000, - Qt3DAnimationModule = 0x0002000000000000, - QtWebViewModule = 0x0004000000000000, - Qt3DExtrasModule = 0x0008000000000000, - QtShaderToolsModule = 0x0010000000000000 + QtBluetoothModule, + QtConcurrentModule, + QtCoreModule, + QtDeclarativeModule, + QtDesignerComponents, + QtDesignerModule, + QtGuiModule, + QtHelpModule, + QtMultimediaModule, + QtMultimediaWidgetsModule, + QtMultimediaQuickModule, + QtNetworkModule, + QtNfcModule, + QtOpenGLModule, + QtOpenGLWidgetsModule, + QtPositioningModule, + QtPrintSupportModule, + QtQmlModule, + QtQuickModule, + QtQuickParticlesModule, + QtScriptModule, + QtScriptToolsModule, + QtSensorsModule, + QtSerialPortModule, + QtSqlModule, + QtSvgModule, + QtSvgWidgetsModule, + QtTestModule, + QtWidgetsModule, + QtWinExtrasModule, + QtXmlModule, + QtQuickWidgetsModule, + QtWebSocketsModule, + QtWebEngineCoreModule, + QtWebEngineModule, + QtWebEngineWidgetsModule, + QtQmlToolingModule, + Qt3DCoreModule, + Qt3DRendererModule, + Qt3DQuickModule, + Qt3DQuickRendererModule, + Qt3DInputModule, + QtLocationModule, + QtWebChannelModule, + QtTextToSpeechModule, + QtSerialBusModule, + QtGamePadModule, + Qt3DAnimationModule, + QtWebViewModule, + Qt3DExtrasModule, + QtShaderToolsModule, + QtUiToolsModule, + QtCore5CompatModule, + QtChartsModule, + QtDataVisualizationModule, + QtRemoteObjectsModule, + QtScxmlModule, + QtNetworkAuthorizationModule, + QtMqttModule, + QtPdfModule, + QtPdfQuickModule, + QtPdfWidgetsModule, + QtDBusModule, + QtStateMachineModule, + Qt3DLogicModule, + QtPositioningQuickModule, + QtSensorsQuickModule, + QtWebEngineQuickModule, + QtWebViewQuickModule, + QtQuickControlsModule, + QtQuickDialogsModule, + QtQuickLayoutsModule, + QtQuickShapesModule, + QtQuickTestModule, + QtQuickTimelineModule, + QtQuick3DModule }; struct QtModuleEntry { @@ -147,7 +175,32 @@ static QtModuleEntry qtModuleEntries[] = { { QtTextToSpeechModule, "texttospeech", "Qt6TextToSpeech", nullptr }, { QtSerialBusModule, "serialbus", "Qt6SerialBus", nullptr }, { QtWebViewModule, "webview", "Qt6WebView", nullptr }, - { QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr } + { QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr }, + { QtUiToolsModule, "uitools", "Qt6UiTools", nullptr }, + { QtCore5CompatModule, "core5compat", "Qt6Core5Compat", nullptr }, + { QtChartsModule, "charts", "Qt6Charts", nullptr }, + { QtDataVisualizationModule, "datavisualization", "Qt6DataVisualization", nullptr }, + { QtRemoteObjectsModule, "remoteobjects", "Qt6RemoteObjects", nullptr }, + { QtScxmlModule, "scxml", "Qt6Scxml", nullptr }, + { QtNetworkAuthorizationModule, "networkauthorization", "Qt6NetworkAuth", nullptr }, + { QtMqttModule, "mqtt", "Qt6Mqtt", nullptr }, + { QtPdfModule, "pdf", "Qt6Pdf", nullptr }, + { QtPdfQuickModule, "pdfquick", "Qt6PdfQuick", nullptr }, + { QtPdfWidgetsModule, "pdfwidgets", "Qt6PdfWidgets", nullptr }, + { QtDBusModule, "dbus", "Qt6DBus", nullptr }, + { QtStateMachineModule, "statemachine", "Qt6StateMachine", nullptr }, + { Qt3DLogicModule, "3dlogic", "Qt63DLogic", nullptr }, + { QtPositioningQuickModule, "positioningquick", "Qt6PositioningQuick", nullptr }, + { QtSensorsQuickModule, "sensorsquick", "Qt6SensorsQuick", nullptr }, + { QtWebEngineQuickModule, "webenginequick", "Qt6WebEngineQuick", nullptr }, + { QtWebViewQuickModule, "webviewquick", "Qt6WebViewQuick", nullptr }, + { QtQuickControlsModule, "quickcontrols", "Qt6QuickControls2", nullptr }, + { QtQuickDialogsModule, "quickdialogs", "Qt6QuickDialogs2", nullptr }, + { QtQuickLayoutsModule, "quicklayouts", "Qt6QuickLayouts", nullptr }, + { QtQuickShapesModule, "quickshapes", "Qt6QuickShapes", nullptr }, + { QtQuickTestModule, "quicktest", "Qt6QuickTest", nullptr }, + { QtQuickTimelineModule, "quicktimeline", "Qt6QuickTimeline", nullptr }, + { QtQuick3DModule, "quick3d", "Qt6Quick3D", nullptr } }; enum QtPlugin { @@ -162,11 +215,11 @@ static inline QString webProcessBinary(const char *binaryName, Platform p) return (p & WindowsBased) ? webProcess + QStringLiteral(".exe") : webProcess; } -static QByteArray formatQtModules(quint64 mask, bool option = false) +static QByteArray formatQtModules(const ModuleBitset &mask, bool option = false) { QByteArray result; for (const auto &qtModule : qtModuleEntries) { - if (mask & qtModule.module) { + if (mask.test(qtModule.module)) { if (!result.isEmpty()) result.append(' '); result.append(option ? qtModule.option : qtModule.libraryName); @@ -229,8 +282,8 @@ struct Options { unsigned disabledPlugins = 0; bool softwareRasterizer = true; Platform platform = WindowsDesktopMsvc; - quint64 additionalLibraries = 0; - quint64 disabledLibraries = 0; + ModuleBitset additionalLibraries; + ModuleBitset disabledLibraries; unsigned updateFileFlags = 0; QStringList qmlDirectories; // Project's QML files. QStringList qmlImportPaths; // Custom QML module locations. @@ -514,16 +567,16 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse for (int i = 0; i < qtModulesCount; ++i) { if (parser->isSet(*enabledModuleOptions.at(i))) - options->additionalLibraries |= qtModuleEntries[i].module; + options->additionalLibraries[qtModuleEntries[i].module] = 1; if (parser->isSet(*disabledModuleOptions.at(i))) - options->disabledLibraries |= qtModuleEntries[i].module; + options->disabledLibraries[qtModuleEntries[i].module] = 1; } // Add some dependencies - if (options->additionalLibraries & QtQuickModule) - options->additionalLibraries |= QtQmlModule; - if (options->additionalLibraries & QtDesignerComponents) - options->additionalLibraries |= QtDesignerModule; + if (options->additionalLibraries.test(QtQuickModule)) + options->additionalLibraries[QtQmlModule] = 1; + if (options->additionalLibraries.test(QtDesignerComponents)) + options->additionalLibraries[QtDesignerModule] = 1; if (parser->isSet(listOption)) { const QString value = parser->value(listOption); @@ -670,7 +723,8 @@ static inline QString helpText(const QCommandLineParser &p) QString moduleHelp = "\n\nQt libraries can be added by passing their name (-xml) or removed by passing\n" "the name prepended by --no- (--no-xml). Available libraries:\n"_L1; - moduleHelp += lineBreak(QString::fromLatin1(formatQtModules(0xFFFFFFFFFFFFFFFFull, true))); + ModuleBitset mask; + moduleHelp += lineBreak(QString::fromLatin1(formatQtModules(mask.set(), true))); moduleHelp += u'\n'; result.replace(moduleStart, argumentsStart - moduleStart, moduleHelp); return result; @@ -703,7 +757,7 @@ static bool findDependentQtLibraries(const QString &qtBinDir, const QString &bin // Filter out the Qt libraries. Note that depends.exe finds libs from optDirectory if we // are run the 2nd time (updating). We want to check against the Qt bin dir libraries const int start = result->size(); - for (const QString &lib : qAsConst(dependentLibs)) { + for (const QString &lib : std::as_const(dependentLibs)) { if (isQtModule(lib)) { const QString path = normalizeFileName(qtBinDir + u'/' + QFileInfo(lib).fileName()); if (!result->contains(path)) @@ -821,6 +875,7 @@ static const PluginModuleMapping pluginModuleMappings[] = {"geoservices", QtLocationModule}, {"audio", QtMultimediaModule}, {"mediaservice", QtMultimediaModule}, + {"multimedia", QtMultimediaModule}, {"playlistformats", QtMultimediaModule}, {"networkaccess", QtNetworkModule}, {"networkinformation", QtNetworkModule}, @@ -842,7 +897,9 @@ static const PluginModuleMapping pluginModuleMappings[] = {"renderers", Qt3DRendererModule | QtShaderToolsModule}, {"renderplugins", Qt3DRendererModule}, {"geometryloaders", Qt3DRendererModule}, - {"webview", QtWebViewModule} + {"webview", QtWebViewModule}, + {"designer", QtUiToolsModule}, + {"scxmldatamodel", QtScxmlModule} }; static inline quint64 qtModuleForPlugin(const QString &subDirName) @@ -878,13 +935,66 @@ static quint64 qtModule(QString module, const QString &infix) return 0; } -QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, +// Return the path if a plugin is to be deployed +static QString deployPlugin(const QString &plugin, const QDir &subDir, + ModuleBitset *usedQtModules, const ModuleBitset &disabledQtModules, + unsigned disabledPlugins, + const QString &libraryLocation, const QString &infix, + Platform platform) +{ + // Filter out disabled plugins + if ((disabledPlugins & QtVirtualKeyboardPlugin) + && plugin.startsWith("qtvirtualkeyboardplugin"_L1)) { + return {}; + } + + const QString pluginPath = subDir.absoluteFilePath(plugin); + // Deploy QUiTools plugins as is without further dependency checking. + // The user needs to ensure all required libraries are present (would + // otherwise pull QtWebEngine for its plugin). + if (subDir.dirName() == u"designer") + return pluginPath; + + QStringList dependentQtLibs; + ModuleBitset neededModules; + QString errorMessage; + if (findDependentQtLibraries(libraryLocation, pluginPath, platform, + &errorMessage, &dependentQtLibs)) { + for (int d = 0; d < dependentQtLibs.size(); ++ d) + neededModules[qtModule(dependentQtLibs.at(d), infix)] = 1; + } else { + std::wcerr << "Warning: Cannot determine dependencies of " + << QDir::toNativeSeparators(pluginPath) << ": " << errorMessage << '\n'; + } + + ModuleBitset missingModules; + missingModules = neededModules & disabledQtModules; + if (missingModules.any()) { + if (optVerboseLevel) { + std::wcout << "Skipping plugin " << plugin + << " due to disabled dependencies (" + << formatQtModules(missingModules).constData() << ").\n"; + } + return {}; + } + + missingModules = (neededModules & ~*usedQtModules); + if (missingModules.any()) { + *usedQtModules |= missingModules; + if (optVerboseLevel) { + std::wcout << "Adding " << formatQtModules(missingModules).constData() + << " for " << plugin << '\n'; + } + } + return pluginPath; +} + +QStringList findQtPlugins(ModuleBitset *usedQtModules, const ModuleBitset &disabledQtModules, unsigned disabledPlugins, const QString &qtPluginsDirName, const QString &libraryLocation, const QString &infix, DebugMatchMode debugMatchModeIn, Platform platform, QString *platformPlugin) { - QString errorMessage; if (qtPluginsDirName.isEmpty()) return QStringList(); QDir pluginsDir(qtPluginsDirName); @@ -893,7 +1003,7 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, for (const QFileInfo &subDirFi : pluginDirs) { const QString subDirName = subDirFi.fileName(); const quint64 module = qtModuleForPlugin(subDirName); - if (module & *usedQtModules) { + if (usedQtModules->test(module)) { const DebugMatchMode debugMatchMode = (module & QtWebEngineCoreModule) ? MatchDebugOrRelease // QTBUG-44331: Debug detection does not work for webengine, deploy all. : debugMatchModeIn; @@ -901,7 +1011,7 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, // Filter out disabled plugins if ((disabledPlugins & QtVirtualKeyboardPlugin) && subDirName == "virtualkeyboard"_L1) continue; - if (disabledQtModules & QtQmlToolingModule && subDirName == "qmltooling"_L1) + if (disabledQtModules.test(QtQmlToolingModule) && subDirName == "qmltooling"_L1) continue; // Filter for platform or any. QString filter; @@ -911,6 +1021,8 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, case WindowsDesktopMsvc: case WindowsDesktopMinGW: filter = QStringLiteral("qwindows"); + if (!infix.isEmpty()) + filter += infix; break; case Unix: filter = QStringLiteral("libqxcb"); @@ -923,35 +1035,12 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, } const QStringList plugins = findSharedLibraries(subDir, platform, debugMatchMode, filter); for (const QString &plugin : plugins) { - // Filter out disabled plugins - if ((disabledPlugins & QtVirtualKeyboardPlugin) - && plugin.startsWith("qtvirtualkeyboardplugin"_L1)) { - continue; - } - const QString pluginPath = subDir.absoluteFilePath(plugin); - if (isPlatformPlugin) - *platformPlugin = pluginPath; - QStringList dependentQtLibs; - quint64 neededModules = 0; - if (findDependentQtLibraries(libraryLocation, pluginPath, platform, &errorMessage, &dependentQtLibs)) { - for (int d = 0; d < dependentQtLibs.size(); ++ d) - neededModules |= qtModule(dependentQtLibs.at(d), infix); - } else { - std::wcerr << "Warning: Cannot determine dependencies of " - << QDir::toNativeSeparators(pluginPath) << ": " << errorMessage << '\n'; - } - if (const quint64 missingModules = neededModules & disabledQtModules) { - if (optVerboseLevel) { - std::wcout << "Skipping plugin " << plugin - << " due to disabled dependencies (" - << formatQtModules(missingModules).constData() << ").\n"; - } - } else { - if (const quint64 missingModules = (neededModules & ~*usedQtModules)) { - *usedQtModules |= missingModules; - if (optVerboseLevel) - std::wcout << "Adding " << formatQtModules(missingModules).constData() << " for " << plugin << '\n'; - } + const QString pluginPath = + deployPlugin(plugin, subDir, usedQtModules, disabledQtModules, + disabledPlugins, libraryLocation, infix, platform); + if (!pluginPath.isEmpty()) { + if (isPlatformPlugin) + *platformPlugin = subDir.absoluteFilePath(plugin); result.append(pluginPath); } } // for filter @@ -960,11 +1049,11 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, return result; } -static QStringList translationNameFilters(quint64 modules, const QString &prefix) +static QStringList translationNameFilters(const ModuleBitset &modules, const QString &prefix) { QStringList result; for (const auto &qtModule : qtModuleEntries) { - if ((qtModule.module & modules) && qtModule.translation) { + if (modules.test(qtModule.module) && qtModule.translation) { const QString name = QLatin1StringView(qtModule.translation) + u'_' + prefix + QStringLiteral(".qm"); if (!result.contains(name)) @@ -974,7 +1063,7 @@ static QStringList translationNameFilters(quint64 modules, const QString &prefix return result; } -static bool deployTranslations(const QString &sourcePath, quint64 usedQtModules, +static bool deployTranslations(const QString &sourcePath, const ModuleBitset &usedQtModules, const QString &target, const Options &options, QString *errorMessage) { @@ -998,7 +1087,7 @@ static bool deployTranslations(const QString &sourcePath, quint64 usedQtModules, const QString absoluteTarget = QFileInfo(target).absoluteFilePath(); const QString binary = QStringLiteral("lconvert"); QStringList arguments; - for (const QString &prefix : qAsConst(prefixes)) { + for (const QString &prefix : std::as_const(prefixes)) { arguments.clear(); const QString targetFile = QStringLiteral("qt_") + prefix + QStringLiteral(".qm"); arguments.append(QStringLiteral("-o")); @@ -1032,9 +1121,9 @@ struct DeployResult bool success = false; bool isDebug = false; - quint64 directlyUsedQtLibraries = 0; - quint64 usedQtLibraries = 0; - quint64 deployedQtLibraries = 0; + ModuleBitset directlyUsedQtLibraries; + ModuleBitset usedQtLibraries; + ModuleBitset deployedQtLibraries; }; static QString libraryPath(const QString &libraryLocation, const char *name, @@ -1269,16 +1358,18 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> // Determine application type, check Quick2 is used by looking at the // direct dependencies (do not be fooled by QtWebKit depending on it). QString qtLibInfix; - for (int m = 0; m < directDependencyCount; ++m) { + for (int m = 0; m < dependentQtLibs.size(); ++m) { const quint64 module = qtModule(dependentQtLibs.at(m), infix); - result.directlyUsedQtLibraries |= module; + result.directlyUsedQtLibraries[module] = 1; if (module == QtCoreModule) qtLibInfix = qtlibInfixFromCoreLibName(dependentQtLibs.at(m), detectedDebug, options.platform); } - const bool usesQml2 = !(options.disabledLibraries & QtQmlModule) - && ((result.directlyUsedQtLibraries & (QtQmlModule | QtQuickModule | Qt3DQuickModule)) - || (options.additionalLibraries & QtQmlModule)); + const bool usesQml = result.directlyUsedQtLibraries.test(QtQmlModule); + const bool usesQuick = result.directlyUsedQtLibraries.test(QtQuickModule); + const bool uses3DQuick = result.directlyUsedQtLibraries.test(Qt3DQuickModule); + const bool usesQml2 = !(options.disabledLibraries.test(QtQmlModule)) + && (usesQml || usesQuick || uses3DQuick || (options.additionalLibraries.test(QtQmlModule))); if (optVerboseLevel) { std::wcout << QDir::toNativeSeparators(options.binaries.first()) << ' ' @@ -1321,7 +1412,7 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> } icuLibs.push_back(icuLib); } - for (const QString &icuLib : qAsConst(icuLibs)) { + for (const QString &icuLib : std::as_const(icuLibs)) { const QString icuPath = findInPath(icuLib); if (icuPath.isEmpty()) { *errorMessage = QStringLiteral("Unable to locate ICU library ") + icuLib; @@ -1347,30 +1438,30 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> if (!qmlDirectory.isEmpty()) qmlDirectories.append(qmlDirectory); } - for (const QString &qmlDirectory : qAsConst(qmlDirectories)) { + for (const QString &qmlDirectory : std::as_const(qmlDirectories)) { if (optVerboseLevel >= 1) std::wcout << "Scanning " << QDir::toNativeSeparators(qmlDirectory) << ":\n"; const QmlImportScanResult scanResult = runQmlImportScanner(qmlDirectory, qmlImportPaths, - result.directlyUsedQtLibraries & QtWidgetsModule, + result.directlyUsedQtLibraries.test(QtWidgetsModule), options.platform, debugMatchMode, errorMessage); if (!scanResult.ok) return result; qmlScanResult.append(scanResult); // Additional dependencies of QML plugins. - for (const QString &plugin : qAsConst(qmlScanResult.plugins)) { + for (const QString &plugin : std::as_const(qmlScanResult.plugins)) { if (!findDependentQtLibraries(libraryLocation, plugin, options.platform, errorMessage, &dependentQtLibs, &wordSize, &detectedDebug, &machineArch)) return result; } if (optVerboseLevel >= 1) { std::wcout << "QML imports:\n"; - for (const QmlImportScanResult::Module &mod : qAsConst(qmlScanResult.modules)) { + for (const QmlImportScanResult::Module &mod : std::as_const(qmlScanResult.modules)) { std::wcout << " '" << mod.name << "' " << QDir::toNativeSeparators(mod.sourcePath) << '\n'; } if (optVerboseLevel >= 2) { std::wcout << "QML plugins:\n"; - for (const QString &p : qAsConst(qmlScanResult.plugins)) + for (const QString &p : std::as_const(qmlScanResult.plugins)) std::wcout << " " << QDir::toNativeSeparators(p) << '\n'; } } @@ -1383,24 +1474,29 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> QStringList deployedQtLibraries; for (int i = 0 ; i < dependentQtLibs.size(); ++i) { if (const quint64 qtm = qtModule(dependentQtLibs.at(i), infix)) - result.usedQtLibraries |= qtm; + result.usedQtLibraries[qtm] = 1; else deployedQtLibraries.push_back(dependentQtLibs.at(i)); // Not represented by flag. } result.deployedQtLibraries = (result.usedQtLibraries | options.additionalLibraries) & ~options.disabledLibraries; + ModuleBitset disabled = options.disabledLibraries; + if (!usesQml2) { + disabled[QtQmlModule] = 1; + disabled[QtQuickModule] = 1; + } const QStringList plugins = findQtPlugins( &result.deployedQtLibraries, // For non-QML applications, disable QML to prevent it from being pulled in by the // qtaccessiblequick plugin. - options.disabledLibraries | (usesQml2 ? 0 : (QtQmlModule | QtQuickModule)), + disabled, options.disabledPlugins, qtpathsVariables.value(QStringLiteral("QT_INSTALL_PLUGINS")), libraryLocation, infix, debugMatchMode, options.platform, &platformPlugin); // Apply options flags and re-add library names. QString qtGuiLibrary; for (const auto &qtModule : qtModuleEntries) { - if (result.deployedQtLibraries & qtModule.module) { + if (result.deployedQtLibraries.test(qtModule.module)) { const QString library = libraryPath(libraryLocation, qtModule.libraryName, qtLibInfix, options.platform, result.isDebug); deployedQtLibraries.append(library); if (qtModule.module == QtGuiModule) @@ -1417,7 +1513,7 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> if (optVerboseLevel > 1) std::wcout << "Plugins: " << plugins.join(u',') << '\n'; - if ((result.deployedQtLibraries & QtGuiModule) && platformPlugin.isEmpty()) { + if ((result.deployedQtLibraries.test(QtGuiModule)) && platformPlugin.isEmpty()) { *errorMessage =QStringLiteral("Unable to find the platform plugin."); return result; } @@ -1447,7 +1543,7 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> QStringList libraries = deployedQtLibraries; if (options.compilerRunTime) libraries.append(compilerRunTimeLibs(options.platform, result.isDebug, machineArch)); - for (const QString &qtLib : qAsConst(libraries)) { + for (const QString &qtLib : std::as_const(libraries)) { if (!updateLibrary(qtLib, targetPath, options, errorMessage)) return result; } @@ -1491,12 +1587,12 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> } // optPlugins // Update Quick imports - const bool usesQuick1 = result.deployedQtLibraries & QtDeclarativeModule; + const bool usesQuick1 = result.deployedQtLibraries.test(QtDeclarativeModule); // Do not be fooled by QtWebKit.dll depending on Quick into always installing Quick imports // for WebKit1-applications. Check direct dependency only. if (options.quickImports && (usesQuick1 || usesQml2)) { if (usesQml2) { - for (const QmlImportScanResult::Module &module : qAsConst(qmlScanResult.modules)) { + for (const QmlImportScanResult::Module &module : std::as_const(qmlScanResult.modules)) { const QString installPath = module.installPath(options.directory); if (optVerboseLevel > 1) std::wcout << "Installing: '" << module.name @@ -1519,7 +1615,7 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> qtpathsVariables.value(QStringLiteral("QT_INSTALL_IMPORTS")); const QmlDirectoryFileEntryFunction qmlFileEntryFunction(options.platform, debugMatchMode, options.deployPdb ? QmlDirectoryFileEntryFunction::DeployPdb : 0); QStringList quick1Imports(QStringLiteral("Qt")); - for (const QString &quick1Import : qAsConst(quick1Imports)) { + for (const QString &quick1Import : std::as_const(quick1Imports)) { const QString sourceFile = quick1ImportPath + slash + quick1Import; if (!updateFile(sourceFile, qmlFileEntryFunction, options.directory, options.updateFileFlags, options.json, errorMessage)) return result; @@ -1679,7 +1775,7 @@ int main(int argc, char **argv) return 1; } - if (result.deployedQtLibraries & QtWebEngineCoreModule) { + if (result.deployedQtLibraries.test(QtWebEngineCoreModule)) { if (!deployWebEngineCore(qtpathsVariables, options, result.isDebug, &errorMessage)) { std::wcerr << errorMessage << '\n'; return 1; diff --git a/src/tools/windeployqt/utils.cpp b/src/tools/windeployqt/utils.cpp index 41b2d2f063..7e1f485d68 100644 --- a/src/tools/windeployqt/utils.cpp +++ b/src/tools/windeployqt/utils.cpp @@ -373,7 +373,7 @@ bool runProcess(const QString &binary, const QStringList &args, char **argv = new char *[args.size() + 2]; // Create argv. char **ap = argv; *ap++ = encodeFileName(binary); - for (const QString &a : qAsConst(args)) + for (const QString &a : std::as_const(args)) *ap++ = encodeFileName(a); *ap = 0; @@ -868,7 +868,7 @@ QString findD3dCompiler(Platform platform, const QString &qtBinDir, unsigned wor candidateVersions.append(prefix + QString::number(i) + suffix); // Check the bin directory of the Qt SDK (in case it is shadowed by the // Windows system directory in PATH). - for (const QString &candidate : qAsConst(candidateVersions)) { + for (const QString &candidate : std::as_const(candidateVersions)) { const QFileInfo fi(qtBinDir + u'/' + candidate); if (fi.isFile()) return fi.absoluteFilePath(); @@ -877,7 +877,7 @@ QString findD3dCompiler(Platform platform, const QString &qtBinDir, unsigned wor if (platform.testFlag(IntelBased)) { QString errorMessage; unsigned detectedWordSize; - for (const QString &candidate : qAsConst(candidateVersions)) { + for (const QString &candidate : std::as_const(candidateVersions)) { const QString dll = findInPath(candidate); if (!dll.isEmpty() && readPeExecutable(dll, &errorMessage, 0, &detectedWordSize, 0) |