void tst_qdeclarativeerror::copy() { QDeclarativeError error; error.setUrl(QUrl("http://www.qt-project.org/main.qml")); error.setDescription("An Error"); error.setLine(92); error.setColumn(13); QDeclarativeError error2(error); QDeclarativeError error3; error3 = error; error.setUrl(QUrl("http://www.qt-project.org/main.qml")); error.setDescription("Another Error"); error.setLine(2); error.setColumn(33); QCOMPARE(error.url(), QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error.description(), QString("Another Error")); QCOMPARE(error.line(), 2); QCOMPARE(error.column(), 33); QCOMPARE(error2.url(), QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error2.description(), QString("An Error")); QCOMPARE(error2.line(), 92); QCOMPARE(error2.column(), 13); QCOMPARE(error3.url(), QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error3.description(), QString("An Error")); QCOMPARE(error3.line(), 92); QCOMPARE(error3.column(), 13); }
void QDeclarativeExpressionPrivate::exceptionToError(QScriptEngine *scriptEngine, QDeclarativeError &error) { if (scriptEngine->hasUncaughtException() && scriptEngine->uncaughtException().isError()) { QString fileName; int lineNumber = scriptEngine->uncaughtExceptionLineNumber(); QScriptValue exception = scriptEngine->uncaughtException(); QLatin1String fileNameProp("fileName"); if (!exception.property(fileNameProp).toString().isEmpty()){ fileName = exception.property(fileNameProp).toString(); } else { fileName = QLatin1String("<Unknown File>"); } error.setUrl(QUrl(fileName)); error.setLine(lineNumber); error.setColumn(-1); error.setDescription(exception.toString()); } else { error = QDeclarativeError(); } }
QDeclarativeInfo::~QDeclarativeInfo() { if (0 == --d->ref) { QList<QDeclarativeError> errors = d->errors; QDeclarativeEngine *engine = 0; if (!d->buffer.isEmpty()) { QDeclarativeError error; QObject *object = const_cast<QObject *>(d->object); if (object) { engine = qmlEngine(d->object); QString typeName; QDeclarativeType *type = QDeclarativeMetaType::qmlType(object->metaObject()); if (type) { typeName = QLatin1String(type->qmlTypeName()); int lastSlash = typeName.lastIndexOf(QLatin1Char('/')); if (lastSlash != -1) typeName = typeName.mid(lastSlash+1); } else { typeName = QString::fromUtf8(object->metaObject()->className()); int marker = typeName.indexOf(QLatin1String("_QMLTYPE_")); if (marker != -1) typeName = typeName.left(marker); marker = typeName.indexOf(QLatin1String("_QML_")); if (marker != -1) { typeName = typeName.left(marker) + "*"; type = QDeclarativeMetaType::qmlType(QMetaType::type(typeName.toLatin1())); if (type) { typeName = QLatin1String(type->qmlTypeName()); int lastSlash = typeName.lastIndexOf(QLatin1Char('/')); if (lastSlash != -1) typeName = typeName.mid(lastSlash+1); } } } d->buffer.prepend(QLatin1String("QML ") + typeName + QLatin1String(": ")); QDeclarativeData *ddata = QDeclarativeData::get(object, false); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) { error.setUrl(ddata->outerContext->url); error.setLine(ddata->lineNumber); error.setColumn(ddata->columnNumber); } } error.setDescription(d->buffer); errors.prepend(error); } QDeclarativeEnginePrivate::warning(engine, errors); delete d; } }
void QDeclarativeDirParser::reportError(int line, int column, const QString &description) { QDeclarativeError error; error.setUrl(_url); error.setLine(line); error.setColumn(column); error.setDescription(description); _errors.append(error); }
void tst_qdeclarativeerror::url() { QDeclarativeError error; QCOMPARE(error.url(), QUrl()); error.setUrl(QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error.url(), QUrl("http://www.qt-project.org/main.qml")); QDeclarativeError error2 = error; QCOMPARE(error2.url(), QUrl("http://www.qt-project.org/main.qml")); error.setUrl(QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error.url(), QUrl("http://www.qt-project.org/main.qml")); QCOMPARE(error2.url(), QUrl("http://www.qt-project.org/main.qml")); }
void tst_qdeclarativeerror::url() { QDeclarativeError error; QCOMPARE(error.url(), QUrl()); error.setUrl(QUrl("http://www.nokia.com/main.qml")); QCOMPARE(error.url(), QUrl("http://www.nokia.com/main.qml")); QDeclarativeError error2 = error; QCOMPARE(error2.url(), QUrl("http://www.nokia.com/main.qml")); error.setUrl(QUrl("http://qt.nokia.com/main.qml")); QCOMPARE(error.url(), QUrl("http://qt.nokia.com/main.qml")); QCOMPARE(error2.url(), QUrl("http://www.nokia.com/main.qml")); }
void tst_qdeclarativeerror::debug() { { QDeclarativeError error; error.setUrl(QUrl("http://www.qt-project.org/main.qml")); error.setDescription("An Error"); error.setLine(92); error.setColumn(13); QTest::ignoreMessage(QtWarningMsg, "http://www.qt-project.org/main.qml:92:13: An Error "); qWarning() << error; } { QUrl url(QUrl::fromLocalFile(QString(SRCDIR) + "/").resolved(QUrl("test.txt"))); QDeclarativeError error; error.setUrl(url); error.setDescription("An Error"); error.setLine(2); error.setColumn(5); QString out = url.toString() + ":2:5: An Error \n Line2 Content \n ^ "; QTest::ignoreMessage(QtWarningMsg, qPrintable(out)); qWarning() << error; } { QUrl url(QUrl::fromLocalFile(QString(SRCDIR) + "/").resolved(QUrl("foo.txt"))); QDeclarativeError error; error.setUrl(url); error.setDescription("An Error"); error.setLine(2); error.setColumn(5); QString out = url.toString() + ":2:5: An Error "; QTest::ignoreMessage(QtWarningMsg, qPrintable(out)); qWarning() << error; } }
void tst_qdeclarativeerror::toString() { { QDeclarativeError error; error.setUrl(QUrl("http://www.qt-project.org/main.qml")); error.setDescription("An Error"); error.setLine(92); error.setColumn(13); QCOMPARE(error.toString(), QString("http://www.qt-project.org/main.qml:92:13: An Error")); } { QDeclarativeError error; error.setUrl(QUrl("http://www.qt-project.org/main.qml")); error.setDescription("An Error"); error.setLine(92); QCOMPARE(error.toString(), QString("http://www.qt-project.org/main.qml:92: An Error")); } }
bool QDeclarativeScriptParser::parse(const QByteArray &qmldata, const QUrl &url) { clear(); const QString fileName = url.toString(); _scriptFile = fileName; QTextStream stream(qmldata, QIODevice::ReadOnly); #ifndef QT_NO_TEXTCODEC stream.setCodec("UTF-8"); #endif const QString code = stream.readAll(); data = new QDeclarativeScriptParserJsASTData(fileName); Lexer lexer(&data->engine); lexer.setCode(code, /*line = */ 1); Parser parser(&data->engine); if (! parser.parse() || !_errors.isEmpty()) { // Extract errors from the parser foreach (const DiagnosticMessage &m, parser.diagnosticMessages()) { if (m.isWarning()) continue; QDeclarativeError error; error.setUrl(url); error.setDescription(m.message); error.setLine(m.loc.startLine); error.setColumn(m.loc.startColumn); _errors << error; } }
bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath, const QString &uri, QDeclarativeImportDatabase *database, QDeclarativeDirComponents* components, QList<QDeclarativeError> *errors) { QFile file(absoluteFilePath); QString filecontent; if (!QDeclarative_isFileCaseCorrect(absoluteFilePath)) { if (errors) { QDeclarativeError error; error.setDescription(QDeclarativeImportDatabase::tr("cannot load module \"%1\": File name case mismatch for \"%2\"").arg(uri).arg(absoluteFilePath)); errors->prepend(error); } return false; } else if (file.open(QFile::ReadOnly)) { filecontent = QString::fromUtf8(file.readAll()); if (qmlImportTrace()) qDebug().nospace() << "QDeclarativeImports(" << qPrintable(base.toString()) << "::importExtension: " << "loaded " << absoluteFilePath; } else { if (errors) { QDeclarativeError error; error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" definition \"%2\" not readable").arg(uri).arg(absoluteFilePath)); errors->prepend(error); } return false; } QDir dir = QFileInfo(file).dir(); QUrl url = QUrl::fromLocalFile(absoluteFilePath); QDeclarativeDirParser qmldirParser; qmldirParser.setSource(filecontent); qmldirParser.setUrl(url); // propagate any errors reported by the parser back up to the typeloader. if (qmldirParser.parse()) { if (errors) { for (int i = 0; i < qmldirParser.errors().size(); ++i) { errors->prepend(qmldirParser.errors().at(i)); } } return false; } if (! qmlDirFilesForWhichPluginsHaveBeenLoaded.contains(absoluteFilePath)) { qmlDirFilesForWhichPluginsHaveBeenLoaded.insert(absoluteFilePath); foreach (const QDeclarativeDirParser::Plugin &plugin, qmldirParser.plugins()) { QString resolvedFilePath = database->resolvePlugin(dir, plugin.path, plugin.name); #if defined(QT_LIBINFIX) && defined(Q_OS_SYMBIAN) if (resolvedFilePath.isEmpty()) { // In case of libinfixed build, attempt to load libinfixed version, too. QString infixedPluginName = plugin.name + QLatin1String(QT_LIBINFIX); resolvedFilePath = database->resolvePlugin(dir, plugin.path, infixedPluginName); } #endif if (!resolvedFilePath.isEmpty()) { if (!database->importPlugin(resolvedFilePath, uri, errors)) { if (errors) { // XXX TODO: should we leave the import plugin error alone? // Here, we pop it off the top and coalesce it into this error's message. // The reason is that the lower level may add url and line/column numbering information. QDeclarativeError poppedError = errors->takeFirst(); QDeclarativeError error; error.setDescription(QDeclarativeImportDatabase::tr("plugin cannot be loaded for module \"%1\": %2").arg(uri).arg(poppedError.description())); error.setUrl(url); errors->prepend(error); } return false; } } else { if (errors) { QDeclarativeError error; error.setDescription(QDeclarativeImportDatabase::tr("module \"%1\" plugin \"%2\" not found").arg(uri).arg(plugin.name)); error.setUrl(url); errors->prepend(error); } return false; } } }