Commit 1cbb4cc9 authored by Nikolai Kosjar's avatar Nikolai Kosjar

QbsProjectManager: Fix SOFT ASSERT: "future.isFinished()"

...in file qbsproject.cpp, line 940.

The assert can be triggered with e.g.:
 1. Load a bigger qbs project, e.g. qtcreator.qbs.
 2. Trigger project build as soon as possible.
 3. Cancel the "Parsing C/C++" operation.
 4. Wait until the build finished and the assert occurs.

This happens because CppModelManager::updateProjectInfo() since

  commit  536ccc8a
  CppTools: Fix incompletely indexed project

will check whether the previous indexer run was canceled or not. If it
was canceled, it will trigger a full-reindexing of the project.

Updating the compiler call data is a special case and it should never
trigger an indexing operation, so introduce a dedicated update function
for this case.

Change-Id: I456945ccf2bf697aaeada572ed87f3acb21a5eaf
Reviewed-by: default avatarChristian Kandeler <christian.kandeler@theqtcompany.com>
Reviewed-by: Eike Ziller's avatarEike Ziller <eike.ziller@qt.io>
parent 506fc40a
......@@ -900,6 +900,19 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo &newProjectIn
return indexerFuture;
}
ProjectInfo CppModelManager::updateCompilerCallDataForProject(
ProjectExplorer::Project *project,
ProjectInfo::CompilerCallData &compilerCallData)
{
QMutexLocker locker(&d->m_projectMutex);
ProjectInfo projectInfo = d->m_projectToProjectsInfo.value(project, ProjectInfo());
projectInfo.setCompilerCallData(compilerCallData);
d->m_projectToProjectsInfo.insert(project, projectInfo);
return projectInfo;
}
ProjectPart::Ptr CppModelManager::projectPartForId(const QString &projectPartId) const
{
return d->m_projectPartIdToProjectProjectPart.value(projectPartId);
......
......@@ -29,6 +29,7 @@
#include "cpptools_global.h"
#include "cppmodelmanagersupport.h"
#include "projectinfo.h"
#include "projectpart.h"
#include "projectpartheaderpath.h"
......@@ -56,7 +57,6 @@ class CppEditorDocumentHandle;
class CppIndexingSupport;
class SymbolFinder;
class WorkingCopy;
class ProjectInfo;
namespace Internal {
class CppSourceProcessor;
......@@ -95,6 +95,8 @@ public:
QList<ProjectInfo> projectInfos() const;
ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
QFuture<void> updateProjectInfo(const ProjectInfo &newProjectInfo);
ProjectInfo updateCompilerCallDataForProject(ProjectExplorer::Project *project,
ProjectInfo::CompilerCallData &compilerCallData);
/// \return The project part with the given project file
ProjectPart::Ptr projectPartForId(const QString &projectPartId) const;
......
......@@ -935,9 +935,7 @@ void QbsProject::updateCppCompilerCallData()
}
}
m_codeModelProjectInfo.setCompilerCallData(data);
const QFuture<void> future = modelManager->updateProjectInfo(m_codeModelProjectInfo);
QTC_CHECK(future.isFinished()); // No reparse of files expected
m_codeModelProjectInfo = modelManager->updateCompilerCallDataForProject(this, data);
}
void QbsProject::updateQmlJsCodeModel()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment