forked from qt-creator/qt-creator
QmakeProjectManager: Fix possible crash on project document reload
... while a parse is going on. Fixes: QTCREATORBUG-25137 Change-Id: I02a914332ef120caee044139581e1901b4537bff Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -388,6 +388,25 @@ void Project::setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Project::updateExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
|
||||||
|
const DocUpdater &docUpdater)
|
||||||
|
{
|
||||||
|
for (const Utils::FilePath &fp : projectDocumentPaths) {
|
||||||
|
for (const auto &doc : d->m_extraProjectDocuments) {
|
||||||
|
if (doc->filePath() == fp) {
|
||||||
|
docUpdater(doc.get());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Project::updateExtraProjectFiles(const DocUpdater &docUpdater)
|
||||||
|
{
|
||||||
|
for (const auto &doc : qAsConst(d->m_extraProjectDocuments))
|
||||||
|
docUpdater(doc.get());
|
||||||
|
}
|
||||||
|
|
||||||
Target *Project::target(Utils::Id id) const
|
Target *Project::target(Utils::Id id) const
|
||||||
{
|
{
|
||||||
return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::id, id));
|
return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::id, id));
|
||||||
|
@@ -169,6 +169,9 @@ public:
|
|||||||
void setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
|
void setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
|
||||||
const DocGenerator &docGenerator = {},
|
const DocGenerator &docGenerator = {},
|
||||||
const DocUpdater &docUpdater = {});
|
const DocUpdater &docUpdater = {});
|
||||||
|
void updateExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
|
||||||
|
const DocUpdater &docUpdater);
|
||||||
|
void updateExtraProjectFiles(const DocUpdater &docUpdater);
|
||||||
|
|
||||||
void setDisplayName(const QString &name);
|
void setDisplayName(const QString &name);
|
||||||
void setProjectLanguage(Utils::Id id, bool enabled);
|
void setProjectLanguage(Utils::Id id, bool enabled);
|
||||||
|
@@ -122,7 +122,8 @@ public:
|
|||||||
Q_UNUSED(errorString)
|
Q_UNUSED(errorString)
|
||||||
Q_UNUSED(flag)
|
Q_UNUSED(flag)
|
||||||
Q_UNUSED(type)
|
Q_UNUSED(type)
|
||||||
m_priFile->scheduleUpdate();
|
if (m_priFile)
|
||||||
|
m_priFile->scheduleUpdate();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -692,7 +693,26 @@ void QmakeBuildSystem::asyncUpdate()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we ignore requests for re-evaluation for files whose QmakePriFile objects
|
||||||
|
// will get deleted during the parse.
|
||||||
|
const auto docUpdater = [](Core::IDocument *doc) {
|
||||||
|
static_cast<QmakePriFileDocument *>(doc)->setPriFile(nullptr);
|
||||||
|
};
|
||||||
|
if (m_asyncUpdateState != AsyncFullUpdatePending) {
|
||||||
|
QSet<FilePath> projectFilePaths;
|
||||||
|
for (QmakeProFile * const file : qAsConst(m_partialEvaluate)) {
|
||||||
|
QVector<QmakePriFile *> priFiles = file->children();
|
||||||
|
for (int i = 0; i < priFiles.count(); ++i) {
|
||||||
|
const QmakePriFile * const priFile = priFiles.at(i);
|
||||||
|
projectFilePaths << priFile->filePath();
|
||||||
|
priFiles << priFile->children();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
project()->updateExtraProjectFiles(projectFilePaths, docUpdater);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_asyncUpdateState == AsyncFullUpdatePending) {
|
if (m_asyncUpdateState == AsyncFullUpdatePending) {
|
||||||
|
project()->updateExtraProjectFiles(docUpdater);
|
||||||
rootProFile()->asyncUpdate();
|
rootProFile()->asyncUpdate();
|
||||||
} else {
|
} else {
|
||||||
foreach (QmakeProFile *file, m_partialEvaluate)
|
foreach (QmakeProFile *file, m_partialEvaluate)
|
||||||
|
Reference in New Issue
Block a user