ToolChainManager: Filter duplicate toolchains more aggressively

Change-Id: I2a333cc54d3c77a1fd43001a94c212e36b2e5f39
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Reviewed-by: Alessandro Portale <alessandro.portale@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2015-11-18 15:56:55 +01:00
committed by Alessandro Portale
parent 1defeda8a3
commit 0d7f166b19

View File

@@ -203,11 +203,21 @@ static QList<ToolChain *> intersectByEqual(const QList<ToolChain *> &a, const QL
});
}
static QList<ToolChain *> makeUnique(const QList<ToolChain *> &a)
static QList<ToolChain *> makeUniqueByPointerEqual(const QList<ToolChain *> &a)
{
return QSet<ToolChain *>::fromList(a).toList();
}
static QList<ToolChain *> makeUniqueByEqual(const QList<ToolChain *> &a)
{
QList<ToolChain *> result;
foreach (ToolChain *tc, a) {
if (!Utils::contains(result, [tc](ToolChain *rtc) { return *tc == *rtc; }))
result.append(tc);
}
return result;
}
namespace {
struct ToolChainOperations
@@ -223,12 +233,13 @@ static ToolChainOperations mergeToolChainLists(const QList<ToolChain *> &systemF
const QList<ToolChain *> &userFileTcs,
const QList<ToolChain *> &autodetectedTcs)
{
const QList<ToolChain *> uniqueUserFileTcs = makeUniqueByEqual(userFileTcs);
const QList<ToolChain *> manualUserTcs
= Utils::filtered(userFileTcs, [](ToolChain *t) { return !t->isAutoDetected(); });
= Utils::filtered(uniqueUserFileTcs, [](ToolChain *t) { return !t->isAutoDetected(); });
// Remove systemFileTcs from autodetectedUserTcs based on id-matches:
const QList<ToolChain *> autodetectedUserFileTcs
= Utils::filtered(userFileTcs, &ToolChain::isAutoDetected);
= Utils::filtered(uniqueUserFileTcs, &ToolChain::isAutoDetected);
const QList<ToolChain *> autodetectedUserTcs = subtractById(autodetectedUserFileTcs, systemFileTcs);
// Calculate a set of Tcs that were detected before (and saved to userFile) and that
@@ -255,7 +266,7 @@ static ToolChainOperations mergeToolChainLists(const QList<ToolChain *> &systemF
result.toRegister = result.toDemote + systemFileTcs + redetectedUserTcs + newlyAutodetectedTcs
+ validManualUserTcs;
result.toDelete = makeUnique(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs,
result.toDelete = makeUniqueByPointerEqual(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs,
result.toRegister));
return result;
}
@@ -542,6 +553,9 @@ void ProjectExplorerPlugin::testToolChainManager_data()
QTest::newRow("Auto: auto-redetect, user")
<< (TCList()) << (TCList() << auto1) << (TCList() << auto1_2)
<< (TCList()) << (TCList() << auto1);
QTest::newRow("Auto: auto-redetect, duplicate users")
<< (TCList()) << (TCList() << auto1 << auto1c) << (TCList() << auto1_2)
<< (TCList()) << (TCList() << auto1);
QTest::newRow("Auto: (no) auto, invalid user")
<< (TCList()) << (TCList() << auto3i) << (TCList())
<< (TCList()) << (TCList());