summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppmodelmanager.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2009-07-24 12:50:10 +0200
committerThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2009-07-24 12:52:42 +0200
commit00f7dd4586b54218b5eee1d62f04c7a451e9da84 (patch)
treea54ae9a6bdfbc07f500ae06bb125e38b9ac8a04c /src/plugins/cpptools/cppmodelmanager.cpp
parentf4ec27cdc2ed45cd1c7d82bad20e0e05ca88f0e3 (diff)
downloadqt-creator-00f7dd4586b54218b5eee1d62f04c7a451e9da84.tar.gz
Do the scanning for include files in the background
In order to speed up completion for include statements. Reviewed-by: Daniel Molkentin <daniel.molkentin@nokia.com>
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index f23fd06209..c9c529983c 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -701,6 +701,16 @@ QByteArray CppModelManager::internalDefinedMacros() const
return macros;
}
+void CppModelManager::setIncludesInPaths(const QMap<QString, QStringList> includesInPaths)
+{
+ QMutexLocker locker(&mutex);
+ QMapIterator<QString, QStringList> i(includesInPaths);
+ while (i.hasNext()) {
+ i.next();
+ m_includesInPaths.insert(i.key(), i.value());
+ }
+}
+
void CppModelManager::addEditorSupport(AbstractEditorSupport *editorSupport)
{
m_addtionalEditorSupport.insert(editorSupport);
@@ -763,6 +773,23 @@ void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
m_projects.insert(pinfo.project, pinfo);
m_dirty = true;
+
+ QFuture<void> result = QtConcurrent::run(&CppModelManager::updateIncludesInPaths,
+ this,
+ pinfo.includePaths,
+ m_headerSuffixes);
+
+ if (pinfo.includePaths.size() > 1) {
+ m_core->progressManager()->addTask(result, tr("Scanning"),
+ CppTools::Constants::TASK_INDEX,
+ Core::ProgressManager::CloseOnSuccess);
+ }
+}
+
+QStringList CppModelManager::includesInPath(const QString &path) const
+{
+ QMutexLocker locker(&mutex);
+ return m_includesInPaths.value(path);
}
QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles)
@@ -1064,6 +1091,64 @@ void CppModelManager::onSessionUnloaded()
GC();
}
+void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
+ CppModelManager *manager,
+ QStringList paths,
+ QStringList suffixes)
+{
+ QMap<QString, QStringList> entriesInPaths;
+ int processed = 0;
+
+ future.setProgressRange(0, paths.size());
+
+ while (!paths.isEmpty()) {
+ if (future.isPaused())
+ future.waitForResume();
+
+ if (future.isCanceled())
+ break;
+
+ const QString path = paths.takeFirst();
+ QStringList entries;
+
+ QDirIterator i(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
+ while (i.hasNext()) {
+ const QString fileName = i.next();
+ const QFileInfo fileInfo = i.fileInfo();
+ const QString suffix = fileInfo.suffix();
+ if (suffix.isEmpty() || suffixes.contains(suffix)) {
+ QString text = fileName.mid(path.length() + 1);
+ if (fileInfo.isDir()) {
+ text += QLatin1Char('/');
+
+ // Also scan subdirectory, but avoid endless recursion with symbolic links
+ if (fileInfo.isSymLink()) {
+ QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(fileInfo.canonicalFilePath());
+ if (result != entriesInPaths.constEnd()) {
+ entriesInPaths.insert(fileName, result.value());
+ } else {
+ paths.append(fileName);
+ }
+ } else {
+ paths.append(fileName);
+ }
+ }
+ entries.append(text);
+ }
+ }
+
+ entriesInPaths.insert(path, entries);
+
+ ++processed;
+ future.setProgressRange(0, processed + paths.size());
+ future.setProgressValue(processed);
+ }
+
+ manager->setIncludesInPaths(entriesInPaths);
+
+ future.reportFinished();
+}
+
void CppModelManager::parse(QFutureInterface<void> &future,
CppPreprocessor *preproc,
QStringList files)