Read qmldir files in a thread and cache them in Snapshot.

Reviewed-by: Erik Verbruggen
This commit is contained in:
Christian Kamm
2010-03-18 15:43:33 +01:00
parent 4261aca7b0
commit 6eadfa3ac0
8 changed files with 104 additions and 13 deletions

View File

@@ -36,6 +36,7 @@
#include <coreplugin/progressmanager/progressmanager.h>
#include <coreplugin/mimedatabase.h>
#include <qmljs/qmljsinterpreter.h>
#include <qmljs/parser/qmldirparser_p.h>
#include <texteditor/itexteditor.h>
#include <QDir>
@@ -62,9 +63,12 @@ ModelManager::ModelManager(QObject *parent):
m_synchronizer.setCancelOnWait(true);
qRegisterMetaType<QmlJS::Document::Ptr>("QmlJS::Document::Ptr");
qRegisterMetaType<QmlJS::LibraryInfo>("QmlJS::LibraryInfo");
connect(this, SIGNAL(documentUpdated(QmlJS::Document::Ptr)),
this, SLOT(onDocumentUpdated(QmlJS::Document::Ptr)));
connect(this, SIGNAL(libraryInfoUpdated(QString,QmlJS::LibraryInfo)),
this, SLOT(onLibraryInfoUpdated(QString,QmlJS::LibraryInfo)));
loadQmlTypeDescriptions();
@@ -197,6 +201,16 @@ void ModelManager::onDocumentUpdated(Document::Ptr doc)
_snapshot.insert(doc);
}
void ModelManager::emitLibraryInfoUpdated(const QString &path, const LibraryInfo &info)
{ emit libraryInfoUpdated(path, info); }
void ModelManager::onLibraryInfoUpdated(const QString &path, const LibraryInfo &info)
{
QMutexLocker locker(&m_mutex);
_snapshot.insertLibraryInfo(path, info);
}
void ModelManager::parse(QFutureInterface<void> &future,
QMap<QString, WorkingCopy> workingCopy,
QStringList files,
@@ -270,13 +284,33 @@ void ModelManager::parseDirectories(QFutureInterface<void> &future,
pattern << glob.pattern();
foreach (const QRegExp &glob, qmlSourceTy.globPatterns())
pattern << glob.pattern();
pattern << QLatin1String("qmldir");
QStringList importedFiles;
QStringList qmldirFiles;
foreach (const QString &path, directories) {
QDirIterator fileIterator(path, pattern, QDir::Files,
QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
while (fileIterator.hasNext())
importedFiles << fileIterator.next();
while (fileIterator.hasNext()) {
fileIterator.next();
if (fileIterator.fileName() == QLatin1String("qmldir"))
qmldirFiles << fileIterator.filePath();
else
importedFiles << fileIterator.filePath();
}
}
foreach (const QString &qmldirFilePath, qmldirFiles) {
QFile qmldirFile(qmldirFilePath);
qmldirFile.open(QFile::ReadOnly);
QString qmldirData = QString::fromUtf8(qmldirFile.readAll());
QmlDirParser qmldirParser;
qmldirParser.setSource(qmldirData);
qmldirParser.parse();
modelManager->emitLibraryInfoUpdated(QFileInfo(qmldirFilePath).path(),
LibraryInfo(qmldirParser));
}
parse(future, workingCopy, importedFiles, modelManager);

View File

@@ -58,6 +58,7 @@ public:
virtual void updateSourceDirectories(const QStringList &directories);
void emitDocumentUpdated(QmlJS::Document::Ptr doc);
void emitLibraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
virtual void setProjectImportPaths(const QStringList &importPaths);
virtual QStringList importPaths() const;
@@ -65,10 +66,12 @@ public:
Q_SIGNALS:
void projectPathChanged(const QString &projectPath);
void aboutToRemoveFiles(const QStringList &files);
void libraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
private Q_SLOTS:
// this should be executed in the GUI thread.
void onDocumentUpdated(QmlJS::Document::Ptr doc);
void onLibraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
protected:
struct WorkingCopy