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(); 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 { namespace {
struct ToolChainOperations struct ToolChainOperations
@@ -223,12 +233,13 @@ static ToolChainOperations mergeToolChainLists(const QList<ToolChain *> &systemF
const QList<ToolChain *> &userFileTcs, const QList<ToolChain *> &userFileTcs,
const QList<ToolChain *> &autodetectedTcs) const QList<ToolChain *> &autodetectedTcs)
{ {
const QList<ToolChain *> uniqueUserFileTcs = makeUniqueByEqual(userFileTcs);
const QList<ToolChain *> manualUserTcs 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: // Remove systemFileTcs from autodetectedUserTcs based on id-matches:
const QList<ToolChain *> autodetectedUserFileTcs const QList<ToolChain *> autodetectedUserFileTcs
= Utils::filtered(userFileTcs, &ToolChain::isAutoDetected); = Utils::filtered(uniqueUserFileTcs, &ToolChain::isAutoDetected);
const QList<ToolChain *> autodetectedUserTcs = subtractById(autodetectedUserFileTcs, systemFileTcs); const QList<ToolChain *> autodetectedUserTcs = subtractById(autodetectedUserFileTcs, systemFileTcs);
// Calculate a set of Tcs that were detected before (and saved to userFile) and that // 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 result.toRegister = result.toDemote + systemFileTcs + redetectedUserTcs + newlyAutodetectedTcs
+ validManualUserTcs; + validManualUserTcs;
result.toDelete = makeUnique(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs, result.toDelete = makeUniqueByPointerEqual(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs,
result.toRegister)); result.toRegister));
return result; return result;
} }
@@ -542,6 +553,9 @@ void ProjectExplorerPlugin::testToolChainManager_data()
QTest::newRow("Auto: auto-redetect, user") QTest::newRow("Auto: auto-redetect, user")
<< (TCList()) << (TCList() << auto1) << (TCList() << auto1_2) << (TCList()) << (TCList() << auto1) << (TCList() << auto1_2)
<< (TCList()) << (TCList() << auto1); << (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") QTest::newRow("Auto: (no) auto, invalid user")
<< (TCList()) << (TCList() << auto3i) << (TCList()) << (TCList()) << (TCList() << auto3i) << (TCList())
<< (TCList()) << (TCList()); << (TCList()) << (TCList());