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()
{
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 *> kitsToCheck;
QList<Kit *> resultList;
// read all kits from SDK
KitList system
= restoreKits(FileName::fromString(ICore::installerResourcePath() + KIT_FILENAME));
@@ -142,10 +137,12 @@ void KitManager::restoreKits()
// read all kits from user file
KitList userKits = restoreKits(settingsFileName());
foreach (Kit *k, userKits.kits) {
if (k->isSdkProvided())
if (k->isSdkProvided()) {
kitsToCheck.append(k);
else
addKit(k); // Store manual kits
} else {
completeKit(k); // Store manual kits
resultList.append(k);
}
}
Kit *toStore = nullptr;
@@ -174,7 +171,8 @@ void KitManager::restoreKits()
break;
}
}
addKit(toStore);
completeKit(toStore); // Store manual kits
resultList.append(toStore);
}
// Delete all loaded autodetected kits that were not rediscovered:
@@ -190,12 +188,14 @@ void KitManager::restoreKits()
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)
k = Utils::findOrDefault(d->m_kitList, &Kit::isValid);
k = Utils::findOrDefault(resultList, &Kit::isValid);
std::swap(resultList, d->m_kitList);
setDefaultKit(k);
d->m_writer = new PersistentSettingsWriter(settingsFileName(), "QtCreatorProfiles");
@@ -240,7 +240,6 @@ bool KitManager::isLoaded()
void KitManager::registerKitInformation(std::unique_ptr<KitInformation> &&ki)
{
QTC_CHECK(!isLoaded());
QTC_ASSERT(ki->id().isValid(), 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));
if (!isLoaded())
return;
foreach (Kit *k, kits()) {
if (!k->hasValue(ki->id()))
k->setValue(ki->id(), ki->defaultValue(k));
@@ -429,7 +425,8 @@ bool KitManager::registerKit(Kit *k)
return false;
// 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()))
setDefaultKit(k);
@@ -461,23 +458,17 @@ void KitManager::setDefaultKit(Kit *k)
emit m_instance->defaultkitChanged();
}
void KitManager::addKit(Kit *k)
void KitManager::completeKit(Kit *k)
{
if (!k)
return;
{
KitGuard g(k);
for (const std::unique_ptr<KitInformation> &ki : d->m_informationList) {
ki->upgrade(k);
if (!k->hasValue(ki->id()))
k->setValue(ki->id(), ki->defaultValue(k));
else
ki->fix(k);
}
QTC_ASSERT(k, return);
KitGuard g(k);
for (const std::unique_ptr<KitInformation> &ki : d->m_informationList) {
ki->upgrade(k);
if (!k->hasValue(ki->id()))
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);
static void notifyAboutUpdate(Kit *k);
void addKit(Kit *k);
static void completeKit(Kit *k);
friend class ProjectExplorerPlugin; // for constructor
friend class Kit;