void PluginDumper::qmlPluginTypeDumpDone(int exitCode) { QProcess *process = qobject_cast<QProcess *>(sender()); if (!process) return; process->deleteLater(); const QString libraryPath = m_runningQmldumps.take(process); const Snapshot snapshot = m_modelManager->snapshot(); LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath); if (exitCode != 0) { Core::MessageManager *messageManager = Core::MessageManager::instance(); const QString errorMessages = process->readAllStandardError(); messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, errorMessages)); libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(errorMessages)); } const QByteArray output = process->readAllStandardOutput(); QString error; QString warning; QList<FakeMetaObject::ConstPtr> objectsList = parseHelper(output, &error, &warning); if (exitCode == 0) { if (!error.isEmpty()) { libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, tr("Type dump of C++ plugin failed. Parse error:\n'%1'").arg(error)); } else { libraryInfo.setMetaObjects(objectsList); // ### disabled code path for running qmldump to get Qt's builtins // if (libraryPath.isEmpty()) // Interpreter::CppQmlTypesLoader::builtinObjects.append(objectsList); libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpDone); } if (!warning.isEmpty()) printParseWarnings(libraryPath, warning); } if (!libraryPath.isEmpty()) m_modelManager->updateLibraryInfo(libraryPath, libraryInfo); }
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); }