From 3aea3a13cb43053cf0675fee2dca2cef500cde11 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 11 Mar 2019 16:59:16 +0100 Subject: [PATCH] ProjectExplorer: Refactor KitManager::registerKit() The interface of this function was rather unfortunate. In particluar, the fact that it took ownership of the std::unique_ptr that was passed in required some weird boiler plate code at all the calling sites. Instead, it now becomes a proper factory function. Change-Id: Iecdc6f6345232fc0f0a08bffaf8f1780edb57201 Reviewed-by: hjk --- src/plugins/android/androidconfigurations.cpp | 43 ++++++++-------- src/plugins/ios/iosconfigurations.cpp | 21 ++++---- src/plugins/projectexplorer/kitmanager.cpp | 16 +++--- src/plugins/projectexplorer/kitmanager.h | 2 +- .../kitmanagerconfigwidget.cpp | 20 +++----- .../projectexplorer/projectimporter.cpp | 21 ++++---- .../tests/qmlprofilerattachdialog_test.cpp | 9 ++-- .../tests/qmlprofilertool_test.cpp | 7 ++- src/plugins/qnx/qnxconfiguration.cpp | 51 +++++++++---------- 9 files changed, 89 insertions(+), 101 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 88c3e92a42f..d3fa85a9300 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1082,32 +1082,35 @@ void AndroidConfigurations::updateAutomaticKitList() QtSupport::QtKitAspect::setQtVersion(k, qt); DeviceKitAspect::setDevice(k, device); }; + const auto initStage2 = [tc](Kit *k, const QtSupport::BaseQtVersion *qt) { + Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc)); + AndroidGdbServerKitAspect::setGdbSever(k, currentConfig().gdbServer(tc->targetAbi())); + k->makeSticky(); + k->setUnexpandedDisplayName(tr("Android for %1 (Clang %2)") + .arg(static_cast(qt)->targetArch()) + .arg(qt->displayName())); + }; for (const QtSupport::BaseQtVersion *qt : qtVersionsForArch.value(tc->targetAbi())) { - auto newKit = std::make_unique(); - Kit *toSetup = newKit.get(); - initBasicKitData(toSetup, qt); - Kit *existingKit = Utils::findOrDefault(existingKits, [toSetup](const Kit *k) { - return matchKits(toSetup, k); - }); - if (existingKit) { + Kit *existingKit = nullptr; + const auto initializeKit = [&](Kit *k) { + initBasicKitData(k, qt); + existingKit = Utils::findOrDefault(existingKits, [k](const Kit *existing) { + return matchKits(k, existing); + }); + if (existingKit) + return false; + initStage2(k, qt); + return true; + }; + Kit * const newKit = KitManager::registerKit(initializeKit); + QTC_ASSERT(!newKit != !existingKit, continue); + if (!newKit) { // Existing kit found. // Update the existing kit with new data. initBasicKitData(existingKit, qt); - newKit.reset(); - toSetup = existingKit; + initStage2(existingKit, qt); } - - Debugger::DebuggerKitAspect::setDebugger(toSetup, findOrRegisterDebugger(tc)); - - AndroidGdbServerKitAspect::setGdbSever(toSetup, currentConfig().gdbServer(tc->targetAbi())); - toSetup->makeSticky(); - - toSetup->setUnexpandedDisplayName(tr("Android for %1 (Clang %2)") - .arg(static_cast(qt)->targetArch()) - .arg(qt->displayName())); - if (!existingKit) - KitManager::registerKit(std::move(newKit)); } } } diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 0cdb7198520..1f351044184 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -300,17 +300,16 @@ void IosConfigurations::updateAutomaticKitList() kit->unblockNotification(); } else { qCDebug(kitSetupLog) << " - Setting up new kit"; - auto newKit = std::make_unique(); - kit = newKit.get(); - kit->blockNotification(); - kit->setAutoDetected(true); - const QString baseDisplayName = isSimulatorDeviceId(pDeviceType) - ? tr("%1 Simulator").arg(qtVersion->unexpandedDisplayName()) - : qtVersion->unexpandedDisplayName(); - kit->setUnexpandedDisplayName(baseDisplayName); - setupKit(kit, pDeviceType, platformToolchains, debuggerId, sdk.path, qtVersion); - kit->unblockNotification(); - KitManager::registerKit(std::move(newKit)); + const auto init = [&](Kit *k) { + k->setAutoDetected(true); + const QString baseDisplayName = isSimulatorDeviceId(pDeviceType) + ? tr("%1 Simulator").arg(qtVersion->unexpandedDisplayName()) + : qtVersion->unexpandedDisplayName(); + k->setUnexpandedDisplayName(baseDisplayName); + setupKit(k, pDeviceType, platformToolchains, debuggerId, sdk.path, qtVersion); + return true; + }; + kit = KitManager::registerKit(init); } resultingKits.insert(kit); } diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 0b4984fd24e..f07144f9793 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -398,18 +398,16 @@ void KitManager::notifyAboutUpdate(Kit *k) emit m_instance->unmanagedKitUpdated(k); } -bool KitManager::registerKit(std::unique_ptr &&k) +Kit *KitManager::registerKit(const std::function &init, Core::Id id) { - QTC_ASSERT(isLoaded(), return false); + QTC_ASSERT(isLoaded(), return nullptr); - if (!k) - return true; - - QTC_ASSERT(k->id().isValid(), return false); + auto k = std::make_unique(id); + QTC_ASSERT(k->id().isValid(), return nullptr); Kit *kptr = k.get(); - if (Utils::contains(d->m_kitList, kptr)) - return false; + if (init && !init(kptr)) + return nullptr; // make sure we have all the information in our kits: completeKit(kptr); @@ -420,7 +418,7 @@ bool KitManager::registerKit(std::unique_ptr &&k) setDefaultKit(kptr); emit m_instance->kitAdded(kptr); - return true; + return kptr; } void KitManager::deregisterKit(Kit *k) diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index 4b031846a03..180e71b0257 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -173,7 +173,7 @@ public: static const QSet irrelevantAspects(); static void setIrrelevantAspects(const QSet &aspects); - static bool registerKit(std::unique_ptr &&k); + static Kit *registerKit(const std::function &init, Core::Id id = {}); static void deregisterKit(Kit *k); static void setDefaultKit(Kit *k); diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index 7624da21d96..1c6d6801b7b 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -159,21 +159,13 @@ QIcon KitManagerConfigWidget::icon() const void KitManagerConfigWidget::apply() { - bool mustSetDefault = m_isDefaultKit; - bool mustRegister = false; - auto toRegister = std::make_unique(); - if (!m_kit) { - mustRegister = true; - m_kit = toRegister.get(); - } - m_kit->copyFrom(m_modifiedKit.get()); //m_isDefaultKit is reset in discard() here. - if (mustRegister) - KitManager::registerKit(std::move(toRegister)); - - if (mustSetDefault) + const auto copyIntoKit = [this](Kit *k) { k->copyFrom(m_modifiedKit.get()); }; + if (m_kit) + copyIntoKit(m_kit); + else + m_kit = KitManager::registerKit([&](Kit *k) { copyIntoKit(k); return true; }); + if (m_isDefaultKit) KitManager::setDefaultKit(m_kit); - - m_isDefaultKit = mustSetDefault; emit dirty(); } diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index abbc3855b1d..9cf05e0dc6c 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -286,20 +286,19 @@ bool ProjectImporter::isTemporaryKit(Kit *k) const Kit *ProjectImporter::createTemporaryKit(const KitSetupFunction &setup) const { - auto k = std::make_unique(); - Kit *kptr = k.get(); UpdateGuard guard(*this); - { - KitGuard kitGuard(kptr); - k->setUnexpandedDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectImporter", "Imported Kit"));; + const auto init = [&](Kit *k) { + KitGuard kitGuard(k); + k->setUnexpandedDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectImporter", + "Imported Kit")); k->setup(); - setup(kptr); + setup(k); k->fix(); - markKitAsTemporary(kptr); - addProject(kptr); - } // ~KitGuard, sending kitUpdated - KitManager::registerKit(std::move(k)); // potentially adds kits to other targetsetuppages - return kptr; + markKitAsTemporary(k); + addProject(k); + return true; + }; // ~KitGuard, sending kitUpdated + return KitManager::registerKit(init); // potentially adds kits to other targetsetuppages } bool ProjectImporter::findTemporaryHandler(Core::Id id) const diff --git a/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp index e37a9f0ec02..d0a2856cd8c 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp @@ -46,16 +46,15 @@ void QmlProfilerAttachDialogTest::testAccessors() dialog.setPort(4444); QCOMPARE(dialog.port(), 4444); - auto newKit = std::make_unique("dings"); - ProjectExplorer::Kit *newKitPtr = newKit.get(); ProjectExplorer::KitManager *kitManager = ProjectExplorer::KitManager::instance(); QVERIFY(kitManager); - QVERIFY(kitManager->registerKit(std::move(newKit))); + ProjectExplorer::Kit * const newKit = kitManager->registerKit({}, "dings"); + QVERIFY(newKit); dialog.setKitId("dings"); - QCOMPARE(dialog.kit(), newKitPtr); + QCOMPARE(dialog.kit(), newKit); - kitManager->deregisterKit(newKitPtr); + kitManager->deregisterKit(newKit); } } // namespace Internal diff --git a/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp index 8f7ecb778e0..f70a2dcb420 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp @@ -44,14 +44,13 @@ namespace Internal { void QmlProfilerToolTest::testAttachToWaitingApplication() { - auto newKit = std::make_unique("fookit"); - ProjectExplorer::Kit * newKitPtr = newKit.get(); ProjectExplorer::KitManager *kitManager = ProjectExplorer::KitManager::instance(); QVERIFY(kitManager); - QVERIFY(kitManager->registerKit(std::move(newKit))); + ProjectExplorer::Kit * const newKit = kitManager->registerKit({}, "fookit"); + QVERIFY(newKit); QSettings *settings = Core::ICore::settings(); QVERIFY(settings); - settings->setValue(QLatin1String("AnalyzerQmlAttachDialog/kitId"), newKitPtr->id().toSetting()); + settings->setValue(QLatin1String("AnalyzerQmlAttachDialog/kitId"), newKit->id().toSetting()); QmlProfilerTool profilerTool; diff --git a/src/plugins/qnx/qnxconfiguration.cpp b/src/plugins/qnx/qnxconfiguration.cpp index 5da58989b10..7e9b8b90f2d 100644 --- a/src/plugins/qnx/qnxconfiguration.cpp +++ b/src/plugins/qnx/qnxconfiguration.cpp @@ -301,39 +301,38 @@ ProjectExplorer::Kit *QnxConfiguration::createKit( if (!qnxQt) return nullptr; - auto kit = std::make_unique(); - Kit *kptr = kit.get(); + const auto init = [&](Kit *k) { + QtKitAspect::setQtVersion(k, qnxQt); + ToolChainKitAspect::setToolChain(k, toolChain); + ToolChainKitAspect::clearToolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID); - QtKitAspect::setQtVersion(kptr, qnxQt); - ToolChainKitAspect::setToolChain(kptr, toolChain); - ToolChainKitAspect::clearToolChain(kptr, ProjectExplorer::Constants::C_LANGUAGE_ID); + if (debugger.isValid()) + DebuggerKitAspect::setDebugger(k, debugger); - if (debugger.isValid()) - DebuggerKitAspect::setDebugger(kptr, debugger); + DeviceTypeKitAspect::setDeviceTypeId(k, Constants::QNX_QNX_OS_TYPE); + // TODO: Add sysroot? - DeviceTypeKitAspect::setDeviceTypeId(kptr, Constants::QNX_QNX_OS_TYPE); - // TODO: Add sysroot? + k->setUnexpandedDisplayName( + QCoreApplication::translate( + "Qnx::Internal::QnxConfiguration", + "Kit for %1 (%2)") + .arg(displayName()) + .arg(target.shortDescription())); - kit->setUnexpandedDisplayName( - QCoreApplication::translate( - "Qnx::Internal::QnxConfiguration", - "Kit for %1 (%2)") - .arg(displayName()) - .arg(target.shortDescription())); + k->setAutoDetected(true); + k->setAutoDetectionSource(envFile().toString()); + k->setMutable(DeviceKitAspect::id(), true); - kit->setAutoDetected(true); - kit->setAutoDetectionSource(envFile().toString()); - kit->setMutable(DeviceKitAspect::id(), true); - - kit->setSticky(ToolChainKitAspect::id(), true); - kit->setSticky(DeviceTypeKitAspect::id(), true); - kit->setSticky(SysRootKitAspect::id(), true); - kit->setSticky(DebuggerKitAspect::id(), true); - kit->setSticky(QmakeProjectManager::Constants::KIT_INFORMATION_ID, true); + k->setSticky(ToolChainKitAspect::id(), true); + k->setSticky(DeviceTypeKitAspect::id(), true); + k->setSticky(SysRootKitAspect::id(), true); + k->setSticky(DebuggerKitAspect::id(), true); + k->setSticky(QmakeProjectManager::Constants::KIT_INFORMATION_ID, true); + return true; + }; // add kit with device and qt version not sticky - KitManager::registerKit(std::move(kit)); - return kptr; + return KitManager::registerKit(init); } QStringList QnxConfiguration::validationErrors() const