diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp index 0a0485e1896..fba6ca246b9 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp @@ -59,8 +59,7 @@ CompilationDbParser::CompilationDbParser(const QString &projectName, { connect(&m_parserWatcher, &QFutureWatcher::finished, this, [this] { m_dbContents = m_parserWatcher.result(); - if (!m_treeScanner || m_treeScanner->isFinished()) - finish(ParseResult::Success); + parserJobFinished(); }); } @@ -80,6 +79,7 @@ void CompilationDbParser::start() return; } m_projectFileHash = newHash; + m_runningParserJobs = 0; // Thread 1: Scan disk. if (!m_rootPath.isEmpty()) { @@ -109,10 +109,9 @@ void CompilationDbParser::start() Core::ProgressManager::addTask(m_treeScanner->future(), tr("Scan \"%1\" project tree").arg(m_projectName), "CompilationDatabase.Scan.Tree"); - connect(m_treeScanner, &TreeScanner::finished, this, [this] { - if (m_parserWatcher.isFinished()) - finish(ParseResult::Success); - }); + ++m_runningParserJobs; + connect(m_treeScanner, &TreeScanner::finished, + this, &CompilationDbParser::parserJobFinished); } // Thread 2: Parse the project file. @@ -120,6 +119,7 @@ void CompilationDbParser::start() Core::ProgressManager::addTask(future, tr("Parse \"%1\" project").arg(m_projectName), "CompilationDatabase.Parse"); + ++m_runningParserJobs; m_parserWatcher.setFuture(future); } @@ -143,6 +143,12 @@ QList CompilationDbParser::scannedFiles() const : QList(); } +void CompilationDbParser::parserJobFinished() +{ + if (--m_runningParserJobs == 0) + finish(ParseResult::Success); +} + void CompilationDbParser::finish(ParseResult result) { emit finished(result); diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h index dd126d9fd1c..72425fa3c51 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h @@ -77,6 +77,7 @@ signals: void finished(ParseResult result); private: + void parserJobFinished(); void finish(ParseResult result); DbContents parseProject(); std::vector readJsonObjects() const; @@ -90,6 +91,7 @@ private: DbContents m_dbContents; QByteArray m_projectFileContents; QByteArray m_projectFileHash; + int m_runningParserJobs = 0; ProjectExplorer::BuildSystem::ParseGuard m_guard; };