forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user