From a3fbfac814c1a7fe67f8ad64cc71d20a4e8afac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Mu=C4=87ko?= Date: Mon, 28 Mar 2022 16:42:51 +0200 Subject: [PATCH] McuSupport: Automatic memory management for mcu sdk Fix crash while automatically restoring kits during startup. Change packages container to set to avoid duplicates. Use RAII for McuSdkRepository. Change-Id: I4b3f4156f0bc770c8a5ea8a171b1f22f6ffb8f96 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcuabstractpackage.h | 2 + .../mcusupport/mcuabstracttargetfactory.h | 7 +- src/plugins/mcusupport/mcukitmanager.cpp | 102 ++++++++---------- src/plugins/mcusupport/mcukitmanager.h | 16 ++- src/plugins/mcusupport/mcupackage.cpp | 9 +- src/plugins/mcusupport/mcupackage.h | 4 +- src/plugins/mcusupport/mcusupport_global.h | 16 ++- src/plugins/mcusupport/mcusupportoptions.cpp | 56 ++++------ src/plugins/mcusupport/mcusupportoptions.h | 12 +-- .../mcusupport/mcusupportoptionspage.cpp | 49 ++++----- src/plugins/mcusupport/mcusupportplugin.cpp | 10 +- src/plugins/mcusupport/mcusupportsdk.cpp | 62 +++++------ src/plugins/mcusupport/mcusupportsdk.h | 5 +- src/plugins/mcusupport/mcutarget.cpp | 16 +-- src/plugins/mcusupport/mcutarget.h | 14 +-- src/plugins/mcusupport/mcutargetfactory.cpp | 20 ++-- .../mcusupport/mcutargetfactorylegacy.cpp | 43 ++++---- .../mcusupport/mcutargetfactorylegacy.h | 10 +- src/plugins/mcusupport/test/unittest.cpp | 41 +++---- 19 files changed, 229 insertions(+), 265 deletions(-) diff --git a/src/plugins/mcusupport/mcuabstractpackage.h b/src/plugins/mcusupport/mcuabstractpackage.h index 7a7ebd151f2..eafd6604217 100644 --- a/src/plugins/mcusupport/mcuabstractpackage.h +++ b/src/plugins/mcusupport/mcuabstractpackage.h @@ -45,6 +45,8 @@ public: ValidPackage }; + virtual ~McuAbstractPackage() = default; + virtual QString label() const = 0; virtual const QString &cmakeVariableName() const = 0; virtual const QString &environmentVariableName() const = 0; diff --git a/src/plugins/mcusupport/mcuabstracttargetfactory.h b/src/plugins/mcusupport/mcuabstracttargetfactory.h index 1f4b66893a1..8840561d63d 100644 --- a/src/plugins/mcusupport/mcuabstracttargetfactory.h +++ b/src/plugins/mcusupport/mcuabstracttargetfactory.h @@ -34,9 +34,6 @@ namespace McuSupport::Internal { -class McuAbstractPackage; -class McuToolChainPackage; - namespace Sdk { struct McuTargetDescription; @@ -44,11 +41,11 @@ class McuAbstractTargetFactory { public: using Ptr = std::unique_ptr; - ~McuAbstractTargetFactory() = default; + virtual ~McuAbstractTargetFactory() = default; virtual QPair createTargets(const McuTargetDescription &) = 0; using AdditionalPackages - = QPair, QHash>; + = QPair, QHash>; virtual AdditionalPackages getAdditionalPackages() const { return {}; } }; // struct McuAbstractTargetFactory } // namespace Sdk diff --git a/src/plugins/mcusupport/mcukitmanager.cpp b/src/plugins/mcusupport/mcukitmanager.cpp index 45091155f49..ce4f813427a 100644 --- a/src/plugins/mcusupport/mcukitmanager.cpp +++ b/src/plugins/mcusupport/mcukitmanager.cpp @@ -81,7 +81,7 @@ static const int KIT_VERSION = 9; // Bumps up whenever details in Kit creation c class McuKitFactory { public: - static void setKitToolchains(Kit *k, const McuToolChainPackage *tcPackage) + static void setKitToolchains(Kit *k, const McuToolChainPackagePtr &tcPackage) { switch (tcPackage->toolchainType()) { case McuToolChainPackage::ToolChainType::Unsupported: @@ -143,7 +143,7 @@ public: k->setIrrelevantAspects(irrelevant); } - static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage) + static void setKitDebugger(Kit *k, const McuToolChainPackagePtr &tcPackage) { if (tcPackage->isDesktopToolchain()) { // Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain @@ -184,16 +184,16 @@ public: static void setKitDependencies(Kit *k, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage) + const McuPackagePtr &qtForMCUsSdkPackage) { NameValueItems dependencies; - auto processPackage = [&dependencies](const McuAbstractPackage *package) { + auto processPackage = [&dependencies](const McuPackagePtr &package) { const auto cmakeVariableName = package->cmakeVariableName(); if (!cmakeVariableName.isEmpty()) dependencies.append({cmakeVariableName, package->detectionPath().toUserOutput()}); }; - for (auto package : mcuTarget->packages()) + for (const auto &package : mcuTarget->packages()) processPackage(package); processPackage(qtForMCUsSdkPackage); @@ -206,7 +206,7 @@ public: static void setKitEnvironment(Kit *k, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage) + const McuPackagePtr &qtForMCUsSdkPackage) { EnvironmentItems changes; QStringList pathAdditions; // clazy:exclude=inefficient-qlist-soft @@ -218,12 +218,12 @@ public: && !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi()) pathAdditions.append(qtForMCUsSdkPackage->path().pathAppended("bin").toUserOutput()); - auto processPackage = [&pathAdditions](const McuAbstractPackage *package) { + auto processPackage = [&pathAdditions](const McuPackagePtr &package) { if (package->isAddToSystemPath()) pathAdditions.append(package->path().toUserOutput()); }; - for (auto package : mcuTarget->packages()) + for (const auto &package : mcuTarget->packages()) processPackage(package); processPackage(qtForMCUsSdkPackage); @@ -241,7 +241,7 @@ public: static void setKitCMakeOptions(Kit *k, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage) + const McuPackagePtr &qtForMCUsSdkPackage) { using namespace CMakeProjectManager; auto configMap = cMakeConfigToMap(CMakeConfigurationKitAspect::configuration(k)); @@ -298,7 +298,7 @@ public: } } - auto processPackage = [&configMap](const McuAbstractPackage *package) { + auto processPackage = [&configMap](const McuPackagePtr &package) { if (!package->cmakeVariableName().isEmpty()) configMap.insert(package->cmakeVariableName().toUtf8(), package->path().toUserOutput().toUtf8()); @@ -321,9 +321,9 @@ public: }; // class McuKitFactory // Construct kit -Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk) +Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk) { - const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) { + const auto init = [&mcuTarget, qtForMCUsSdk](Kit *k) { KitGuard kitGuard(k); McuKitFactory::setKitProperties(generateKitNameFromTarget(mcuTarget), @@ -348,7 +348,7 @@ Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk) // Kit Information QString generateKitNameFromTarget(const McuTarget *mcuTarget) { - const McuToolChainPackage *tcPkg = mcuTarget->toolChainPackage(); + McuToolChainPackagePtr tcPkg = mcuTarget->toolChainPackage(); const QString compilerName = tcPkg && !tcPkg->isDesktopToolchain() ? QString::fromLatin1(" (%1)").arg( tcPkg->toolChainName().toUpper()) @@ -389,7 +389,7 @@ static FilePath kitDependencyPath(const Kit *kit, const QString &variableName) // Kit Information bool kitIsUpToDate(const Kit *kit, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage) + const McuPackagePtr &qtForMCUsSdkPackage) { return kitQulVersion(kit) == mcuTarget->qulVersion() && kitDependencyPath(kit, qtForMCUsSdkPackage->cmakeVariableName()).toUserOutput() @@ -414,18 +414,17 @@ QList existingKits(const McuTarget *mcuTarget) } // Queries -QList matchingKits(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdkPackage) +QList matchingKits(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdkPackage) { - return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) { + return Utils::filtered(existingKits(mcuTarget), [&mcuTarget, qtForMCUsSdkPackage](Kit *kit) { return kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage); }); } // Queries -QList upgradeableKits(const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage) +QList upgradeableKits(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdkPackage) { - return Utils::filtered(existingKits(mcuTarget), [mcuTarget, qtForMCUsSdkPackage](Kit *kit) { + return Utils::filtered(existingKits(mcuTarget), [&mcuTarget, qtForMCUsSdkPackage](Kit *kit) { return !kitIsUpToDate(kit, mcuTarget, qtForMCUsSdkPackage); }); } @@ -433,10 +432,10 @@ QList upgradeableKits(const McuTarget *mcuTarget, // Queries QList kitsWithMismatchedDependencies(const McuTarget *mcuTarget) { - return Utils::filtered(existingKits(mcuTarget), [mcuTarget](Kit *kit) { + return Utils::filtered(existingKits(mcuTarget), [&mcuTarget](Kit *kit) { const auto entries = Utils::NameValueDictionary( McuDependenciesKitAspect::configuration(kit)); - return Utils::anyOf(mcuTarget->packages(), [&entries](const McuAbstractPackage *package) { + return Utils::anyOf(mcuTarget->packages(), [&entries](const McuPackagePtr &package) { const QString cmakeVariableName = package->cmakeVariableName(); return !cmakeVariableName.isEmpty() && entries.value(cmakeVariableName) != package->path().toUserOutput(); @@ -456,7 +455,7 @@ QList outdatedKits() // Maintenance void createAutomaticKits() { - auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()}; const auto createKits = [qtForMCUsPackage]() { if (McuSupportOptions::automaticKitCreationFromSettings()) { @@ -501,34 +500,29 @@ void createAutomaticKits() } FilePath dir = qtForMCUsPackage->path(); - McuSdkRepository repo; - Sdk::targetsAndPackages(dir, &repo); + McuSdkRepository repo{Sdk::targetsAndPackages(dir)}; bool needsUpgrade = false; for (const auto &target : qAsConst(repo.mcuTargets)) { // if kit already exists, skip - if (!matchingKits(target, qtForMCUsPackage).empty()) + if (!matchingKits(target.get(), qtForMCUsPackage).empty()) continue; - if (!upgradeableKits(target, qtForMCUsPackage).empty()) { + if (!upgradeableKits(target.get(), qtForMCUsPackage).empty()) { // if kit exists but wrong version/path needsUpgrade = true; } else { // if no kits for this target, create if (target->isValid()) - newKit(target, qtForMCUsPackage); + newKit(target.get(), qtForMCUsPackage); target->printPackageProblems(); } } - - repo.deletePackagesAndTargets(); - if (needsUpgrade) McuSupportPlugin::askUserAboutMcuSupportKitsUpgrade(); } }; createKits(); - delete qtForMCUsPackage; } // Maintenance @@ -541,18 +535,17 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption) if (upgradeOption == UpgradeOption::Ignore) return; - auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()}; auto dir = qtForMCUsPackage->path(); - McuSdkRepository repo; - Sdk::targetsAndPackages(dir, &repo); + McuSdkRepository repo{Sdk::targetsAndPackages(dir)}; for (const auto &target : qAsConst(repo.mcuTargets)) { - if (!matchingKits(target, qtForMCUsPackage).empty()) + if (!matchingKits(target.get(), qtForMCUsPackage).empty()) // already up-to-date continue; - const auto kits = upgradeableKits(target, qtForMCUsPackage); + const auto kits = upgradeableKits(target.get(), qtForMCUsPackage); if (!kits.empty()) { if (upgradeOption == UpgradeOption::Replace) { for (auto existingKit : kits) @@ -560,13 +553,10 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption) } if (target->isValid()) - newKit(target, qtForMCUsPackage); + newKit(target.get(), qtForMCUsPackage); target->printPackageProblems(); } } - - repo.deletePackagesAndTargets(); - delete qtForMCUsPackage; } // Maintenance @@ -574,7 +564,7 @@ void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption) // button is available if SDK version changed void upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdk) + const McuPackagePtr &qtForMCUsSdk) { McuKitFactory::setKitProperties(generateKitNameFromTarget(mcuTarget), kit, @@ -590,24 +580,23 @@ void upgradeKitInPlace(ProjectExplorer::Kit *kit, // update the corresponding cmake variables in all existing kits void updatePathsInExistingKits() { - auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()}; FilePath dir = qtForMCUsPackage->path(); - McuSdkRepository repo; - Sdk::targetsAndPackages(dir, &repo); + McuSdkRepository repo{Sdk::targetsAndPackages(dir)}; for (const auto &target : qAsConst(repo.mcuTargets)) { if (target->isValid()) { - for (auto *kit : kitsWithMismatchedDependencies(target)) { + for (auto *kit : kitsWithMismatchedDependencies(target.get())) { auto changes = cMakeConfigToMap(CMakeConfigurationKitAspect::configuration(kit)); - const auto updateForPackage = [&changes](const McuAbstractPackage *package) { + const auto updateForPackage = [&changes](const McuPackagePtr &package) { if (!package->cmakeVariableName().isEmpty() && package->isValidStatus()) { changes.insert(package->cmakeVariableName().toUtf8(), package->path().toUserOutput().toUtf8()); } }; - for (auto package : target->packages()) { + for (const auto &package : target->packages()) { updateForPackage(package); } updateForPackage(qtForMCUsPackage); @@ -618,9 +607,6 @@ void updatePathsInExistingKits() } } } - - repo.deletePackagesAndTargets(); - delete qtForMCUsPackage; } // Maintenance @@ -679,23 +665,19 @@ void fixExistingKits() } // Fix kit dependencies for known targets - auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + McuPackagePtr qtForMCUsPackage{Sdk::createQtForMCUsPackage()}; qtForMCUsPackage->updateStatus(); if (qtForMCUsPackage->isValidStatus()) { FilePath dir = qtForMCUsPackage->path(); - McuSdkRepository repo; - Sdk::targetsAndPackages(dir, &repo); + McuSdkRepository repo{Sdk::targetsAndPackages(dir)}; for (const auto &target : qAsConst(repo.mcuTargets)) - for (auto kit : existingKits(target)) { + for (auto kit : existingKits(target.get())) { if (McuDependenciesKitAspect::dependencies(kit).isEmpty()) { - McuKitFactory::setKitCMakeOptions(kit, target, qtForMCUsPackage); - McuKitFactory::setKitDependencies(kit, target, qtForMCUsPackage); + McuKitFactory::setKitCMakeOptions(kit, target.get(), qtForMCUsPackage); + McuKitFactory::setKitDependencies(kit, target.get(), qtForMCUsPackage); } } - - repo.deletePackagesAndTargets(); } - delete qtForMCUsPackage; } // Maintenance @@ -707,4 +689,4 @@ void removeOutdatedKits() } } // namespace McuKitManager -} // namespace McuSupport::Internal +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcukitmanager.h b/src/plugins/mcusupport/mcukitmanager.h index 025a569e848..7804c4221c2 100644 --- a/src/plugins/mcusupport/mcukitmanager.h +++ b/src/plugins/mcusupport/mcukitmanager.h @@ -35,8 +35,7 @@ namespace ProjectExplorer { class Kit; } // namespace ProjectExplorer -namespace McuSupport { -namespace Internal { +namespace McuSupport::Internal { class McuAbstractPackage; class McuTarget; @@ -45,21 +44,21 @@ namespace McuKitManager { enum class UpgradeOption { Ignore, Keep, Replace }; // Kit Factory -ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuAbstractPackage *qtForMCUsSdk); +ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk); // Kit information QString generateKitNameFromTarget(const McuTarget *mcuTarget); QVersionNumber kitQulVersion(const ProjectExplorer::Kit *kit); bool kitIsUpToDate(const ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage); + const McuPackagePtr &qtForMCUsSdkPackage); // Queries QList existingKits(const McuTarget *mcuTarget); QList matchingKits(const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage); + const McuPackagePtr &qtForMCUsSdkPackage); QList upgradeableKits(const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdkPackage); + const McuPackagePtr &qtForMCUsSdkPackage); QList kitsWithMismatchedDependencies(const McuTarget *mcuTarget); QList outdatedKits(); @@ -68,7 +67,7 @@ void createAutomaticKits(); void upgradeKitsByCreatingNewPackage(UpgradeOption upgradeOption); void upgradeKitInPlace(ProjectExplorer::Kit *kit, const McuTarget *mcuTarget, - const McuAbstractPackage *qtForMCUsSdk); + const McuPackagePtr &qtForMCUsSdk); // Fixing kits: void updatePathsInExistingKits(); @@ -78,7 +77,6 @@ void fixExistingKits(); void removeOutdatedKits(); } // namespace McuKitManager -} // namespace Internal -} // namespace McuSupport +} // namespace McuSupport::Internal Q_DECLARE_METATYPE(McuSupport::Internal::McuKitManager::UpgradeOption) diff --git a/src/plugins/mcusupport/mcupackage.cpp b/src/plugins/mcusupport/mcupackage.cpp index 87199414480..36b479a6b2a 100644 --- a/src/plugins/mcusupport/mcupackage.cpp +++ b/src/plugins/mcusupport/mcupackage.cpp @@ -239,10 +239,7 @@ bool McuPackage::writeToSettings() const QWidget *McuPackage::widget() { - if (m_widget) - return m_widget; - - m_widget = new QWidget; + auto *widget = new QWidget; m_fileChooser = new PathChooser; m_fileChooser->lineEdit()->setButtonIcon(FancyLineEdit::Right, Icons::RESET.icon()); m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true); @@ -250,7 +247,7 @@ QWidget *McuPackage::widget() m_fileChooser->setFilePath(m_defaultPath); }); - auto layout = new QGridLayout(m_widget); + auto layout = new QGridLayout(widget); layout->setContentsMargins(0, 0, 0, 0); m_infoLabel = new InfoLabel(); @@ -277,7 +274,7 @@ QWidget *McuPackage::widget() }); updateStatus(); - return m_widget; + return widget; } McuToolChainPackage::McuToolChainPackage(const QString &label, diff --git a/src/plugins/mcusupport/mcupackage.h b/src/plugins/mcusupport/mcupackage.h index 027dd01c132..166ebcec33c 100644 --- a/src/plugins/mcusupport/mcupackage.h +++ b/src/plugins/mcusupport/mcupackage.h @@ -64,6 +64,8 @@ public: const bool addToPath = false, const Utils::FilePath &relativePathModifier = Utils::FilePath()); + ~McuPackage() override = default; + QString label() const override; const QString &cmakeVariableName() const override; const QString &environmentVariableName() const override; @@ -89,7 +91,6 @@ private: void updatePath(); void updateStatusUi(); - QWidget *m_widget = nullptr; Utils::PathChooser *m_fileChooser = nullptr; Utils::InfoLabel *m_infoLabel = nullptr; @@ -113,6 +114,7 @@ private: class McuToolChainPackage : public McuPackage { + Q_OBJECT public: enum class ToolChainType { IAR, KEIL, MSVC, GCC, ArmGcc, GHS, GHSArm, Unsupported }; diff --git a/src/plugins/mcusupport/mcusupport_global.h b/src/plugins/mcusupport/mcusupport_global.h index 6b2c6a5a981..159f1453ead 100644 --- a/src/plugins/mcusupport/mcusupport_global.h +++ b/src/plugins/mcusupport/mcusupport_global.h @@ -25,9 +25,10 @@ #pragma once -#include #include +#include #include +#include #if defined(MCUSUPPORT_LIBRARY) #define MCUSUPPORTSHARED_EXPORT Q_DECL_EXPORT @@ -39,9 +40,14 @@ namespace McuSupport::Internal { class McuTarget; class McuAbstractPackage; +class McuToolChainPackage; -using Targets = QList; -using Packages = QList; -static const QVersionNumber legacyVersion {2, 0, 0}; +using McuPackagePtr = QSharedPointer; +using McuToolChainPackagePtr = QSharedPointer; +using McuTargetPtr = QSharedPointer; -} +using Targets = QList; +using Packages = QSet; +static const QVersionNumber legacyVersion{2, 0, 0}; + +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index b721cab550b..00cfde16d85 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -45,38 +45,28 @@ #include #include -using CMakeProjectManager::CMakeConfigItem; -using CMakeProjectManager::CMakeConfigurationKitAspect; using namespace ProjectExplorer; using namespace Utils; -namespace McuSupport { -namespace Internal { +namespace McuSupport::Internal { -void McuSdkRepository::deletePackagesAndTargets() -{ - qDeleteAll(packages); - packages.clear(); - mcuTargets.clear(); +namespace { +const QString automaticKitCreationSettingsKey = QLatin1String(Constants::SETTINGS_GROUP) + '/' + + QLatin1String( + Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION); } McuSupportOptions::McuSupportOptions(QObject *parent) : QObject(parent) , qtForMCUsSdkPackage(Sdk::createQtForMCUsPackage()) { - connect(qtForMCUsSdkPackage, + connect(qtForMCUsSdkPackage.get(), &McuAbstractPackage::changed, this, &McuSupportOptions::populatePackagesAndTargets); m_automaticKitCreation = automaticKitCreationFromSettings(); } -McuSupportOptions::~McuSupportOptions() -{ - deletePackagesAndTargets(); - delete qtForMCUsSdkPackage; -} - void McuSupportOptions::populatePackagesAndTargets() { setQulDir(qtForMCUsSdkPackage->path()); @@ -129,12 +119,16 @@ const QVersionNumber &McuSupportOptions::minimalQulVersion() void McuSupportOptions::setQulDir(const FilePath &dir) { - deletePackagesAndTargets(); qtForMCUsSdkPackage->updateStatus(); if (qtForMCUsSdkPackage->isValidStatus()) - Sdk::targetsAndPackages(dir, &sdkRepository); + sdkRepository = Sdk::targetsAndPackages(dir); + else + sdkRepository = McuSdkRepository{}; for (const auto &package : qAsConst(sdkRepository.packages)) - connect(package, &McuAbstractPackage::changed, this, &McuSupportOptions::packagesChanged); + connect(package.get(), + &McuAbstractPackage::changed, + this, + &McuSupportOptions::packagesChanged); emit packagesChanged(); } @@ -167,19 +161,14 @@ McuKitManager::UpgradeOption McuSupportOptions::askForKitUpgrades() return McuKitManager::UpgradeOption::Ignore; } -void McuSupportOptions::deletePackagesAndTargets() -{ - sdkRepository.deletePackagesAndTargets(); -} - void McuSupportOptions::checkUpgradeableKits() { - if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.size() == 0) + if (!qtForMCUsSdkPackage->isValidStatus() || sdkRepository.mcuTargets.isEmpty()) return; - if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTarget *target) { - return !McuKitManager::upgradeableKits(target, this->qtForMCUsSdkPackage).empty() - && McuKitManager::matchingKits(target, this->qtForMCUsSdkPackage).empty(); + if (Utils::anyOf(sdkRepository.mcuTargets, [this](const McuTargetPtr &target) { + return !McuKitManager::upgradeableKits(target.get(), this->qtForMCUsSdkPackage).empty() + && McuKitManager::matchingKits(target.get(), this->qtForMCUsSdkPackage).empty(); })) McuKitManager::upgradeKitsByCreatingNewPackage(askForKitUpgrades()); } @@ -203,20 +192,15 @@ void McuSupportOptions::setAutomaticKitCreationEnabled(const bool enabled) void McuSupportOptions::writeGeneralSettings() const { - const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' - + QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION); QSettings *settings = Core::ICore::settings(QSettings::UserScope); - settings->setValue(key, m_automaticKitCreation); + settings->setValue(automaticKitCreationSettingsKey, m_automaticKitCreation); } bool McuSupportOptions::automaticKitCreationFromSettings() { QSettings *settings = Core::ICore::settings(QSettings::UserScope); - const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' - + QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION); - const bool automaticKitCreation = settings->value(key, true).toBool(); + const bool automaticKitCreation = settings->value(automaticKitCreationSettingsKey, true).toBool(); return automaticKitCreation; } -} // namespace Internal -} // namespace McuSupport +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index a65ec4298ca..351dcbc34f6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -51,23 +51,21 @@ namespace Internal { class McuAbstractPackage; -class McuSdkRepository +class McuSdkRepository final { public: - Packages packages; Targets mcuTargets; - void deletePackagesAndTargets(); + Packages packages; }; -class McuSupportOptions : public QObject +class McuSupportOptions final : public QObject { Q_OBJECT public: explicit McuSupportOptions(QObject *parent = nullptr); - ~McuSupportOptions() override; - McuAbstractPackage *qtForMCUsSdkPackage = nullptr; + McuPackagePtr qtForMCUsSdkPackage{nullptr}; McuSdkRepository sdkRepository; void setQulDir(const Utils::FilePath &dir); @@ -90,8 +88,6 @@ public: static bool automaticKitCreationFromSettings(); private: - void deletePackagesAndTargets(); - bool m_automaticKitCreation = true; signals: void packagesChanged(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index e3a0a962d84..54a8414859a 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -51,8 +51,7 @@ #include #include -namespace McuSupport { -namespace Internal { +namespace McuSupport::Internal { class McuSupportOptionsWidget : public Core::IOptionsPageWidget { @@ -63,7 +62,7 @@ public: void updateStatus(); void showMcuTargetPackages(); - McuTarget *currentMcuTarget() const; + McuTargetPtr currentMcuTarget() const; private: void apply() final; @@ -73,8 +72,8 @@ private: QString m_armGccPath; McuSupportOptions m_options; - QMap m_packageWidgets; - QMap m_mcuTargetPacketWidgets; + QMap m_packageWidgets; + QMap m_mcuTargetPacketWidgets; QFormLayout *m_packagesLayout = nullptr; QGroupBox *m_qtForMCUsSdkGroupBox = nullptr; QGroupBox *m_packagesGroupBox = nullptr; @@ -123,7 +122,7 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() &QComboBox::currentTextChanged, this, &McuSupportOptionsWidget::showMcuTargetPackages); - connect(m_options.qtForMCUsSdkPackage, + connect(m_options.qtForMCUsSdkPackage.get(), &McuAbstractPackage::changed, this, &McuSupportOptionsWidget::populateMcuTargetsComboBox); @@ -161,17 +160,17 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() m_kitCreationPushButton = new QPushButton(tr("Create Kit")); m_kitCreationPushButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); connect(m_kitCreationPushButton, &QPushButton::clicked, this, [this] { - McuKitManager::newKit(currentMcuTarget(), m_options.qtForMCUsSdkPackage); + McuKitManager::newKit(currentMcuTarget().get(), m_options.qtForMCUsSdkPackage); McuSupportOptions::registerQchFiles(); updateStatus(); }); m_kitUpdatePushButton = new QPushButton(tr("Update Kit")); m_kitUpdatePushButton->setSizePolicy(m_kitCreationPushButton->sizePolicy()); connect(m_kitUpdatePushButton, &QPushButton::clicked, this, [this] { - for (auto kit : - McuKitManager::upgradeableKits(currentMcuTarget(), m_options.qtForMCUsSdkPackage)) + for (auto kit : McuKitManager::upgradeableKits(currentMcuTarget().get(), + m_options.qtForMCUsSdkPackage)) McuKitManager::upgradeKitInPlace(kit, - currentMcuTarget(), + currentMcuTarget().get(), m_options.qtForMCUsSdkPackage); updateStatus(); }); @@ -191,7 +190,7 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() void McuSupportOptionsWidget::updateStatus() { - const McuTarget *mcuTarget = currentMcuTarget(); + const McuTargetPtr mcuTarget = currentMcuTarget(); const bool cMakeAvailable = !CMakeProjectManager::CMakeToolManager::cmakeTools().isEmpty(); @@ -222,11 +221,12 @@ void McuSupportOptionsWidget::updateStatus() m_kitCreationPushButton->setVisible(mcuTargetValid); m_kitUpdatePushButton->setVisible(mcuTargetValid); if (mcuTargetValid) { - const bool hasMatchingKits - = !McuKitManager::matchingKits(mcuTarget, m_options.qtForMCUsSdkPackage).isEmpty(); + const bool hasMatchingKits = !McuKitManager::matchingKits(mcuTarget.get(), + m_options.qtForMCUsSdkPackage) + .isEmpty(); const bool hasUpgradeableKits = !hasMatchingKits - && !McuKitManager::upgradeableKits(mcuTarget, m_options.qtForMCUsSdkPackage) + && !McuKitManager::upgradeableKits(mcuTarget.get(), m_options.qtForMCUsSdkPackage) .isEmpty(); m_kitCreationPushButton->setEnabled(!hasMatchingKits); @@ -263,7 +263,7 @@ void McuSupportOptionsWidget::updateStatus() void McuSupportOptionsWidget::showMcuTargetPackages() { - const McuTarget *mcuTarget = currentMcuTarget(); + McuTargetPtr mcuTarget = currentMcuTarget(); if (!mcuTarget) return; @@ -273,7 +273,7 @@ void McuSupportOptionsWidget::showMcuTargetPackages() row.fieldItem->widget()->hide(); } - for (auto package : qAsConst(m_options.sdkRepository.packages)) { + for (const auto &package : qAsConst(m_options.sdkRepository.packages)) { QWidget *packageWidget = package->widget(); if (!mcuTarget->packages().contains(package)) continue; @@ -284,12 +284,14 @@ void McuSupportOptionsWidget::showMcuTargetPackages() updateStatus(); } -McuTarget *McuSupportOptionsWidget::currentMcuTarget() const +McuTargetPtr McuSupportOptionsWidget::currentMcuTarget() const { const int mcuTargetIndex = m_mcuTargetsComboBox->currentIndex(); - return (mcuTargetIndex == -1 || m_options.sdkRepository.mcuTargets.isEmpty()) - ? nullptr - : m_options.sdkRepository.mcuTargets.at(mcuTargetIndex); + McuTargetPtr target{nullptr}; + if (mcuTargetIndex != -1 && !m_options.sdkRepository.mcuTargets.isEmpty()) + target = m_options.sdkRepository.mcuTargets.at(mcuTargetIndex); + + return target; } void McuSupportOptionsWidget::showEvent(QShowEvent *event) @@ -318,8 +320,8 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox() m_options.populatePackagesAndTargets(); m_mcuTargetsComboBox->clear(); m_mcuTargetsComboBox->addItems( - Utils::transform(m_options.sdkRepository.mcuTargets, [](McuTarget *t) { - return McuKitManager::generateKitNameFromTarget(t); + Utils::transform(m_options.sdkRepository.mcuTargets, [](const McuTargetPtr &t) { + return McuKitManager::generateKitNameFromTarget(t.get()); })); updateStatus(); } @@ -332,5 +334,4 @@ McuSupportOptionsPage::McuSupportOptionsPage() setWidgetCreator([] { return new McuSupportOptionsWidget; }); } -} // namespace Internal -} // namespace McuSupport +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportplugin.cpp b/src/plugins/mcusupport/mcusupportplugin.cpp index 41abf94f836..896f839e5fe 100644 --- a/src/plugins/mcusupport/mcusupportplugin.cpp +++ b/src/plugins/mcusupport/mcusupportplugin.cpp @@ -25,10 +25,10 @@ #include "mcusupportplugin.h" #include "mcukitinformation.h" +#include "mcukitmanager.h" #include "mcusupportconstants.h" #include "mcusupportdevice.h" #include "mcusupportoptions.h" -#include "mcukitmanager.h" #include "mcusupportoptionspage.h" #include "mcusupportrunconfiguration.h" @@ -52,6 +52,10 @@ using namespace Core; using namespace ProjectExplorer; +namespace { +constexpr char setupMcuSupportKits[]{"SetupMcuSupportKits"}; +} + namespace McuSupport { namespace Internal { @@ -114,8 +118,6 @@ void McuSupportPlugin::extensionsInitialized() void McuSupportPlugin::askUserAboutMcuSupportKitsSetup() { - const char setupMcuSupportKits[] = "SetupMcuSupportKits"; - if (!ICore::infoBar()->canInfoBeAdded(setupMcuSupportKits) || McuSupportOptions::qulDirFromSettings().isEmpty() || !McuKitManager::existingKits(nullptr).isEmpty()) @@ -126,7 +128,7 @@ void McuSupportPlugin::askUserAboutMcuSupportKitsSetup() "To do it later, select Options > Devices > MCU."), Utils::InfoBarEntry::GlobalSuppression::Enabled); // clazy:excludeall=connect-3arg-lambda - info.addCustomButton(tr("Create Kits for Qt for MCUs"), [setupMcuSupportKits] { + info.addCustomButton(tr("Create Kits for Qt for MCUs"), [] { ICore::infoBar()->removeInfo(setupMcuSupportKits); QTimer::singleShot(0, []() { ICore::showOptionsDialog(Constants::SETTINGS_ID); }); }); diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 8ac324b817a..4cce7095757 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -52,7 +52,6 @@ #include #include -#include #include using namespace Utils; @@ -416,22 +415,22 @@ static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy) { McuAbstractTargetFactory::Ptr result; if (isLegacy) { - static const QHash tcPkgs = { - {{"armgcc"}, createArmGccToolchainPackage()}, - {{"greenhills"}, createGhsToolchainPackage()}, - {{"iar"}, createIarToolChainPackage()}, - {{"msvc"}, createMsvcToolChainPackage()}, - {{"gcc"}, createGccToolChainPackage()}, - {{"arm-greenhills"}, createGhsArmToolchainPackage()}, + static const QHash tcPkgs = { + {{"armgcc"}, McuToolChainPackagePtr{createArmGccToolchainPackage()}}, + {{"greenhills"}, McuToolChainPackagePtr{createGhsToolchainPackage()}}, + {{"iar"}, McuToolChainPackagePtr{createIarToolChainPackage()}}, + {{"msvc"}, McuToolChainPackagePtr{createMsvcToolChainPackage()}}, + {{"gcc"}, McuToolChainPackagePtr{createGccToolChainPackage()}}, + {{"arm-greenhills"}, McuToolChainPackagePtr{createGhsArmToolchainPackage()}}, }; // Note: the vendor name (the key of the hash) is case-sensitive. It has to match the "platformVendor" key in the // json file. - static const QHash vendorPkgs = { - {{"ST"}, createStm32CubeProgrammerPackage()}, - {{"NXP"}, createMcuXpressoIdePackage()}, - {{"CYPRESS"}, createCypressProgrammerPackage()}, - {{"RENESAS"}, createRenesasProgrammerPackage()}, + static const QHash vendorPkgs = { + {{"ST"}, McuPackagePtr{createStm32CubeProgrammerPackage()}}, + {{"NXP"}, McuPackagePtr{createMcuXpressoIdePackage()}}, + {{"CYPRESS"}, McuPackagePtr{createCypressProgrammerPackage()}}, + {{"RENESAS"}, McuPackagePtr{createRenesasProgrammerPackage()}}, }; result = std::make_unique(tcPkgs, vendorPkgs); @@ -441,8 +440,8 @@ static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy) return result; } -QPair targetsFromDescriptions(const QList &descriptions, - bool isLegacy) +McuSdkRepository targetsFromDescriptions(const QList &descriptions, + bool isLegacy) { Targets mcuTargets; Packages mcuPackages; @@ -451,19 +450,19 @@ QPair targetsFromDescriptions(const QListcreateTargets(desc); mcuTargets.append(targets); - mcuPackages.append(packages); + mcuPackages.unite(packages); } if (isLegacy) { auto [toolchainPkgs, vendorPkgs]{targetFactory->getAdditionalPackages()}; - for (McuAbstractPackage *package : toolchainPkgs) { - mcuPackages.append(package); + for (McuToolChainPackagePtr &package : toolchainPkgs) { + mcuPackages.insert(package); } - for (McuAbstractPackage *package : vendorPkgs) { - mcuPackages.append(package); + for (McuPackagePtr &package : vendorPkgs) { + mcuPackages.insert(package); } } - return {mcuTargets, mcuPackages}; + return McuSdkRepository{mcuTargets, mcuPackages}; } Utils::FilePath kitsPath(const Utils::FilePath &dir) @@ -587,7 +586,7 @@ bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message) return false; } -void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo) +McuSdkRepository targetsAndPackages(const Utils::FilePath &dir) { QList descriptions; @@ -637,26 +636,23 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo) printMessage(McuTarget::tr("No valid kit descriptions found at %1.") .arg(kitsPath(dir).toUserOutput()), true); - return; + return McuSdkRepository{}; } else { QString deprecationMessage; if (checkDeprecatedSdkError(dir, deprecationMessage)) { printMessage(deprecationMessage, true); - return; + return McuSdkRepository{}; } } } - const auto tmpTargetLists = targetsFromDescriptions(descriptions, isLegacy); - repo->mcuTargets = tmpTargetLists.first; - repo->packages = tmpTargetLists.second; + McuSdkRepository repo = targetsFromDescriptions(descriptions, isLegacy); // Keep targets sorted lexicographically - std::sort(repo->mcuTargets.begin(), - repo->mcuTargets.end(), - [](const McuTarget *lhs, const McuTarget *rhs) { - return McuKitManager::generateKitNameFromTarget(lhs) - < McuKitManager::generateKitNameFromTarget(rhs); - }); + Utils::sort(repo.mcuTargets, [](const McuTargetPtr &lhs, const McuTargetPtr &rhs) { + return McuKitManager::generateKitNameFromTarget(lhs.get()) + < McuKitManager::generateKitNameFromTarget(rhs.get()); + }); + return repo; } FilePath packagePathFromSettings(const QString &settingsKey, diff --git a/src/plugins/mcusupport/mcusupportsdk.h b/src/plugins/mcusupport/mcusupportsdk.h index 7a0d0fdce0e..2989a0d8502 100644 --- a/src/plugins/mcusupport/mcusupportsdk.h +++ b/src/plugins/mcusupport/mcusupportsdk.h @@ -29,7 +29,6 @@ #include -#include #include namespace McuSupport::Internal { @@ -49,10 +48,10 @@ McuAbstractPackage *createQtForMCUsPackage(); bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message); -void targetsAndPackages(const Utils::FilePath &qulDir, McuSdkRepository *repo); +McuSdkRepository targetsAndPackages(const Utils::FilePath &qulDir); McuTargetDescription parseDescriptionJson(const QByteArray &); -QPair targetsFromDescriptions(const QList &, bool isLegacy); +McuSdkRepository targetsFromDescriptions(const QList &, bool isLegacy); Utils::FilePath kitsPath(const Utils::FilePath &dir); diff --git a/src/plugins/mcusupport/mcutarget.cpp b/src/plugins/mcusupport/mcutarget.cpp index bf151b0bac2..b1cf475671c 100644 --- a/src/plugins/mcusupport/mcutarget.cpp +++ b/src/plugins/mcusupport/mcutarget.cpp @@ -24,8 +24,8 @@ ****************************************************************************/ #include "mcutarget.h" -#include "mcupackage.h" #include "mcukitmanager.h" +#include "mcupackage.h" #include "mcusupportplugin.h" #include @@ -37,8 +37,8 @@ namespace McuSupport::Internal { McuTarget::McuTarget(const QVersionNumber &qulVersion, const Platform &platform, OS os, - const Packages& packages, - const McuToolChainPackage *toolChainPackage, + const Packages &packages, + const McuToolChainPackagePtr &toolChainPackage, int colorDepth) : m_qulVersion(qulVersion) , m_platform(platform) @@ -48,12 +48,12 @@ McuTarget::McuTarget(const QVersionNumber &qulVersion, , m_colorDepth(colorDepth) {} -const Packages &McuTarget::packages() const +Packages McuTarget::packages() const { return m_packages; } -const McuToolChainPackage *McuTarget::toolChainPackage() const +McuToolChainPackagePtr McuTarget::toolChainPackage() const { return m_toolChainPackage; } @@ -63,14 +63,14 @@ McuTarget::OS McuTarget::os() const return m_os; } -const McuTarget::Platform &McuTarget::platform() const +McuTarget::Platform McuTarget::platform() const { return m_platform; } bool McuTarget::isValid() const { - return Utils::allOf(packages(), [](McuAbstractPackage *package) { + return Utils::allOf(packages(), [](const McuPackagePtr &package) { package->updateStatus(); return package->isValidStatus(); }); @@ -95,7 +95,7 @@ void McuTarget::printPackageProblems() const } } -const QVersionNumber &McuTarget::qulVersion() const +QVersionNumber McuTarget::qulVersion() const { return m_qulVersion; } diff --git a/src/plugins/mcusupport/mcutarget.h b/src/plugins/mcusupport/mcutarget.h index 602451a7790..343eb8a431d 100644 --- a/src/plugins/mcusupport/mcutarget.h +++ b/src/plugins/mcusupport/mcutarget.h @@ -63,14 +63,14 @@ public: McuTarget(const QVersionNumber &qulVersion, const Platform &platform, OS os, - const Packages& packages, - const McuToolChainPackage *toolChainPackage, + const Packages &packages, + const McuToolChainPackagePtr &toolChainPackage, int colorDepth = UnspecifiedColorDepth); - const QVersionNumber &qulVersion() const; - const Packages &packages() const; - const McuToolChainPackage *toolChainPackage() const; - const Platform &platform() const; + QVersionNumber qulVersion() const; + Packages packages() const; + McuToolChainPackagePtr toolChainPackage() const; + Platform platform() const; OS os() const; int colorDepth() const; bool isValid() const; @@ -81,7 +81,7 @@ private: const Platform m_platform; const OS m_os; const Packages m_packages; - const McuToolChainPackage* m_toolChainPackage; + McuToolChainPackagePtr m_toolChainPackage; const int m_colorDepth; }; // class McuTarget diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index bc68c47e0a1..6b4e14053c6 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -43,13 +43,15 @@ QPair McuTargetFactory::createTargets(const McuTargetDescript {desc.platform.id, desc.platform.name, desc.platform.vendor}); Packages targetPackages = createPackages(desc); - packages.append(targetPackages); - mcuTargets.append(new McuTarget{QVersionNumber::fromString(desc.qulVersion), - platform, - deduceOperatingSystem(desc), - targetPackages, - new McuToolChainPackage{{}, {}, {}, {}, {}}, - colorDepth}); + packages.unite(targetPackages); + mcuTargets.append(McuTargetPtr{ + new McuTarget{QVersionNumber::fromString(desc.qulVersion), + platform, + deduceOperatingSystem(desc), + targetPackages, + McuToolChainPackagePtr{new McuToolChainPackage{ + {}, {}, {}, {}, McuToolChainPackage::ToolChainType::Unsupported}}, + colorDepth}}); } return {mcuTargets, packages}; } @@ -69,14 +71,14 @@ Packages McuTargetFactory::createPackages(const McuTargetDescription &desc) QList packageDescriptions = aggregatePackageEntries(desc); for (const PackageDescription &pkgDesc : packageDescriptions) { - packages.append(new McuPackage{ + packages.insert(McuPackagePtr{new McuPackage{ pkgDesc.label, pkgDesc.defaultPath, pkgDesc.validationPath, pkgDesc.setting, pkgDesc.cmakeVar, pkgDesc.envVar, - }); + }}); } return packages; diff --git a/src/plugins/mcusupport/mcutargetfactorylegacy.cpp b/src/plugins/mcusupport/mcutargetfactorylegacy.cpp index adbd9ac0c0a..933094c41eb 100644 --- a/src/plugins/mcusupport/mcutargetfactorylegacy.cpp +++ b/src/plugins/mcusupport/mcutargetfactorylegacy.cpp @@ -38,67 +38,68 @@ namespace McuSupport::Internal::Sdk { QPair McuTargetFactoryLegacy::createTargets(const McuTargetDescription &desc) { - QHash boardSdkPkgs; - QHash freeRTOSPkgs; + QHash boardSdkPkgs; + QHash freeRTOSPkgs; Targets mcuTargets; Packages packages; - McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id); + McuToolChainPackagePtr tcPkg = tcPkgs.value(desc.toolchain.id); if (tcPkg) { tcPkg->setVersions(desc.toolchain.versions); } else { - tcPkg = createUnsupportedToolChainPackage(); + tcPkg.reset(createUnsupportedToolChainPackage()); } for (int colorDepth : desc.platform.colorDepths) { Packages required3rdPartyPkgs; // Desktop toolchains don't need any additional settings if (tcPkg && !tcPkg->isDesktopToolchain() && tcPkg->toolchainType() != McuToolChainPackage::ToolChainType::Unsupported) { - required3rdPartyPkgs.append(tcPkg); + required3rdPartyPkgs.insert(tcPkg); } // Add setting specific to platform IDE. if (vendorPkgs.contains(desc.platform.vendor)) { - required3rdPartyPkgs.append(vendorPkgs.value(desc.platform.vendor)); + required3rdPartyPkgs.insert(vendorPkgs.value(desc.platform.vendor)); } // Board SDK specific settings Utils::FilePath boardSdkDefaultPath; if (!desc.boardSdk.envVar.isEmpty()) { if (!boardSdkPkgs.contains(desc.boardSdk.envVar)) { - McuAbstractPackage *boardSdkPkg = createBoardSdkPackage(desc); + McuPackagePtr boardSdkPkg{createBoardSdkPackage(desc)}; boardSdkPkgs.insert(desc.boardSdk.envVar, boardSdkPkg); } - McuAbstractPackage *boardSdkPkg{boardSdkPkgs.value(desc.boardSdk.envVar)}; + McuPackagePtr boardSdkPkg{boardSdkPkgs.value(desc.boardSdk.envVar)}; boardSdkPkg->setVersions(desc.boardSdk.versions); boardSdkDefaultPath = boardSdkPkg->defaultPath(); - required3rdPartyPkgs.append(boardSdkPkg); + required3rdPartyPkgs.insert(boardSdkPkg); } // Free RTOS specific settings. if (!desc.freeRTOS.envVar.isEmpty()) { if (!freeRTOSPkgs.contains(desc.freeRTOS.envVar)) { freeRTOSPkgs.insert(desc.freeRTOS.envVar, - createFreeRTOSSourcesPackage(desc.freeRTOS.envVar, - boardSdkDefaultPath, - desc.freeRTOS.boardSdkSubDir)); + McuPackagePtr{ + createFreeRTOSSourcesPackage(desc.freeRTOS.envVar, + boardSdkDefaultPath, + desc.freeRTOS.boardSdkSubDir)}); } - required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOS.envVar)); + required3rdPartyPkgs.insert(freeRTOSPkgs.value(desc.freeRTOS.envVar)); } - packages.append(required3rdPartyPkgs); + packages.unite(required3rdPartyPkgs); const McuTarget::Platform platform( {desc.platform.id, desc.platform.name, desc.platform.vendor}); - mcuTargets.push_back(new McuTarget{QVersionNumber::fromString(desc.qulVersion), - platform, - deduceOperatingSystem(desc), - required3rdPartyPkgs, - tcPkg, - colorDepth}); + mcuTargets.push_back(McuTargetPtr{new McuTarget{QVersionNumber::fromString(desc.qulVersion), + platform, + deduceOperatingSystem(desc), + required3rdPartyPkgs, + tcPkg, + colorDepth}}); } return {mcuTargets, packages}; } -McuTargetFactoryLegacy::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const +McuAbstractTargetFactory::AdditionalPackages McuTargetFactoryLegacy::getAdditionalPackages() const { return {tcPkgs, vendorPkgs}; } diff --git a/src/plugins/mcusupport/mcutargetfactorylegacy.h b/src/plugins/mcusupport/mcutargetfactorylegacy.h index ab6626c289d..8b740d51dca 100644 --- a/src/plugins/mcusupport/mcutargetfactorylegacy.h +++ b/src/plugins/mcusupport/mcutargetfactorylegacy.h @@ -35,20 +35,18 @@ namespace McuSupport::Internal::Sdk { class McuTargetFactoryLegacy : public McuAbstractTargetFactory { public: - McuTargetFactoryLegacy(const QHash &tcPkgs, - const QHash &vendorPkgs) + McuTargetFactoryLegacy(const QHash &tcPkgs, + const QHash &vendorPkgs) : tcPkgs(tcPkgs) , vendorPkgs(vendorPkgs) {} QPair createTargets(const McuTargetDescription &) override; - using AdditionalPackages - = QPair, QHash>; AdditionalPackages getAdditionalPackages() const override; private: - const QHash tcPkgs; - const QHash vendorPkgs; + const QHash tcPkgs; + const QHash vendorPkgs; }; // struct McuTargetFactoryLegacy } // namespace McuSupport::Internal::Sdk diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 59a53fa5344..bd357f2e2aa 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -96,34 +96,34 @@ void McuSupportTest::test_parseCmakeEntries() void McuSupportTest::test_addNewKit() { const QString cmakeVar = "CMAKE_SDK"; - McuPackage sdkPackage{"sdk", // label - {}, // defaultPath - {}, // detectionPath - "sdk", // settingsKey - cmakeVar, // cmake var - {}}; // env var + McuPackagePtr sdkPackage{new McuPackage{"sdk", // label + {}, // defaultPath + {}, // detectionPath + "sdk", // settingsKey + cmakeVar, // cmake var + {}}}; // env var ProjectExplorer::Kit kit; - McuToolChainPackage - toolchainPackage{{}, // label - {}, // defaultPath - {}, // detectionPath - {}, // settingsKey - McuToolChainPackage::ToolChainType::Unsupported, // toolchain type - {}, // cmake var name - {}}; // env var name + McuToolChainPackagePtr toolchainPackage{ + new McuToolChainPackage{{}, // label + {}, // defaultPath + {}, // detectionPath + {}, // settingsKey + McuToolChainPackage::ToolChainType::Unsupported, // toolchain type + {}, // cmake var name + {}}}; // env var name const McuTarget::Platform platform{id, name, vendor}; McuTarget mcuTarget{currentQulVersion, // version platform, // platform McuTarget::OS::FreeRTOS, // os - {&sdkPackage}, // packages - &toolchainPackage}; // toolchain packages + {sdkPackage}, // packages + toolchainPackage}; // toolchain packages auto &kitManager{*KitManager::instance()}; QSignalSpy kitAddedSpy(&kitManager, &KitManager::kitAdded); - auto *newKit{McuKitManager::newKit(&mcuTarget, &sdkPackage)}; + auto *newKit{McuKitManager::newKit(&mcuTarget, sdkPackage)}; QVERIFY(newKit != nullptr); QCOMPARE(kitAddedSpy.count(), 1); @@ -265,10 +265,11 @@ void McuSupportTest::test_createTargetsTheNewWay() Sdk::McuTargetFactory targetFactory{}; const auto [targets, packages]{targetFactory.createTargets(description)}; QVERIFY(not targets.empty()); - QCOMPARE(targets.at(0)->colorDepth(), colorDepth); - const auto &tgtPackages{targets.at(0)->packages()}; + const McuTargetPtr target{*targets.constBegin()}; + QCOMPARE(target->colorDepth(), colorDepth); + const auto &tgtPackages{target->packages()}; QVERIFY(not tgtPackages.empty()); - const auto rtosPackage{tgtPackages.first()}; + const auto rtosPackage{*tgtPackages.constBegin()}; QCOMPARE(rtosPackage->environmentVariableName(), nxp1064FreeRtosEnvVar); }