From ef963635606d17c7266e186f3172f2b2c0155d32 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 14 Oct 2010 14:44:50 +0200 Subject: [PATCH] QmlJS: Fix plugin dumpers running all the time if dump fails. Task-number: QTCREATORBUG-2733 Reviewed-by: Kai Koehne --- src/libs/qmljs/qmljsdocument.cpp | 1 + src/libs/qmljs/qmljsdocument.h | 7 ++++ src/plugins/qmljseditor/qmljsmodelmanager.cpp | 41 +++++++++++-------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp index 75379474f2e..dfc3025c026 100644 --- a/src/libs/qmljs/qmljsdocument.cpp +++ b/src/libs/qmljs/qmljsdocument.cpp @@ -358,6 +358,7 @@ LibraryInfo::LibraryInfo(const QmlDirParser &parser) : _valid(true) , _components(parser.components()) , _plugins(parser.plugins()) + , _dumped(false) { } diff --git a/src/libs/qmljs/qmljsdocument.h b/src/libs/qmljs/qmljsdocument.h index d4810e9a943..1424961dc64 100644 --- a/src/libs/qmljs/qmljsdocument.h +++ b/src/libs/qmljs/qmljsdocument.h @@ -122,6 +122,7 @@ class QMLJS_EXPORT LibraryInfo QList _plugins; typedef QList FakeMetaObjectList; FakeMetaObjectList _metaObjects; + bool _dumped; public: LibraryInfo(); @@ -142,6 +143,12 @@ public: bool isValid() const { return _valid; } + + bool isDumped() const + { return _dumped; } + + void setDumped(bool dumped) + { _dumped = dumped; } }; class QMLJS_EXPORT Snapshot diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.cpp b/src/plugins/qmljseditor/qmljsmodelmanager.cpp index f30357ff64c..379431fe2ba 100644 --- a/src/plugins/qmljseditor/qmljsmodelmanager.cpp +++ b/src/plugins/qmljseditor/qmljsmodelmanager.cpp @@ -472,6 +472,8 @@ void ModelManager::onLoadPluginTypes(const QString &libraryPath, const QString & const QString canonicalLibraryPath = QDir::cleanPath(libraryPath); if (m_runningQmldumps.values().contains(canonicalLibraryPath)) return; + if (_snapshot.libraryInfo(canonicalLibraryPath).isDumped()) + return; ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject(); if (!activeProject) @@ -526,36 +528,33 @@ void ModelManager::qmlPluginTypeDumpDone(int exitCode) process->deleteLater(); const QString libraryPath = m_runningQmldumps.take(process); + LibraryInfo libraryInfo = _snapshot.libraryInfo(libraryPath); + libraryInfo.setDumped(true); if (exitCode != 0) { Core::MessageManager *messageManager = Core::MessageManager::instance(); messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, process->readAllStandardError())); - return; } const QByteArray output = process->readAllStandardOutput(); QMap newObjects; const QString error = Interpreter::CppQmlTypesLoader::parseQmlTypeXml(output, &newObjects); - if (!error.isEmpty()) - return; - // convert from QList to QList - QList objectsList; - QMapIterator it(newObjects); - while (it.hasNext()) { - it.next(); - objectsList.append(it.value()); - } - - QMutexLocker locker(&m_mutex); - - if (!libraryPath.isEmpty()) { - LibraryInfo libraryInfo = _snapshot.libraryInfo(libraryPath); + if (exitCode == 0 && error.isEmpty()) { + // convert from QList to QList + QList objectsList; + QMapIterator it(newObjects); + while (it.hasNext()) { + it.next(); + objectsList.append(it.value()); + } libraryInfo.setMetaObjects(objectsList); - _snapshot.insertLibraryInfo(libraryPath, libraryInfo); - } else { - Interpreter::CppQmlTypesLoader::builtinObjects.append(objectsList); + if (libraryPath.isEmpty()) + Interpreter::CppQmlTypesLoader::builtinObjects.append(objectsList); } + + if (!libraryPath.isEmpty()) + emitLibraryInfoUpdated(libraryPath, libraryInfo); } void ModelManager::qmlPluginTypeDumpError(QProcess::ProcessError) @@ -569,4 +568,10 @@ void ModelManager::qmlPluginTypeDumpError(QProcess::ProcessError) Core::MessageManager *messageManager = Core::MessageManager::instance(); messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, process->readAllStandardError())); + + if (!libraryPath.isEmpty()) { + LibraryInfo libraryInfo = _snapshot.libraryInfo(libraryPath); + libraryInfo.setDumped(true); + emitLibraryInfoUpdated(libraryPath, libraryInfo); + } }