From 315fc34f3be55511772ec1c245ec935be61407ba Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 20 Jan 2011 16:02:28 +0100 Subject: [PATCH] qmldump: Produce an error message if module import fails. Reviewed-by: Kai Koehne --- share/qtcreator/qml/qmldump/main.cpp | 23 ++++++++++++++++------- src/plugins/qmljstools/qmljsplugindumper.cpp | 22 ++++++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/share/qtcreator/qml/qmldump/main.cpp b/share/qtcreator/qml/qmldump/main.cpp index 287f6b9774..cf92d1dfce 100644 --- a/share/qtcreator/qml/qmldump/main.cpp +++ b/share/qtcreator/qml/qmldump/main.cpp @@ -265,12 +265,18 @@ void writeEasingCurve(QXmlStreamWriter *xml) xml->writeEndElement(); } +enum ExitCode { + EXIT_INVALIDARGUMENTS = 1, + EXIT_SEGV = 2, + EXIT_IMPORTERROR = 3 +}; + #ifdef Q_OS_UNIX void sigSegvHandler(int) { fprintf(stderr, "Error: qmldump SEGV\n"); if (!currentProperty.isEmpty()) fprintf(stderr, "While processing the property '%s', which probably has uninitialized data.\n", currentProperty.toLatin1().constData()); - exit(EXIT_FAILURE); + exit(EXIT_SEGV); } #endif @@ -296,7 +302,7 @@ int main(int argc, char *argv[]) if (argc != 1 && argc != 3) { qWarning() << "Usage: qmldump [plugin/import/path plugin.uri]"; qWarning() << "Example: ./qmldump /home/user/dev/qt-install/imports Qt.labs.particles"; - return 1; + return EXIT_INVALIDARGUMENTS; } QString pluginImportName; @@ -315,7 +321,7 @@ int main(int argc, char *argv[]) { QByteArray code = "import QtQuick 1.0; Item {}"; QDeclarativeComponent c(engine); - c.setData(code, QUrl("xxx")); + c.setData(code, QUrl("qtquickcheck")); c.create(); if (c.errors().isEmpty()) { hasQtQuickModule = true; @@ -341,10 +347,13 @@ int main(int argc, char *argv[]) code += "Item {}"; QDeclarativeComponent c(engine); - c.setData(code, QUrl("xxx")); + c.setData(code, QUrl("typelist")); c.create(); - if (!c.errors().isEmpty()) - qDebug() << c.errorString(); + if (!c.errors().isEmpty()) { + foreach (const QDeclarativeError &error, c.errors()) + qWarning() << error.toString(); + return EXIT_IMPORTERROR; + } } cppToId.insert("QString", "string"); @@ -400,7 +409,7 @@ int main(int argc, char *argv[]) code += " {}\n"; QDeclarativeComponent c(engine); - c.setData(code, QUrl("xxx")); + c.setData(code, QUrl("typeinstance")); QObject *object = c.create(); if (object) diff --git a/src/plugins/qmljstools/qmljsplugindumper.cpp b/src/plugins/qmljstools/qmljsplugindumper.cpp index 7c92bad1a5..aca066f1cf 100644 --- a/src/plugins/qmljstools/qmljsplugindumper.cpp +++ b/src/plugins/qmljstools/qmljsplugindumper.cpp @@ -121,9 +121,17 @@ static QString qmldumpErrorMessage(const QString &libraryPath, const QString &er return PluginDumper::tr("Type dump of QML plugin in %0 failed.\nErrors:\n%1\n").arg(libraryPath, error); } -static QString qmldumpFailedMessage() +static QString qmldumpFailedMessage(const QString &error) { - return PluginDumper::tr("Type dump of C++ plugin failed.\nCheck 'General Messages' output pane for details."); + QString firstLines = + QStringList(error.split(QLatin1Char('\n')).mid(0, 10)).join(QLatin1String("\n")); + return PluginDumper::tr("Type dump of C++ plugin failed.\n" + "First 10 lines or errors:\n" + "\n" + "%1" + "\n" + "Check 'General Messages' output pane for details." + ).arg(firstLines); } static QList parseHelper(const QByteArray &xml, QString *error) @@ -156,8 +164,9 @@ void PluginDumper::qmlPluginTypeDumpDone(int exitCode) if (exitCode != 0) { Core::MessageManager *messageManager = Core::MessageManager::instance(); - messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, process->readAllStandardError())); - libraryInfo.setDumpStatus(LibraryInfo::DumpError, qmldumpFailedMessage()); + const QString errorMessages = process->readAllStandardError(); + messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, errorMessages)); + libraryInfo.setDumpStatus(LibraryInfo::DumpError, qmldumpFailedMessage(errorMessages)); } const QByteArray output = process->readAllStandardOutput(); @@ -188,12 +197,13 @@ void PluginDumper::qmlPluginTypeDumpError(QProcess::ProcessError) const QString libraryPath = m_runningQmldumps.take(process); Core::MessageManager *messageManager = Core::MessageManager::instance(); - messageManager->printToOutputPane(qmldumpErrorMessage(libraryPath, process->readAllStandardError())); + 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.setDumpStatus(LibraryInfo::DumpError, qmldumpFailedMessage()); + libraryInfo.setDumpStatus(LibraryInfo::DumpError, qmldumpFailedMessage(errorMessages)); m_modelManager->updateLibraryInfo(libraryPath, libraryInfo); } } -- 2.11.0