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
This commit is contained in:
Christian Kamm
2010-08-25 14:15:57 +02:00
parent 6cf563bb25
commit 36e8b65d59
5 changed files with 47 additions and 23 deletions

View File

@@ -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()) {

View File

@@ -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);

View File

@@ -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()

View File

@@ -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();

View File

@@ -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;