ProjectExplorer: Make KitManager::kits(...) return an empty list during load

Make KitManager::kits(...) return an empty list during the time a kit is loaded.

Simplify initialization of loading function. It is only triggered in
ProjectExplorerPlugin::delayedInitialize, so that is safe.

Change-Id: I2ed67d881b019b70cdcc23fcc4b0d48d04fa1df6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Tobias Hunger
2018-07-03 15:43:54 +02:00
parent 9ee022af7c
commit 4a062dff13
2 changed files with 26 additions and 35 deletions

View File

@@ -114,17 +114,12 @@ KitManager::KitManager(QObject *parent)
void KitManager::restoreKits() void KitManager::restoreKits()
{ {
QTC_ASSERT(!d->m_initialized, return ); QTC_ASSERT(!d->m_initialized, return );
static bool initializing = false;
if (initializing) // kits will call kits() to check their display names, which will trigger another
// call to restoreKits, which ...
return;
initializing = true;
QList<Kit *> kitsToValidate; QList<Kit *> kitsToValidate;
QList<Kit *> kitsToCheck; QList<Kit *> kitsToCheck;
QList<Kit *> resultList;
// read all kits from SDK // read all kits from SDK
KitList system KitList system
= restoreKits(FileName::fromString(ICore::installerResourcePath() + KIT_FILENAME)); = restoreKits(FileName::fromString(ICore::installerResourcePath() + KIT_FILENAME));
@@ -142,10 +137,12 @@ void KitManager::restoreKits()
// read all kits from user file // read all kits from user file
KitList userKits = restoreKits(settingsFileName()); KitList userKits = restoreKits(settingsFileName());
foreach (Kit *k, userKits.kits) { foreach (Kit *k, userKits.kits) {
if (k->isSdkProvided()) if (k->isSdkProvided()) {
kitsToCheck.append(k); kitsToCheck.append(k);
else } else {
addKit(k); // Store manual kits completeKit(k); // Store manual kits
resultList.append(k);
}
} }
Kit *toStore = nullptr; Kit *toStore = nullptr;
@@ -174,7 +171,8 @@ void KitManager::restoreKits()
break; break;
} }
} }
addKit(toStore); completeKit(toStore); // Store manual kits
resultList.append(toStore);
} }
// Delete all loaded autodetected kits that were not rediscovered: // Delete all loaded autodetected kits that were not rediscovered:
@@ -190,12 +188,14 @@ void KitManager::restoreKits()
defaultKit->setup(); defaultKit->setup();
addKit(defaultKit); completeKit(defaultKit); // Store manual kits
resultList.append(defaultKit);
} }
Kit *k = kit(userKits.defaultKit); Kit *k = Utils::findOrDefault(resultList, Utils::equal(&Kit::id, userKits.defaultKit));
if (!k) if (!k)
k = Utils::findOrDefault(d->m_kitList, &Kit::isValid); k = Utils::findOrDefault(resultList, &Kit::isValid);
std::swap(resultList, d->m_kitList);
setDefaultKit(k); setDefaultKit(k);
d->m_writer = new PersistentSettingsWriter(settingsFileName(), "QtCreatorProfiles"); d->m_writer = new PersistentSettingsWriter(settingsFileName(), "QtCreatorProfiles");
@@ -240,7 +240,6 @@ bool KitManager::isLoaded()
void KitManager::registerKitInformation(std::unique_ptr<KitInformation> &&ki) void KitManager::registerKitInformation(std::unique_ptr<KitInformation> &&ki)
{ {
QTC_CHECK(!isLoaded());
QTC_ASSERT(ki->id().isValid(), return ); QTC_ASSERT(ki->id().isValid(), return );
QTC_ASSERT(!Utils::contains(d->m_informationList, ki.get()), return ); QTC_ASSERT(!Utils::contains(d->m_informationList, ki.get()), return );
@@ -253,9 +252,6 @@ void KitManager::registerKitInformation(std::unique_ptr<KitInformation> &&ki)
}); });
d->m_informationList.insert(it, std::move(ki)); d->m_informationList.insert(it, std::move(ki));
if (!isLoaded())
return;
foreach (Kit *k, kits()) { foreach (Kit *k, kits()) {
if (!k->hasValue(ki->id())) if (!k->hasValue(ki->id()))
k->setValue(ki->id(), ki->defaultValue(k)); k->setValue(ki->id(), ki->defaultValue(k));
@@ -429,7 +425,8 @@ bool KitManager::registerKit(Kit *k)
return false; return false;
// make sure we have all the information in our kits: // make sure we have all the information in our kits:
m_instance->addKit(k); completeKit(k);
d->m_kitList.append(k);
if (!d->m_defaultKit || (!d->m_defaultKit->isValid() && k->isValid())) if (!d->m_defaultKit || (!d->m_defaultKit->isValid() && k->isValid()))
setDefaultKit(k); setDefaultKit(k);
@@ -461,23 +458,17 @@ void KitManager::setDefaultKit(Kit *k)
emit m_instance->defaultkitChanged(); emit m_instance->defaultkitChanged();
} }
void KitManager::addKit(Kit *k) void KitManager::completeKit(Kit *k)
{ {
if (!k) QTC_ASSERT(k, return);
return; KitGuard g(k);
for (const std::unique_ptr<KitInformation> &ki : d->m_informationList) {
{ ki->upgrade(k);
KitGuard g(k); if (!k->hasValue(ki->id()))
for (const std::unique_ptr<KitInformation> &ki : d->m_informationList) { k->setValue(ki->id(), ki->defaultValue(k));
ki->upgrade(k); else
if (!k->hasValue(ki->id())) ki->fix(k);
k->setValue(ki->id(), ki->defaultValue(k));
else
ki->fix(k);
}
} }
d->m_kitList.append(k);
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View File

@@ -176,7 +176,7 @@ private:
KitList restoreKits(const Utils::FileName &fileName); KitList restoreKits(const Utils::FileName &fileName);
static void notifyAboutUpdate(Kit *k); static void notifyAboutUpdate(Kit *k);
void addKit(Kit *k); static void completeKit(Kit *k);
friend class ProjectExplorerPlugin; // for constructor friend class ProjectExplorerPlugin; // for constructor
friend class Kit; friend class Kit;