forked from qt-creator/qt-creator
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:
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user