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::onLoadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri, const QString &importVersion) { const QString canonicalLibraryPath = QDir::cleanPath(libraryPath); if (m_runningQmldumps.values().contains(canonicalLibraryPath)) return; const Snapshot snapshot = m_modelManager->snapshot(); const LibraryInfo libraryInfo = snapshot.libraryInfo(canonicalLibraryPath); if (libraryInfo.pluginTypeInfoStatus() != LibraryInfo::NoTypeInfo) return; // avoid inserting the same plugin twice int index; for (index = 0; index < m_plugins.size(); ++index) { if (m_plugins.at(index).qmldirPath == libraryPath) break; } if (index == m_plugins.size()) m_plugins.append(Plugin()); Plugin &plugin = m_plugins[index]; plugin.qmldirPath = canonicalLibraryPath; plugin.importPath = importPath; plugin.importUri = importUri; plugin.importVersion = importVersion; // add default qmltypes file if it exists const QLatin1String defaultQmltypesFileName("plugins.qmltypes"); const QString defaultQmltypesPath = makeAbsolute(defaultQmltypesFileName, canonicalLibraryPath); if (!plugin.typeInfoPaths.contains(defaultQmltypesPath) && QFile::exists(defaultQmltypesPath)) plugin.typeInfoPaths += defaultQmltypesPath; // add typeinfo files listed in qmldir foreach (const QmlDirParser::TypeInfo &typeInfo, libraryInfo.typeInfos()) { QString pathNow = makeAbsolute(typeInfo.fileName, canonicalLibraryPath); if (!plugin.typeInfoPaths.contains(pathNow) && QFile::exists(pathNow)) plugin.typeInfoPaths += pathNow; } // watch plugin libraries foreach (const QmlDirParser::Plugin &plugin, snapshot.libraryInfo(canonicalLibraryPath).plugins()) { const QString pluginLibrary = resolvePlugin(canonicalLibraryPath, plugin.path, plugin.name); if (!pluginLibrary.isEmpty()) { if (!pluginWatcher()->watchesFile(pluginLibrary)) pluginWatcher()->addFile(pluginLibrary, Utils::FileSystemWatcher::WatchModifiedDate); m_libraryToPluginIndex.insert(pluginLibrary, index); } } // watch library qmltypes file if (!plugin.typeInfoPaths.isEmpty()) { foreach (const QString &path, plugin.typeInfoPaths) { if (!QFile::exists(path)) continue; if (!pluginWatcher()->watchesFile(path)) pluginWatcher()->addFile(path, Utils::FileSystemWatcher::WatchModifiedDate); m_libraryToPluginIndex.insert(path, index); } }
LibraryInfo TestBase::buildLibraryInfo(const QString& directoryPath, const QString& libraryFileName) { LibraryInfo li; const auto libraryPath = QDir::cleanPath( directoryPath + "/" + libraryFileName ); li.setAbsoluteFilePath(libraryPath); li.setLibraryPlatformName(libraryFileName); return li; }
LibraryInfoList BinaryDependenciesLdd::stringRecordListToLibraryInfoList(const PlainText::StringRecordList& list) { LibraryInfoList libraryInfoList; libraryInfoList.reserve(list.rowCount()); for(const auto & record : list){ Q_ASSERT(record.columnCount() > 0); LibraryInfo li; li.setLibraryPlatformName( record.data(0) ); if(record.columnCount() > 1){ li.setAbsoluteFilePath( record.data(1) ); } libraryInfoList.addLibrary(li); } return libraryInfoList; }
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::qmlPluginTypeDumpError(QProcess::ProcessError) { QProcess *process = qobject_cast<QProcess *>(sender()); if (!process) return; process->deleteLater(); const QString libraryPath = m_runningQmldumps.take(process); Core::MessageManager *messageManager = Core::MessageManager::instance(); const QString errorMessages = process->readAllStandardError(); messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, errorMessages)); if (!libraryPath.isEmpty()) { const Snapshot snapshot = m_modelManager->snapshot(); LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath); libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(errorMessages)); m_modelManager->updateLibraryInfo(libraryPath, libraryInfo); } }
void PluginDumper::onLoadPluginTypes(const QString &libraryPath, const QString &importPath, const QString &importUri, const QString &importVersion) { const QString canonicalLibraryPath = QDir::cleanPath(libraryPath); if (m_runningQmldumps.values().contains(canonicalLibraryPath)) return; const Snapshot snapshot = m_modelManager->snapshot(); const LibraryInfo libraryInfo = snapshot.libraryInfo(canonicalLibraryPath); if (libraryInfo.pluginTypeInfoStatus() != LibraryInfo::NoTypeInfo) return; // avoid inserting the same plugin twice int index; for (index = 0; index < m_plugins.size(); ++index) { if (m_plugins.at(index).qmldirPath == libraryPath) break; } if (index == m_plugins.size()) m_plugins.append(Plugin()); Plugin &plugin = m_plugins[index]; plugin.qmldirPath = canonicalLibraryPath; plugin.importPath = importPath; plugin.importUri = importUri; plugin.importVersion = importVersion; // watch plugin libraries foreach (const QmlDirParser::Plugin &plugin, snapshot.libraryInfo(canonicalLibraryPath).plugins()) { const QString pluginLibrary = resolvePlugin(canonicalLibraryPath, plugin.path, plugin.name); pluginWatcher()->addFile(pluginLibrary, Utils::FileSystemWatcher::WatchModifiedDate); m_libraryToPluginIndex.insert(pluginLibrary, index); } // watch library xml file if (plugin.hasPredumpedQmlTypesFile()) { const QString &path = plugin.predumpedQmlTypesFilePath(); pluginWatcher()->addFile(path, Utils::FileSystemWatcher::WatchModifiedDate); m_libraryToPluginIndex.insert(path, index); } dump(plugin); }
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); }