From 36e8b65d59bfafc9951279ce175241fc23afbee2 Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Wed, 25 Aug 2010 14:15:57 +0200 Subject: [PATCH] QmlJS: Fix running qmldump on plugins that require a specific uri. The builtin QML plugins require to be imported with the full uri, i.e. import Qt.labs.particles 1.0 so setting the import path to imports/Qt/labs and doing import particles 1.0 is not supposed to work. (see QTBUG-11139) This change adjusts qmldump to take an import path *and* the import uri, so it will be able to dump the type information for these plugins. Reviewed-by: Erik Verbruggen --- src/libs/qmljs/qmljslink.cpp | 15 ++++++++--- src/libs/qmljs/qmljsmodelmanagerinterface.h | 2 ++ src/plugins/qmljseditor/qmljsmodelmanager.cpp | 24 +++++++++++++----- src/plugins/qmljseditor/qmljsmodelmanager.h | 4 ++- src/tools/qml/qmldump/main.cpp | 25 +++++++++---------- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 2ff810ffb1b..c076773821e 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -33,6 +33,7 @@ #include "qmljsdocument.h" #include "qmljsbind.h" #include "qmljsscopebuilder.h" +#include "qmljsmodelmanagerinterface.h" #include <QtCore/QFileInfo> #include <QtCore/QDir> @@ -302,14 +303,22 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A if (!dir.cd(packagePath)) continue; - const LibraryInfo libraryInfo = _snapshot.libraryInfo(dir.path()); + const QString &libraryPath = dir.path(); + const LibraryInfo libraryInfo = _snapshot.libraryInfo(libraryPath); if (!libraryInfo.isValid()) continue; importFound = true; - if (!libraryInfo.plugins().isEmpty()) - engine()->cppQmlTypes().load(engine(), libraryInfo.metaObjects()); + if (!libraryInfo.plugins().isEmpty()) { + if (libraryInfo.metaObjects().isEmpty()) { + ModelManagerInterface *modelManager = ModelManagerInterface::instance(); + if (modelManager) + modelManager->loadPluginTypes(libraryPath, importPath, Bind::toString(import->importUri, QLatin1Char('.'))); + } else { + engine()->cppQmlTypes().load(engine(), libraryInfo.metaObjects()); + } + } QSet<QString> importedTypes; foreach (const QmlDirParser::Component &component, libraryInfo.components()) { diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h index 7cd4e9bc47d..896878bceb7 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.h +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h @@ -94,6 +94,8 @@ public: virtual QStringList importPaths() const = 0; + virtual void loadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri) = 0; + signals: void documentUpdated(QmlJS::Document::Ptr doc); void documentChangedOnDisk(QmlJS::Document::Ptr doc); diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.cpp b/src/plugins/qmljseditor/qmljsmodelmanager.cpp index 836ce34a15f..6bbe8a0b7f2 100644 --- a/src/plugins/qmljseditor/qmljsmodelmanager.cpp +++ b/src/plugins/qmljseditor/qmljsmodelmanager.cpp @@ -228,9 +228,6 @@ void ModelManager::onLibraryInfoUpdated(const QString &path, const LibraryInfo & { QMutexLocker locker(&m_mutex); - if (!_snapshot.libraryInfo(path).isValid()) - loadQmlPluginTypes(path); - _snapshot.insertLibraryInfo(path, info); } @@ -453,8 +450,20 @@ static QStringList environmentImportPaths() return paths; } -void ModelManager::loadQmlPluginTypes(const QString &pluginPath) +void ModelManager::loadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri) +{ + // make sure loading is always triggered in ModelManager's thread + metaObject()->invokeMethod(this, "onLoadPluginTypes", + Q_ARG(QString, libraryPath), + Q_ARG(QString, importPath), + Q_ARG(QString, importUri)); +} + +void ModelManager::onLoadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri) { + if (m_runningQmldumps.values().contains(libraryPath)) + return; + static QString qmldumpPath; if (qmldumpPath.isNull()) { QDir qmldumpExecutable(QCoreApplication::applicationDirPath()); @@ -482,8 +491,11 @@ void ModelManager::loadQmlPluginTypes(const QString &pluginPath) QProcess *process = new QProcess(this); connect(process, SIGNAL(finished(int)), SLOT(qmlPluginTypeDumpDone(int))); - process->start(qmldumpPath, QStringList(pluginPath)); - m_runningQmldumps.insert(process, pluginPath); + QStringList args; + args << importPath; + args << importUri; + process->start(qmldumpPath, args); + m_runningQmldumps.insert(process, libraryPath); } void ModelManager::updateImportPaths() diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.h b/src/plugins/qmljseditor/qmljsmodelmanager.h index 41d93fbf781..7b5ca21242a 100644 --- a/src/plugins/qmljseditor/qmljsmodelmanager.h +++ b/src/plugins/qmljseditor/qmljsmodelmanager.h @@ -69,6 +69,8 @@ public: virtual QStringList importPaths() const; + virtual void loadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri); + Q_SIGNALS: void projectPathChanged(const QString &projectPath); void libraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info); @@ -77,6 +79,7 @@ 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); + void onLoadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri); void qmlPluginTypeDumpDone(int exitCode); protected: @@ -98,7 +101,6 @@ protected: bool emitDocChangedOnDisk); void loadQmlTypeDescriptions(); - void loadQmlPluginTypes(const QString &pluginPath); void updateImportPaths(); diff --git a/src/tools/qml/qmldump/main.cpp b/src/tools/qml/qmldump/main.cpp index 99c70553a2a..24678d5030a 100644 --- a/src/tools/qml/qmldump/main.cpp +++ b/src/tools/qml/qmldump/main.cpp @@ -243,19 +243,16 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - if (argc != 1 && argc != 2) { - qWarning() << "Usage: qmldump [path/to/plugin/directory]"; + if (argc != 1 && argc != 3) { + qWarning() << "Usage: qmldump [plugin/import/path plugin.uri]"; return 1; } QString pluginImportName; QString pluginImportPath; - if (argc == 2) { - QFileInfo pluginPath(argv[1]); - if (pluginPath.exists() && pluginPath.isDir()) { - pluginImportPath = pluginPath.absolutePath(); - pluginImportName = pluginPath.fileName(); - } + if (argc == 3) { + pluginImportPath = QString(argv[1]); + pluginImportName = QString(argv[2]); } QDeclarativeView view; @@ -265,12 +262,14 @@ int main(int argc, char *argv[]) QByteArray importCode; importCode += "import Qt 4.7;\n"; - importCode += "import Qt.labs.particles 4.7;\n"; - importCode += "import Qt.labs.gestures 4.7;\n"; - importCode += "import Qt.labs.folderlistmodel 4.7;\n"; - importCode += "import QtWebKit 1.0;\n"; - if (!pluginImportName.isEmpty()) + if (pluginImportName.isEmpty()) { + importCode += "import Qt.labs.particles 4.7;\n"; + importCode += "import Qt.labs.gestures 4.7;\n"; + importCode += "import Qt.labs.folderlistmodel 4.7;\n"; + importCode += "import QtWebKit 1.0;\n"; + } else { importCode += QString("import %0 1.0;\n").arg(pluginImportName).toAscii(); + } { QByteArray code = importCode; -- GitLab