diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-02-13 08:49:49 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-02-16 12:27:47 +0000 |
commit | 067b4527b732394b15f845f3a6082249092b99d5 (patch) | |
tree | 978ad236c7723e0e991669bae666b187146d8f48 /src/lib/qtprofilesetup | |
parent | 56dcc749218b6365acef5721157d7eb4591bd5b2 (diff) |
Make replaceSpecialValues data-driven
Do not call QByteArray::replace over and over again, but encode the
replacement data in a dictionary, and scan the input once.
Change-Id: I6de75599eb0a92f63817097b5a5633cfc62678b1
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/qtprofilesetup')
-rw-r--r-- | src/lib/qtprofilesetup/qtprofilesetup.cpp | 133 |
1 files changed, 81 insertions, 52 deletions
diff --git a/src/lib/qtprofilesetup/qtprofilesetup.cpp b/src/lib/qtprofilesetup/qtprofilesetup.cpp index 63a51838c..d8760ff80 100644 --- a/src/lib/qtprofilesetup/qtprofilesetup.cpp +++ b/src/lib/qtprofilesetup/qtprofilesetup.cpp @@ -394,55 +394,76 @@ static QStringList extractQbsArchs(const QtModuleInfo &module, const QtEnvironme return QStringList { qbsArch }; } +static std::pair<int, int> findVariable(const QByteArray &content, int start) +{ + std::pair<int, int> result = std::make_pair(-1, -1); + result.first = content.indexOf('@', start); + if (result.first == -1) + return result; + result.second = content.indexOf('@', result.first + 1); + if (result.second == -1) { + result.first = -1; + return result; + } + for (char forbidden : {' ', '\n'}) { + int k = content.indexOf(forbidden, result.first + 1); + if (k != -1 && k < result.second) { + return findVariable(content, result.first + 1); + } + } + return result; +} + static void replaceSpecialValues(QByteArray *content, const Profile &profile, const QtModuleInfo &module, const QtEnvironment &qtEnvironment) { - content->replace("@archs@", utf8JSLiteral(extractQbsArchs(module, qtEnvironment))); - content->replace("@targetPlatform@", utf8JSLiteral(qbsTargetPlatformFromQtMkspec( - qtEnvironment.mkspecName))); - content->replace("@config@", utf8JSLiteral(qtEnvironment.configItems)); - content->replace("@qtConfig@", utf8JSLiteral(qtEnvironment.qtConfigItems)); - content->replace("@binPath@", utf8JSLiteral(qtEnvironment.binaryPath)); - content->replace("@libPath@", utf8JSLiteral(qtEnvironment.libraryPath)); - content->replace("@pluginPath@", utf8JSLiteral(qtEnvironment.pluginPath)); - content->replace("@incPath@", utf8JSLiteral(qtEnvironment.includePath)); - content->replace("@docPath@", utf8JSLiteral(qtEnvironment.documentationPath)); - content->replace("@mkspecName@", utf8JSLiteral(qtEnvironment.mkspecName)); - content->replace("@mkspecPath@", utf8JSLiteral(qtEnvironment.mkspecPath)); - content->replace("@version@", utf8JSLiteral(qtEnvironment.qtVersion)); - content->replace("@libInfix@", utf8JSLiteral(qtEnvironment.qtLibInfix)); - content->replace("@availableBuildVariants@", utf8JSLiteral(qtEnvironment.buildVariant)); - content->replace("@staticBuild@", utf8JSLiteral(qtEnvironment.staticBuild)); - content->replace("@frameworkBuild@", utf8JSLiteral(qtEnvironment.frameworkBuild)); - content->replace("@name@", utf8JSLiteral(module.moduleNameWithoutPrefix())); - content->replace("@has_library@", utf8JSLiteral(module.hasLibrary)); - content->replace("@dependencies@", utf8JSLiteral(module.dependencies)); - content->replace("@includes@", utf8JSLiteral(module.includePaths)); - content->replace("@staticLibsDebug@", utf8JSLiteral(module.staticLibrariesDebug)); - content->replace("@staticLibsRelease@", utf8JSLiteral(module.staticLibrariesRelease)); - content->replace("@dynamicLibsDebug@", utf8JSLiteral(module.dynamicLibrariesDebug)); - content->replace("@dynamicLibsRelease@", utf8JSLiteral(module.dynamicLibrariesRelease)); - content->replace("@linkerFlagsDebug@", utf8JSLiteral(module.linkerFlagsDebug)); - content->replace("@linkerFlagsRelease@", utf8JSLiteral(module.linkerFlagsRelease)); - content->replace("@libraryPaths@", utf8JSLiteral(module.libraryPaths)); - content->replace("@frameworkPathsDebug@", utf8JSLiteral(module.frameworkPathsDebug)); - content->replace("@frameworkPathsRelease@", utf8JSLiteral(module.frameworkPathsRelease)); - content->replace("@frameworksDebug@", utf8JSLiteral(module.frameworksDebug)); - content->replace("@frameworksRelease@", utf8JSLiteral(module.frameworksRelease)); - content->replace("@libFilePathDebug@", utf8JSLiteral(module.libFilePathDebug)); - content->replace("@libFilePathRelease@", utf8JSLiteral(module.libFilePathRelease)); - content->replace("@libNameForLinkerDebug@", - utf8JSLiteral(module.libNameForLinker(qtEnvironment, true))); - content->replace("@libNameForLinkerRelease@", - utf8JSLiteral(module.libNameForLinker(qtEnvironment, false))); - content->replace("@entryPointLibsDebug@", utf8JSLiteral(qtEnvironment.entryPointLibsDebug)); - content->replace("@entryPointLibsRelease@", utf8JSLiteral(qtEnvironment.entryPointLibsRelease)); - content->replace("@minWinVersion@", minVersionJsString(qtEnvironment.windowsVersion)); - content->replace("@minMacVersion@", minVersionJsString(qtEnvironment.macosVersion)); - content->replace("@minIosVersion@", minVersionJsString(qtEnvironment.iosVersion)); - content->replace("@minTvosVersion@", minVersionJsString(qtEnvironment.tvosVersion)); - content->replace("@minWatchosVersion@", minVersionJsString(qtEnvironment.watchosVersion)); - content->replace("@minAndroidVersion@", minVersionJsString(qtEnvironment.androidVersion)); + QHash<QByteArray, QByteArray> dict; + dict.insert("archs", utf8JSLiteral(extractQbsArchs(module, qtEnvironment))); + dict.insert("targetPlatform", utf8JSLiteral(qbsTargetPlatformFromQtMkspec( + qtEnvironment.mkspecName))); + dict.insert("config", utf8JSLiteral(qtEnvironment.configItems)); + dict.insert("qtConfig", utf8JSLiteral(qtEnvironment.qtConfigItems)); + dict.insert("binPath", utf8JSLiteral(qtEnvironment.binaryPath)); + dict.insert("libPath", utf8JSLiteral(qtEnvironment.libraryPath)); + dict.insert("pluginPath", utf8JSLiteral(qtEnvironment.pluginPath)); + dict.insert("incPath", utf8JSLiteral(qtEnvironment.includePath)); + dict.insert("docPath", utf8JSLiteral(qtEnvironment.documentationPath)); + dict.insert("mkspecName", utf8JSLiteral(qtEnvironment.mkspecName)); + dict.insert("mkspecPath", utf8JSLiteral(qtEnvironment.mkspecPath)); + dict.insert("version", utf8JSLiteral(qtEnvironment.qtVersion)); + dict.insert("libInfix", utf8JSLiteral(qtEnvironment.qtLibInfix)); + dict.insert("availableBuildVariants", utf8JSLiteral(qtEnvironment.buildVariant)); + dict.insert("staticBuild", utf8JSLiteral(qtEnvironment.staticBuild)); + dict.insert("frameworkBuild", utf8JSLiteral(qtEnvironment.frameworkBuild)); + dict.insert("name", utf8JSLiteral(module.moduleNameWithoutPrefix())); + dict.insert("has_library", utf8JSLiteral(module.hasLibrary)); + dict.insert("dependencies", utf8JSLiteral(module.dependencies)); + dict.insert("includes", utf8JSLiteral(module.includePaths)); + dict.insert("staticLibsDebug", utf8JSLiteral(module.staticLibrariesDebug)); + dict.insert("staticLibsRelease", utf8JSLiteral(module.staticLibrariesRelease)); + dict.insert("dynamicLibsDebug", utf8JSLiteral(module.dynamicLibrariesDebug)); + dict.insert("dynamicLibsRelease", utf8JSLiteral(module.dynamicLibrariesRelease)); + dict.insert("linkerFlagsDebug", utf8JSLiteral(module.linkerFlagsDebug)); + dict.insert("linkerFlagsRelease", utf8JSLiteral(module.linkerFlagsRelease)); + dict.insert("libraryPaths", utf8JSLiteral(module.libraryPaths)); + dict.insert("frameworkPathsDebug", utf8JSLiteral(module.frameworkPathsDebug)); + dict.insert("frameworkPathsRelease", utf8JSLiteral(module.frameworkPathsRelease)); + dict.insert("frameworksDebug", utf8JSLiteral(module.frameworksDebug)); + dict.insert("frameworksRelease", utf8JSLiteral(module.frameworksRelease)); + dict.insert("libFilePathDebug", utf8JSLiteral(module.libFilePathDebug)); + dict.insert("libFilePathRelease", utf8JSLiteral(module.libFilePathRelease)); + dict.insert("libNameForLinkerDebug", + utf8JSLiteral(module.libNameForLinker(qtEnvironment, true))); + dict.insert("libNameForLinkerRelease", + utf8JSLiteral(module.libNameForLinker(qtEnvironment, false))); + dict.insert("entryPointLibsDebug", utf8JSLiteral(qtEnvironment.entryPointLibsDebug)); + dict.insert("entryPointLibsRelease", utf8JSLiteral(qtEnvironment.entryPointLibsRelease)); + dict.insert("minWinVersion", minVersionJsString(qtEnvironment.windowsVersion)); + dict.insert("minMacVersion", minVersionJsString(qtEnvironment.macosVersion)); + dict.insert("minIosVersion", minVersionJsString(qtEnvironment.iosVersion)); + dict.insert("minTvosVersion", minVersionJsString(qtEnvironment.tvosVersion)); + dict.insert("minWatchosVersion", minVersionJsString(qtEnvironment.watchosVersion)); + dict.insert("minAndroidVersion", minVersionJsString(qtEnvironment.androidVersion)); QByteArray propertiesString; QByteArray compilerDefines = utf8JSLiteral(module.compilerDefines); @@ -477,21 +498,29 @@ static void replaceSpecialValues(QByteArray *content, const Profile &profile, + baIndent + baIndent + "return result;\n" + baIndent + "}"; } - content->replace("@defines@", compilerDefines); + dict.insert("defines", compilerDefines); if (module.qbsName == QLatin1String("gui")) { - content->replace("@defaultQpaPlugin@", - utf8JSLiteral(defaultQpaPlugin(profile, module, qtEnvironment))); + dict.insert("defaultQpaPlugin", + utf8JSLiteral(defaultQpaPlugin(profile, module, qtEnvironment))); } if (module.qbsName == QLatin1String("qml")) - content->replace("@qmlPath@", pathToJSLiteral(qtEnvironment.qmlPath).toUtf8()); + dict.insert("qmlPath", pathToJSLiteral(qtEnvironment.qmlPath).toUtf8()); if (module.isStaticLibrary) { if (!propertiesString.isEmpty()) propertiesString += "\n "; propertiesString += "isStaticLibrary: true"; } if (module.isPlugin) - content->replace("@className@", utf8JSLiteral(module.pluginData.className)); - content->replace("@special_properties@", propertiesString); + dict.insert("className", utf8JSLiteral(module.pluginData.className)); + dict.insert("special_properties", propertiesString); + + for (std::pair<int, int> pos = findVariable(*content, 0); pos.first != -1; + pos = findVariable(*content, pos.first)) { + const QByteArray &replacement = dict.value( + content->mid(pos.first + 1, pos.second - pos.first - 1)); + content->replace(pos.first, pos.second - pos.first + 1, replacement); + pos.first += replacement.length(); + } } static void copyTemplateFile(const QString &fileName, const QString &targetDirectory, |