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); }