ProjectExplorer: Let toolchains be (de)registered in bulk

When some code adds or removes a bunch of toolchains at once, that
should be made explicit and also be reflected by the respective signal
emissions.
Fix some leaks and typos along the way.

Change-Id: I4a1f12a2378316c5faf70e85a88adc467f076caf
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2024-07-18 11:10:24 +02:00
parent eb6c95b50d
commit 9d0c144892
13 changed files with 198 additions and 169 deletions

View File

@@ -441,52 +441,56 @@ static Toolchain *mingwToolchain(const FilePath &path, Id language)
return toolChain;
}
// FIXME: Do not register languages separately.
static Toolchain *armGccToolchain(const FilePath &path, Id language)
{
Toolchain *toolChain = ToolchainManager::toolchain([&path, language](const Toolchain *t) {
Toolchain *toolchain = ToolchainManager::toolchain([&path, language](const Toolchain *t) {
return t->compilerCommand() == path && t->language() == language;
});
if (!toolChain) {
if (!toolchain) {
if (ToolchainFactory * const gccFactory = ToolchainFactory::factoryForType(
ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID)) {
const QList<Toolchain *> detected = gccFactory->detectForImport({path, language});
QList<Toolchain *> detected = gccFactory->detectForImport({path, language});
if (!detected.isEmpty()) {
toolChain = detected.first();
toolChain->setDetection(Toolchain::ManualDetection);
toolChain->setDisplayName("Arm GCC");
ToolchainManager::registerToolchain(toolChain);
toolchain = detected.takeFirst();
ToolchainManager::registerToolchains({toolchain});
toolchain->setDetection(Toolchain::ManualDetection);
toolchain->setDisplayName("Arm GCC");
qDeleteAll(detected);
}
}
}
return toolChain;
return toolchain;
}
static Toolchain *iarToolchain(const FilePath &path, Id language)
{
Toolchain *toolChain = ToolchainManager::toolchain([language](const Toolchain *t) {
Toolchain *toolchain = ToolchainManager::toolchain([language](const Toolchain *t) {
return t->typeId() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID
&& t->language() == language;
});
if (!toolChain) {
if (!toolchain) {
if (ToolchainFactory * const iarFactory = ToolchainFactory::factoryForType(
BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID)) {
Toolchains detected = iarFactory->autoDetect(
{{}, DeviceManager::defaultDesktopDevice(), {}});
if (detected.isEmpty())
detected = iarFactory->detectForImport({path, language});
for (auto tc : detected) {
if (tc->language() == language) {
toolChain = tc;
toolChain->setDetection(Toolchain::ManualDetection);
toolChain->setDisplayName("IAREW");
ToolchainManager::registerToolchain(toolChain);
}
Toolchains toRegister;
Toolchains toDelete;
std::tie(toRegister, toDelete)
= Utils::partition(detected, Utils::equal(&Toolchain::language, language));
for (Toolchain * const tc : toRegister) {
tc->setDetection(Toolchain::ManualDetection);
tc->setDisplayName("IAREW");
}
ToolchainManager::registerToolchains(toRegister);
qDeleteAll(toDelete);
}
}
return toolChain;
return toolchain;
}
Toolchain *McuToolchainPackage::toolChain(Id language) const