diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 40620f7a711..e1bc165d27c 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -30,6 +30,8 @@ #include +#include + #include #include #include @@ -46,11 +48,42 @@ #include using namespace Core; +using namespace Tasking; using namespace Utils; namespace ProjectExplorer { using namespace Internal; +class ParserAwaiterTaskAdapter : public TaskAdapter> +{ +private: + void start() final { checkParsing(); } + void checkParsing() { + const QSet buildSystems = *task(); + for (BuildSystem *buildSystem : buildSystems) { + if (!buildSystem || !buildSystem->isParsing()) + continue; + connect(buildSystem, &BuildSystem::parsingFinished, + this, [this, buildSystem](bool success) { + disconnect(buildSystem, &BuildSystem::parsingFinished, this, nullptr); + if (!success) { + emit done(false); + return; + } + checkParsing(); + }); + return; + } + emit done(true); + } +}; + +} // ProjectExplorer + +TASKING_DECLARE_TASK(ParserAwaiterTask, ProjectExplorer::ParserAwaiterTaskAdapter); + +namespace ProjectExplorer { + static QString msgProgress(int progress, int total) { return Tr::tr("Finished %1 of %n steps", nullptr, total).arg(progress);