QmakePM: Only schedule update when files are added/removed

When a file is saved, the directory is also touched. If files are not
added or removed, it is not necessary to reparse the project.

Change-Id: I718db68362d41ba936629be880f739ad79b8cb6f
Fixes: QTCREATORBUG-22361
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Ville Nummela
2019-04-25 11:06:58 +03:00
parent 50715e71b9
commit ecd386c67b
2 changed files with 24 additions and 10 deletions

View File

@@ -1623,25 +1623,38 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
m_wildcardWatcher = std::make_unique<Utils::FileSystemWatcher>(); m_wildcardWatcher = std::make_unique<Utils::FileSystemWatcher>();
QObject::connect( QObject::connect(
m_wildcardWatcher.get(), &Utils::FileSystemWatcher::directoryChanged, m_wildcardWatcher.get(), &Utils::FileSystemWatcher::directoryChanged,
[this]() { [this](QString path) {
QStringList directoryContents = QDir(path).entryList();
if (m_wildcardDirectoryContents.value(path) != directoryContents) {
m_wildcardDirectoryContents.insert(path, directoryContents);
scheduleUpdate(); scheduleUpdate();
}
}); });
} }
m_wildcardWatcher->addDirectories( const QStringList directoriesToAdd = Utils::filtered<QStringList>(
Utils::filtered<QStringList>(result->directoriesWithWildcards.toList(), result->directoriesWithWildcards.toList(),
[this](const QString &path) { [this](const QString &path) {
return !m_wildcardWatcher->watchesDirectory(path); return !m_wildcardWatcher->watchesDirectory(path);
}), Utils::FileSystemWatcher::WatchModifiedDate); });
for (QString path : directoriesToAdd)
m_wildcardDirectoryContents.insert(path, QDir(path).entryList());
m_wildcardWatcher->addDirectories(directoriesToAdd,
Utils::FileSystemWatcher::WatchModifiedDate);
} }
if (m_wildcardWatcher) { if (m_wildcardWatcher) {
if (result->directoriesWithWildcards.isEmpty()) { if (result->directoriesWithWildcards.isEmpty()) {
m_wildcardWatcher.reset(); m_wildcardWatcher.reset();
m_wildcardDirectoryContents.clear();
} else { } else {
m_wildcardWatcher->removeDirectories( const QStringList directoriesToRemove =
Utils::filtered<QStringList>(m_wildcardWatcher->directories(), Utils::filtered<QStringList>(
m_wildcardWatcher->directories(),
[&result](const QString &path) { [&result](const QString &path) {
return !result->directoriesWithWildcards.contains(path); return !result->directoriesWithWildcards.contains(path);
})); });
m_wildcardWatcher->removeDirectories(directoriesToRemove);
for (QString path : directoriesToRemove)
m_wildcardDirectoryContents.remove(path);
} }
} }

View File

@@ -370,6 +370,7 @@ private:
InstallsList m_installsList; InstallsList m_installsList;
std::unique_ptr<Utils::FileSystemWatcher> m_wildcardWatcher; std::unique_ptr<Utils::FileSystemWatcher> m_wildcardWatcher;
QMap<QString, QStringList> m_wildcardDirectoryContents;
// Async stuff // Async stuff
QFutureWatcher<Internal::QmakeEvalResult *> m_parseFutureWatcher; QFutureWatcher<Internal::QmakeEvalResult *> m_parseFutureWatcher;