diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 671cd5bfecf..7b050a5ed64 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1623,25 +1623,38 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult) m_wildcardWatcher = std::make_unique(); QObject::connect( m_wildcardWatcher.get(), &Utils::FileSystemWatcher::directoryChanged, - [this]() { - scheduleUpdate(); + [this](QString path) { + QStringList directoryContents = QDir(path).entryList(); + if (m_wildcardDirectoryContents.value(path) != directoryContents) { + m_wildcardDirectoryContents.insert(path, directoryContents); + scheduleUpdate(); + } }); } - m_wildcardWatcher->addDirectories( - Utils::filtered(result->directoriesWithWildcards.toList(), - [this](const QString &path) { - return !m_wildcardWatcher->watchesDirectory(path); - }), Utils::FileSystemWatcher::WatchModifiedDate); + const QStringList directoriesToAdd = Utils::filtered( + result->directoriesWithWildcards.toList(), + [this](const QString &path) { + return !m_wildcardWatcher->watchesDirectory(path); + }); + for (QString path : directoriesToAdd) + m_wildcardDirectoryContents.insert(path, QDir(path).entryList()); + m_wildcardWatcher->addDirectories(directoriesToAdd, + Utils::FileSystemWatcher::WatchModifiedDate); } if (m_wildcardWatcher) { if (result->directoriesWithWildcards.isEmpty()) { m_wildcardWatcher.reset(); + m_wildcardDirectoryContents.clear(); } else { - m_wildcardWatcher->removeDirectories( - Utils::filtered(m_wildcardWatcher->directories(), + const QStringList directoriesToRemove = + Utils::filtered( + m_wildcardWatcher->directories(), [&result](const QString &path) { return !result->directoriesWithWildcards.contains(path); - })); + }); + m_wildcardWatcher->removeDirectories(directoriesToRemove); + for (QString path : directoriesToRemove) + m_wildcardDirectoryContents.remove(path); } } diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h index 6f0e13a5c95..68b406fe63a 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h @@ -370,6 +370,7 @@ private: InstallsList m_installsList; std::unique_ptr m_wildcardWatcher; + QMap m_wildcardDirectoryContents; // Async stuff QFutureWatcher m_parseFutureWatcher;