diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index e581617f131..4b8fda4ebd1 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -203,11 +203,21 @@ static QList intersectByEqual(const QList &a, const QL }); } -static QList makeUnique(const QList &a) +static QList makeUniqueByPointerEqual(const QList &a) { return QSet::fromList(a).toList(); } +static QList makeUniqueByEqual(const QList &a) +{ + QList 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 &systemF const QList &userFileTcs, const QList &autodetectedTcs) { + const QList uniqueUserFileTcs = makeUniqueByEqual(userFileTcs); const QList 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 autodetectedUserFileTcs - = Utils::filtered(userFileTcs, &ToolChain::isAutoDetected); + = Utils::filtered(uniqueUserFileTcs, &ToolChain::isAutoDetected); const QList autodetectedUserTcs = subtractById(autodetectedUserFileTcs, systemFileTcs); // Calculate a set of Tcs that were detected before (and saved to userFile) and that @@ -255,8 +266,8 @@ static ToolChainOperations mergeToolChainLists(const QList &systemF result.toRegister = result.toDemote + systemFileTcs + redetectedUserTcs + newlyAutodetectedTcs + validManualUserTcs; - result.toDelete = makeUnique(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs, - result.toRegister)); + 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());