forked from qt-creator/qt-creator
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:
committed by
Eike Ziller
parent
2484b50a99
commit
2f290e6dc0
@@ -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());
|
||||
|
Reference in New Issue
Block a user