ProjectExplorer: Fix KitManager::deregisterKits

There were some problems regarding removal of the default kit:
  - A precondition of setDefaultKit() was violated.
  - The new default kit was set to a kit that was possibly removed later
    as well (and never updated afterwards).
  - The new default kit was only set if it wasn't null, leaving a
    dangling pointer in m_defaultKit.
Also turned some checks into assertions.

Amends e31a06a0f4.

Done-by: Christian Kandeler <christian.kandeler@qt.io>
Fixes: QTCREATORBUG-30493
Fixes: QTCREATORBUG-30502
Change-Id: I3283f02c90d0ec84b579d7cfdf845b03663f5768
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Alessandro Portale
2024-03-07 17:07:06 +01:00
committed by Eike Ziller
parent 2484b50a99
commit 2f290e6dc0

View File

@@ -657,20 +657,20 @@ void KitManager::deregisterKits(const QList<Kit *> kitList)
{
QTC_ASSERT(KitManager::isLoaded(), return);
std::vector<std::unique_ptr<Kit>> removed; // to keep them alive until the end of the function
Kit *newDefault = nullptr;
bool defaultKitRemoved = false;
for (Kit *k : kitList) {
if (!k)
continue;
QTC_ASSERT(k, continue);
std::optional<std::unique_ptr<Kit>> taken = Utils::take(d->m_kitList, k);
if (!taken)
continue;
QTC_ASSERT(taken, continue);
if (defaultKit() == k)
defaultKitRemoved = true;
removed.push_back(std::move(*taken));
if (defaultKit() == k) {
newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); });
}
}
if (newDefault)
setDefaultKit(newDefault);
if (defaultKitRemoved) {
d->m_defaultKit = Utils::findOrDefault(kits(), &Kit::isValid);
emit instance()->defaultkitChanged();
}
for (auto it = removed.cbegin(); it != removed.cend(); ++it)
emit instance()->kitRemoved(it->get());