void PluginDumper::onLoadBuiltinTypes(const QmlJS::ModelManagerInterface::ProjectInfo &info, bool force) { if (info.qmlDumpPath.isEmpty() || info.qtQmlPath.isEmpty()) return; const QString importsPath = QDir::cleanPath(info.qtQmlPath); if (m_runningQmldumps.values().contains(importsPath)) return; LibraryInfo builtinInfo; if (!force) { const Snapshot snapshot = m_modelManager->snapshot(); builtinInfo = snapshot.libraryInfo(info.qtQmlPath); if (builtinInfo.isValid()) return; } builtinInfo = LibraryInfo(LibraryInfo::Found); m_modelManager->updateLibraryInfo(info.qtQmlPath, builtinInfo); // prefer QTDIR/qml/builtins.qmltypes if available const QString builtinQmltypesPath = info.qtQmlPath + QLatin1String("/builtins.qmltypes"); if (QFile::exists(builtinQmltypesPath)) { loadQmltypesFile(QStringList(builtinQmltypesPath), info.qtQmlPath, builtinInfo); return; } runQmlDump(info, QStringList(QLatin1String("--builtins")), info.qtQmlPath); m_qtToInfo.insert(info.qtQmlPath, info); }
void PluginDumper::onLoadBuiltinTypes(const QmlJS::ModelManagerInterface::ProjectInfo &info, bool force) { if (info.qmlDumpPath.isEmpty() || info.qtImportsPath.isEmpty()) return; const QString importsPath = QDir::cleanPath(info.qtImportsPath); if (m_runningQmldumps.values().contains(importsPath)) return; LibraryInfo builtinInfo; if (!force) { const Snapshot snapshot = m_modelManager->snapshot(); builtinInfo = snapshot.libraryInfo(info.qtImportsPath); if (builtinInfo.isValid()) return; } builtinInfo = LibraryInfo(LibraryInfo::Found); m_modelManager->updateLibraryInfo(info.qtImportsPath, builtinInfo); // prefer QTDIR/imports/builtins.qmltypes if available const QString builtinQmltypesPath = info.qtImportsPath + QLatin1String("/builtins.qmltypes"); if (QFile::exists(builtinQmltypesPath)) { loadQmltypesFile(QStringList(builtinQmltypesPath), info.qtImportsPath, builtinInfo); return; } // QTDIR/imports/QtQuick1/builtins.qmltypes was used in developer builds of 5.0.0, 5.0.1 const QString builtinQmltypesPath2 = info.qtImportsPath + QLatin1String("/QtQuick1/builtins.qmltypes"); if (QFile::exists(builtinQmltypesPath2)) { loadQmltypesFile(QStringList(builtinQmltypesPath2), info.qtImportsPath, builtinInfo); return; } // run qmldump QProcess *process = new QProcess(this); process->setEnvironment(info.qmlDumpEnvironment.toStringList()); connect(process, SIGNAL(finished(int)), SLOT(qmlPluginTypeDumpDone(int))); connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError))); QStringList args(QLatin1String("--builtins")); process->start(info.qmlDumpPath, args); m_runningQmldumps.insert(process, info.qtImportsPath); m_qtToInfo.insert(info.qtImportsPath, info); }
void PluginDumper::dump(const Plugin &plugin) { if (plugin.hasPredumpedQmlTypesFile()) { const Snapshot snapshot = m_modelManager->snapshot(); LibraryInfo libraryInfo = snapshot.libraryInfo(plugin.qmldirPath); if (!libraryInfo.isValid()) return; const QString &path = plugin.predumpedQmlTypesFilePath(); Utils::FileReader reader; if (!reader.fetch(path, QFile::Text)) { libraryInfo.setPluginTypeInfoStatus(LibraryInfo::TypeInfoFileError, reader.errorString()); m_modelManager->updateLibraryInfo(plugin.qmldirPath, libraryInfo); return; } QString error; QString warning; const QList<FakeMetaObject::ConstPtr> objectsList = parseHelper(reader.data(), &error, &warning); if (error.isEmpty()) { libraryInfo.setMetaObjects(objectsList); libraryInfo.setPluginTypeInfoStatus(LibraryInfo::TypeInfoFileDone); } else { libraryInfo.setPluginTypeInfoStatus(LibraryInfo::TypeInfoFileError, tr("Failed to parse '%1'.\nError: %2").arg(path, error)); } if (!warning.isEmpty()) printParseWarnings(plugin.qmldirPath, warning); m_modelManager->updateLibraryInfo(plugin.qmldirPath, libraryInfo); return; } ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject(); if (!activeProject) return; ModelManagerInterface::ProjectInfo info = m_modelManager->projectInfo(activeProject); if (info.qmlDumpPath.isEmpty()) { const Snapshot snapshot = m_modelManager->snapshot(); LibraryInfo libraryInfo = snapshot.libraryInfo(plugin.qmldirPath); if (!libraryInfo.isValid()) return; libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, tr("Could not locate the helper application for dumping type information from C++ plugins.\n" "Please build the debugging helpers on the Qt version options page.")); m_modelManager->updateLibraryInfo(plugin.qmldirPath, libraryInfo); return; } QProcess *process = new QProcess(this); process->setEnvironment(info.qmlDumpEnvironment.toStringList()); connect(process, SIGNAL(finished(int)), SLOT(qmlPluginTypeDumpDone(int))); connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError))); QStringList args; if (plugin.importUri.isEmpty()) { args << QLatin1String("--path"); args << plugin.importPath; if (ComponentVersion(plugin.importVersion).isValid()) args << plugin.importVersion; } else { args << plugin.importUri; args << plugin.importVersion; args << plugin.importPath; } process->start(info.qmlDumpPath, args); m_runningQmldumps.insert(process, plugin.qmldirPath); }