diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index 19af8d2a725..e6c6bd6a500 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -858,7 +858,7 @@ void FileApiParser::setupCMakeFileApi() const QTC_ASSERT(queryDir.exists(), ); bool failedBefore = false; - for (const QString &fileName : QStringList({"cache-v2", "codemodel-v2", "cmakeFiles-v1"})) { + for (const QString &fileName : cmakeQueryFileNames()) { const QString filePath = queryDir.filePath(fileName); QFile f(filePath); @@ -933,6 +933,19 @@ QFileInfo FileApiParser::scanForCMakeReplyFile() const return fis.isEmpty() ? QFileInfo() : fis.last(); } +QStringList FileApiParser::cmakeQueryFileNames() const +{ + return {"cache-v2", "codemodel-v2", "cmakeFiles-v1"}; +} + +QStringList FileApiParser::cmakeQueryFilePaths() const +{ + QDir queryDir(QDir::cleanPath(m_sourceDirectory.toString() + "/" + + QString::fromLatin1(CMAKE_RELATIVE_QUERY_PATH))); + return transform(cmakeQueryFileNames(), + [&queryDir](const QString &name) { return queryDir.absoluteFilePath(name); }); +} + void FileApiParser::replyDirectoryHasChanged(const QString &directory) const { if (directory == cmakeReplyDirectory().toString()) { diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.h b/src/plugins/cmakeprojectmanager/fileapiparser.h index 3a4fdfbd823..8bf7132b7f1 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.h +++ b/src/plugins/cmakeprojectmanager/fileapiparser.h @@ -248,6 +248,9 @@ public: Utils::FilePath cmakeReplyDirectory() const; QFileInfo scanForCMakeReplyFile() const; + QStringList cmakeQueryFileNames() const; + QStringList cmakeQueryFilePaths() const; + static FileApiData parseData(const QFileInfo &replyFileInfo, QString &errorMessage); signals: diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index e98f2c9c118..82aa5542c5f 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -69,8 +69,7 @@ FileApiReader::FileApiReader() &Core::EditorManager::aboutToSave, this, [this](const Core::IDocument *document) { - if (m_cmakeFiles.contains(document->filePath()) || !m_parameters.cmakeTool() - || !m_parameters.cmakeTool()->isAutoRun()) { + if (m_cmakeFiles.contains(document->filePath())) { qCDebug(cmakeFileApiMode) << "FileApiReader: DIRTY SIGNAL"; emit dirty(); } @@ -139,9 +138,21 @@ void FileApiReader::parse(bool forceCMakeRun, bool forceConfiguration) } const QFileInfo replyFi = m_fileApi->scanForCMakeReplyFile(); - const bool mustUpdate = forceCMakeRun || !replyFi.exists() || m_cmakeFiles.isEmpty() - || anyOf(m_cmakeFiles, [&replyFi](const FilePath &f) { - return f.toFileInfo().lastModified() > replyFi.lastModified(); + // Only need to update when one of the following conditions is met: + // * The user forces the update, + // * There is no reply file, + // * One of the cmakefiles is newer than the replyFile and the user asked + // for creator to run CMake as needed, + // * A query files are newer than the reply file + const bool mustUpdate = forceCMakeRun || !replyFi.exists() + || (m_parameters.cmakeTool() && m_parameters.cmakeTool()->isAutoRun() + && anyOf(m_cmakeFiles, + [&replyFi](const FilePath &f) { + return f.toFileInfo().lastModified() + > replyFi.lastModified(); + })) + || anyOf(m_fileApi->cmakeQueryFilePaths(), [&replyFi](const QString &qf) { + return QFileInfo(qf).lastModified() > replyFi.lastModified(); }); if (mustUpdate) {