summaryrefslogtreecommitdiff
path: root/src/plugins
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
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')
-rw-r--r--src/plugins/cpptools/cppcodecompletion.cpp19
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp85
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h15
-rw-r--r--src/plugins/cpptools/cppmodelmanagerinterface.h2
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.cpp5
5 files changed, 108 insertions, 18 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 174234f076..f3c9a9d53f 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -52,7 +52,6 @@
#include <coreplugin/icore.h>
#include <coreplugin/editormanager/editormanager.h>
-#include <coreplugin/mimedatabase.h>
#include <texteditor/itexteditor.h>
#include <texteditor/itexteditable.h>
#include <texteditor/basetexteditor.h>
@@ -1216,29 +1215,13 @@ bool CppCodeCompletion::completeInclude(const QTextCursor &cursor)
if (!includePaths.contains(currentFilePath))
includePaths.append(currentFilePath);
- const Core::MimeDatabase *mimeDatabase = Core::ICore::instance()->mimeDatabase();
- const Core::MimeType mimeType = mimeDatabase->findByType(QLatin1String("text/x-c++hdr"));
- const QStringList suffixes = mimeType.suffixes();
-
foreach (const QString &includePath, includePaths) {
QString realPath = includePath;
if (!directoryPrefix.isEmpty()) {
realPath += QLatin1Char('/');
realPath += directoryPrefix;
}
- // TODO: This should be cached
- QDirIterator i(realPath, 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(realPath.length() + 1);
- if (fileInfo.isDir())
- text += QLatin1Char('/');
- items.append(text);
- }
- }
+ items.append(m_manager->includesInPath(realPath));
}
if (!items.isEmpty()) {
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)
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index a662618809..e911971773 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -77,6 +77,8 @@ public:
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
virtual void updateProjectInfo(const ProjectInfo &pinfo);
+ virtual QStringList includesInPath(const QString &path) const;
+
virtual CPlusPlus::Snapshot snapshot() const;
virtual void GC();
@@ -99,6 +101,9 @@ public:
virtual void addEditorSupport(AbstractEditorSupport *editorSupport);
virtual void removeEditorSupport(AbstractEditorSupport *editorSupport);
+ void setHeaderSuffixes(const QStringList &suffixes)
+ { m_headerSuffixes = suffixes; }
+
Q_SIGNALS:
void projectPathChanged(const QString &projectPath);
@@ -149,6 +154,13 @@ private:
QStringList internalFrameworkPaths() const;
QByteArray internalDefinedMacros() const;
+ void setIncludesInPaths(const QMap<QString, QStringList> includesInPaths);
+
+ static void updateIncludesInPaths(QFutureInterface<void> &future,
+ CppModelManager *manager,
+ QStringList paths,
+ QStringList suffixes);
+
static void parse(QFutureInterface<void> &future,
CppPreprocessor *preproc,
QStringList files);
@@ -164,6 +176,9 @@ private:
QStringList m_frameworkPaths;
QByteArray m_definedMacros;
+ QMap<QString, QStringList> m_includesInPaths;
+ QStringList m_headerSuffixes;
+
// editor integration
QMap<TextEditor::ITextEditor *, CppEditorSupport *> m_editorSupport;
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index ce56686858..463e77a367 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -90,6 +90,8 @@ public:
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
virtual void updateProjectInfo(const ProjectInfo &pinfo) = 0;
+ virtual QStringList includesInPath(const QString &path) const = 0;
+
virtual void addEditorSupport(AbstractEditorSupport *editorSupport) = 0;
virtual void removeEditorSupport(AbstractEditorSupport *editorSupport) = 0;
};
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 30858508d4..210419b920 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -263,6 +263,11 @@ void CppToolsPlugin::extensionsInitialized()
m_fileSettings->fromSettings(Core::ICore::instance()->settings());
if (!m_fileSettings->applySuffixesToMimeDB())
qWarning("Unable to apply cpp suffixes to mime database (cpp mime types not found).\n");
+
+ // Initialize header suffixes
+ const Core::MimeDatabase *mimeDatabase = Core::ICore::instance()->mimeDatabase();
+ const Core::MimeType mimeType = mimeDatabase->findByType(QLatin1String("text/x-c++hdr"));
+ m_modelManager->setHeaderSuffixes(mimeType.suffixes());
}
void CppToolsPlugin::shutdown()