From 7e3356c324ef5f3eb2c58392847ca319c712eb82 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 3 Apr 2019 16:57:18 +0200 Subject: [PATCH] QbsProjectManager: Fix infinite loop when "force probes" is checked This happened for all projects with a Qt dependency, because the module provider kept recreating the Qt modules, which in turn caused Qt Creator to re-parse the project. Change-Id: I77c5c8723c1d0bcd477db648692ddaf9e060ce99 Reviewed-by: Joerg Bornemann --- src/plugins/qbsprojectmanager/qbsproject.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 0ea82d6f405..521b210852f 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -756,10 +756,16 @@ void QbsProject::updateDocuments(const QSet &files) } } QSet toAdd; - foreach (const QString &f, filesToAdd) - toAdd.insert(new ProjectDocument(Constants::MIME_TYPE, FileName::fromString(f), - [this]() { delayParsing(); })); - + const FileName buildDir = FileName::fromString(m_projectData.buildDirectory()); + for (const QString &f : qAsConst(filesToAdd)) { + // A changed qbs file (project, module etc) should trigger a re-parse, but not if + // the file was generated by qbs itself, in which case that might cause an infinite loop. + const FileName fp = FileName::fromString(f); + static const ProjectDocument::ProjectCallback noOpCallback = []{}; + const ProjectDocument::ProjectCallback reparseCallback = [this]() { delayParsing(); }; + toAdd.insert(new ProjectDocument(Constants::MIME_TYPE, fp, fp.isChildOf(buildDir) + ? noOpCallback : reparseCallback)); + } m_qbsDocuments.unite(toAdd); }