From a89100fe47e345487736711ea8daf6450e783c20 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 11 Jan 2017 16:12:32 +0100 Subject: [PATCH] ToolChainManager: Allow for filtering of toolchains Allow to provide a Predicate to ToolChainManager::toolChains and add a ToolChainManager::toolChain method. Change-Id: I0849f6fa67ffd8d5c6cfe4253cb0a326e1b023fa Reviewed-by: Tim Jenssen --- src/plugins/android/androidconfigurations.cpp | 18 +++++------- .../projectexplorer/kitinformation.cpp | 6 ++-- .../kitinformationconfigwidget.cpp | 3 +- .../projectexplorer/settingsaccessor.cpp | 13 ++++----- src/plugins/projectexplorer/toolchain.h | 2 ++ .../projectexplorer/toolchainmanager.cpp | 9 +++++- .../projectexplorer/toolchainmanager.h | 8 +++-- .../qmakekitinformation.cpp | 19 ++++++------ .../qmakeprojectimporter.cpp | 15 +++++----- src/plugins/qnx/qnxconfiguration.cpp | 29 +++++-------------- src/plugins/qtsupport/baseqtversion.cpp | 7 ++--- 11 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 4827872bb0d..495ba815c31 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1224,9 +1224,8 @@ static bool matchKits(const Kit *a, const Kit *b) void AndroidConfigurations::registerNewToolChains() { const QList existingAndroidToolChains - = Utils::filtered(ToolChainManager::toolChains(), - Utils::equal(&ToolChain::typeId, Core::Id(Constants::ANDROID_TOOLCHAIN_ID))); - + = ToolChainManager::toolChains(Utils::equal(&ToolChain::typeId, + Core::Id(Constants::ANDROID_TOOLCHAIN_ID))); const QList newToolchains = AndroidToolChainFactory::autodetectToolChainsForNdk(AndroidConfigurations::currentConfig().ndkLocation(), existingAndroidToolChains); @@ -1236,11 +1235,9 @@ void AndroidConfigurations::registerNewToolChains() void AndroidConfigurations::removeOldToolChains() { - foreach (ToolChain *tc, ToolChainManager::toolChains()) { - if (tc->typeId() == Constants::ANDROID_TOOLCHAIN_ID) { - if (!tc->isValid()) - ToolChainManager::deregisterToolChain(tc); - } + foreach (ToolChain *tc, ToolChainManager::toolChains(Utils::equal(&ToolChain::typeId, Core::Id(Constants::ANDROID_TOOLCHAIN_ID)))) { + if (!tc->isValid()) + ToolChainManager::deregisterToolChain(tc); } } @@ -1289,11 +1286,12 @@ void AndroidConfigurations::updateAutomaticKitList() } // register new kits - const QList tmp = Utils::filtered(ToolChainManager::toolChains(), [](ToolChain *tc) { + QList newKits; + const QList tmp = ToolChainManager::toolChains([](const ToolChain *tc) { return tc->isAutoDetected() && tc->isValid() && tc->typeId() == Constants::ANDROID_TOOLCHAIN_ID - && !static_cast(tc)->isSecondaryToolChain(); + && !static_cast(tc)->isSecondaryToolChain(); }); const QList toolchains = Utils::transform(tmp, [](ToolChain *tc) { return static_cast(tc); diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 90a9c9445ae..4a9e9cf4a54 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -146,8 +146,7 @@ static QMap defaultToolChainIds() { QMap toolChains; const Abi abi = Abi::hostAbi(); - QList tcList = Utils::filtered(ToolChainManager::toolChains(), - Utils::equal(&ToolChain::targetAbi, abi)); + QList tcList = ToolChainManager::toolChains(Utils::equal(&ToolChain::targetAbi, abi)); foreach (ToolChain::Language l, ToolChain::allLanguages()) { ToolChain *tc = Utils::findOrDefault(tcList, Utils::equal(&ToolChain::language, l)); toolChains.insert(l, tc ? tc->id() : QByteArray()); @@ -239,7 +238,6 @@ void ToolChainKitInformation::setup(Kit *k) { QTC_ASSERT(ToolChainManager::isLoaded(), return); const QVariantMap value = k->value(ToolChainKitInformation::id()).toMap(); - const QList knownTcs = ToolChainManager::toolChains(); for (auto i = value.constBegin(); i != value.constEnd(); ++i) { ToolChain::Language l @@ -257,7 +255,7 @@ void ToolChainKitInformation::setup(Kit *k) // ID is not found: Might be an ABI string... const QString abi = QString::fromUtf8(id); - tc = Utils::findOrDefault(knownTcs, [abi, l](ToolChain *t) { + tc = ToolChainManager::toolChain([abi, l](const ToolChain *t) { return t->targetAbi().toString() == abi && t->language() == l; }); if (tc) diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp index b0faff0dd47..2f3445d1566 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp @@ -188,10 +188,9 @@ void ToolChainInformationConfigWidget::refresh() { m_ignoreChanges = true; - const QList tcList = ToolChainManager::toolChains(); foreach (ToolChain::Language l, m_languageComboboxMap.keys()) { const QList ltcList - = Utils::filtered(tcList, Utils::equal(&ToolChain::language, l)); + = ToolChainManager::toolChains(Utils::equal(&ToolChain::language, l)); QComboBox *cb = m_languageComboboxMap.value(l); cb->clear(); diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index cb0381ba580..cb59459601d 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -2150,13 +2150,12 @@ QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map) for (int j = i + 2; j < split.count(); ++j) debuggerPath = debuggerPath + QLatin1Char('.') + split.at(j); - foreach (ToolChain *tc, ToolChainManager::toolChains()) { - if ((tc->compilerCommand() == FileName::fromString(compilerPath)) - && (tc->targetAbi() == compilerAbi)) { - tcId = QString::fromUtf8(tc->id()); - break; - } - } + ToolChain *tc = ToolChainManager::toolChain([cp = FileName::fromString(compilerPath), + compilerAbi](const ToolChain *t) { + return t->compilerCommand() == cp && t->targetAbi() == compilerAbi; + }); + if (tc) + tcId = QString::fromUtf8(tc->id()); } tmpKit->setValue("PE.Profile.ToolChain", tcId); diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index b429ee71c62..4a402f4afec 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -65,6 +65,8 @@ public: AutoDetectionFromSettings }; + using Predicate = std::function; + virtual ~ToolChain(); QString displayName() const; diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index 641131b03e4..ac089540938 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -333,11 +333,18 @@ void ToolChainManager::saveToolChains() // Do not save default debuggers! Those are set by the SDK! } -QList ToolChainManager::toolChains() +QList ToolChainManager::toolChains(const ToolChain::Predicate &predicate) { + if (predicate) + return Utils::filtered(d->m_toolChains, predicate); return d->m_toolChains; } +ToolChain *ToolChainManager::toolChain(const ToolChain::Predicate &predicate) +{ + return Utils::findOrDefault(d->m_toolChains, predicate); +} + QList ToolChainManager::findToolChains(const Abi &abi) { QList result; diff --git a/src/plugins/projectexplorer/toolchainmanager.h b/src/plugins/projectexplorer/toolchainmanager.h index 11dfe0ec127..7d6588a05cf 100644 --- a/src/plugins/projectexplorer/toolchainmanager.h +++ b/src/plugins/projectexplorer/toolchainmanager.h @@ -27,16 +27,19 @@ #include "projectexplorer_export.h" +#include "toolchain.h" + #include #include #include +#include + namespace Utils { class FileName; } namespace ProjectExplorer { class ProjectExplorerPlugin; -class ToolChain; class Abi; // -------------------------------------------------------------------------- @@ -51,7 +54,8 @@ public: static ToolChainManager *instance(); ~ToolChainManager() override; - static QList toolChains(); + static QList toolChains(const ToolChain::Predicate &predicate = ToolChain::Predicate()); + static ToolChain *toolChain(const ToolChain::Predicate &predicate); static QList findToolChains(const Abi &abi); static ToolChain *findToolChain(const QByteArray &id); diff --git a/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp b/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp index 70e68e77041..bbf3ebbfd9a 100644 --- a/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp +++ b/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp @@ -33,6 +33,8 @@ #include +#include + using namespace ProjectExplorer; using namespace Utils; @@ -83,15 +85,14 @@ void QmakeKitInformation::setup(Kit *k) ToolChain *tc = ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx); if (!tc || (!tc->suggestedMkspecList().empty() && !tc->suggestedMkspecList().contains(spec))) { - ToolChain *possibleTc = nullptr; - foreach (ToolChain *current, ToolChainManager::toolChains()) { - if (current->language() == ToolChain::Language::Cxx - && version->qtAbis().contains(current->targetAbi())) { - possibleTc = current; - if (current->suggestedMkspecList().contains(spec)) - break; - } - } + const QList possibleTcs = ToolChainManager::toolChains([version, &spec](const ToolChain *t) { + return t->isValid() + && t->language() == ToolChain::Language::Cxx + && version->qtAbis().contains(t->targetAbi()); + }); + ToolChain *possibleTc + = Utils::findOr(possibleTcs, possibleTcs.last(), + [&spec](const ToolChain *t) { return t->suggestedMkspecList().contains(spec); }); if (possibleTc) ToolChainKitInformation::setToolChain(k, possibleTc); } diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index e9eb97be2f7..ac7d14d23ff 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -275,15 +275,14 @@ static ToolChain *preferredToolChain(BaseQtVersion *qtVersion, const FileName &m { const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms; - QList toolchains = ToolChainManager::toolChains(); + const QList toolchains = ToolChainManager::toolChains(); QList qtAbis = qtVersion->qtAbis(); - return findOr(toolchains, - toolchains.isEmpty() ? 0 : toolchains.first(), - [&spec, &archConfig, &qtAbis, &qtVersion](ToolChain *tc) -> bool{ - return qtAbis.contains(tc->targetAbi()) - && tc->suggestedMkspecList().contains(spec) - && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; - }); + return findOr(toolchains, toolchains.isEmpty() ? nullptr : toolchains.first(), + [&](ToolChain *tc) { + return qtAbis.contains(tc->targetAbi()) + && tc->suggestedMkspecList().contains(spec) + && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; + }); } Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data, diff --git a/src/plugins/qnx/qnxconfiguration.cpp b/src/plugins/qnx/qnxconfiguration.cpp index 05d7aaa5aa1..9c5a8206f06 100644 --- a/src/plugins/qnx/qnxconfiguration.cpp +++ b/src/plugins/qnx/qnxconfiguration.cpp @@ -201,13 +201,9 @@ void QnxConfiguration::deactivate() if (!isActive()) return; - QList toolChainsToRemove; QList debuggersToRemove; - foreach (ToolChain *tc, - ToolChainManager::toolChains()) { - if (tc->compilerCommand() == qccCompilerPath()) - toolChainsToRemove.append(tc); - } + const QList toolChainsToRemove + = ToolChainManager::toolChains(Utils::equal(&ToolChain::compilerCommand, qccCompilerPath())); foreach (DebuggerItem debuggerItem, DebuggerItemManager::debuggers()) { @@ -232,22 +228,11 @@ void QnxConfiguration::deactivate() bool QnxConfiguration::isActive() const { - bool hasToolChain = false; - bool hasDebugger = false; - foreach (ToolChain *tc, ToolChainManager::toolChains()) { - if (tc->compilerCommand() == qccCompilerPath()) { - hasToolChain = true; - break; - } - } - - foreach (DebuggerItem debuggerItem, DebuggerItemManager::debuggers()) { - if (debuggerItem.command() == armDebuggerPath() || - debuggerItem.command() == x86DebuggerPath()) { - hasDebugger = true; - break; - } - } + const bool hasToolChain = ToolChainManager::toolChain(Utils::equal(&ToolChain::compilerCommand, + qccCompilerPath())); + const bool hasDebugger = Utils::contains(DebuggerItemManager::debuggers(), [this](const DebuggerItem &di) { + return di.command() == armDebuggerPath() || di.command() == x86DebuggerPath(); + }); return hasToolChain && hasDebugger; } diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 47ae35e3ee0..acb9f483268 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -1420,10 +1420,9 @@ bool BaseQtVersion::queryQMakeVariables(const FileName &binary, const Environmen // This is required to make non-static qmakes work on windows where every tool chain // tries to be incompatible with any other. QList abiList = Abi::abisOfBinary(binary); - QList tcList = ToolChainManager::toolChains(); - foreach (ToolChain *tc, tcList) { - if (!abiList.contains(tc->targetAbi())) - continue; + const QList tcList + = ToolChainManager::toolChains([&abiList](const ToolChain *t) { return abiList.contains(t->targetAbi()); }); + for (ToolChain *tc : tcList) { Environment realEnv = env; tc->addToEnvironment(realEnv); output = runQmakeQuery(binary, realEnv, error);