diff --git a/src/plugins/nim/project/nimproject.cpp b/src/plugins/nim/project/nimproject.cpp index 2f57238ef61..ec08a9d14eb 100644 --- a/src/plugins/nim/project/nimproject.cpp +++ b/src/plugins/nim/project/nimproject.cpp @@ -30,6 +30,7 @@ #include "../nimconstants.h" +#include #include #include #include @@ -37,6 +38,8 @@ #include #include +#include +#include #include #include @@ -60,9 +63,12 @@ NimProject::NimProject(NimProjectManager *projectManager, const QString &fileNam rootProjectNode()->setDisplayName(dir.dirName()); m_projectScanTimer.setSingleShot(true); - connect(&m_projectScanTimer, &QTimer::timeout, this, &NimProject::populateProject); + connect(&m_projectScanTimer, &QTimer::timeout, this, &NimProject::collectProjectFiles); - populateProject(); + m_futureWatcher.setFuture(m_futureInterface.future()); + connect(&m_futureWatcher, &QFutureWatcher>::finished, this, &NimProject::updateProject); + + collectProjectFiles(); connect(&m_fsWatcher, &QFileSystemWatcher::directoryChanged, this, &NimProject::scheduleProjectScan); } @@ -74,7 +80,7 @@ QString NimProject::displayName() const QStringList NimProject::files(FilesMode) const { - return QStringList(m_files.toList()); + return m_files; } bool NimProject::needsConfiguration() const @@ -91,45 +97,51 @@ void NimProject::scheduleProjectScan() m_projectScanTimer.start(); } } else { - populateProject(); + collectProjectFiles(); } } -void NimProject::populateProject() +void NimProject::collectProjectFiles() { m_lastProjectScan.start(); + QTC_ASSERT(!m_futureInterface.isRunning(), return); - QSet oldFiles = m_files; + runAsync([this]() { + m_futureInterface.reportStarted(); + QList nodes + = FileNode::scanForFiles(projectDirectory(), + [](const FileName &fn) { return new FileNode(fn, SourceType, false); }, + &m_futureInterface); + m_futureInterface.setProgressValue(m_futureInterface.progressMaximum()); + m_futureInterface.reportResult(nodes); + m_futureInterface.reportFinished(); + }); + Core::ProgressManager::addTask(m_futureInterface.future(), tr("Scanning for Nim files"), "Nim.Project.Scan"); +} + +void NimProject::updateProject() +{ + QStringList oldFiles = m_files; m_files.clear(); - recursiveScanDirectory(QDir(projectDirectory().toString()), m_files); - if (m_files == oldFiles) + QList fileNodes = Utils::filtered(m_futureInterface.future().result(), + [](const FileNode *fn) { + const QString fileName = fn->filePath().fileName(); + return !fileName.endsWith(".nimproject", HostOsInfo::fileNameCaseSensitivity()) + && !fileName.contains(".nimproject.user", HostOsInfo::fileNameCaseSensitivity()); + }); + + m_files = Utils::transform(fileNodes, [](const FileNode *fn) { return fn->filePath().toString(); }); + Utils::sort(m_files, [](const QString &a, const QString &b) { return a < b; }); + + if (oldFiles == m_files) return; - QList fileNodes = Utils::transform(m_files.toList(), [](const QString &f) { - return new FileNode(FileName::fromString(f), SourceType, false); - }); rootProjectNode()->buildTree(fileNodes); emit fileListChanged(); } -void NimProject::recursiveScanDirectory(const QDir &dir, QSet &container) -{ - static const QRegExp projectFilePattern(QLatin1String(".*\\.nimproject(?:\\.user)?$")); - for (const QFileInfo &info : dir.entryInfoList(QDir::AllDirs | - QDir::Files | - QDir::NoDotAndDotDot | - QDir::NoSymLinks | - QDir::CaseSensitive)) { - if (info.isDir()) - recursiveScanDirectory(QDir(info.filePath()), container); - else if (projectFilePattern.indexIn(info.fileName()) == -1) - container << info.filePath(); - } - m_fsWatcher.addPath(dir.absolutePath()); -} - bool NimProject::supportsKit(Kit *k, QString *) const { return k->isValid(); diff --git a/src/plugins/nim/project/nimproject.h b/src/plugins/nim/project/nimproject.h index 7c308bc17c1..8e7f87f4b0e 100644 --- a/src/plugins/nim/project/nimproject.h +++ b/src/plugins/nim/project/nimproject.h @@ -28,8 +28,9 @@ #include #include -#include #include +#include +#include #include namespace TextEditor { class TextDocument; } @@ -54,11 +55,13 @@ public: private: void scheduleProjectScan(); - void populateProject(); - void recursiveScanDirectory(const QDir &dir, QSet &container); + void collectProjectFiles(); + void updateProject(); - QSet m_files; + QStringList m_files; QFileSystemWatcher m_fsWatcher; + QFutureInterface> m_futureInterface; + QFutureWatcher> m_futureWatcher; QElapsedTimer m_lastProjectScan; QTimer m_projectScanTimer;