| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). | 
					
						
							|  |  |  | ** Contact: http://www.qt-project.org/legal
 | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** This file is part of Qt Creator. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Digia.  For licensing terms and | 
					
						
							|  |  |  | ** conditions see http://qt.digia.com/licensing.  For further information
 | 
					
						
							|  |  |  | ** use the contact form at http://qt.digia.com/contact-us.
 | 
					
						
							| 
									
										
										
										
											2011-05-12 13:25:35 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file LICENSE.LGPL included in the | 
					
						
							|  |  |  | ** packaging of this file.  Please review the following information to | 
					
						
							|  |  |  | ** ensure the GNU Lesser General Public License version 2.1 requirements | 
					
						
							|  |  |  | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, Digia gives you certain additional | 
					
						
							|  |  |  | ** rights.  These rights are described in the Digia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "qmlerror.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-31 10:12:26 +02:00
										 |  |  | #include <QtCore/qdebug.h>
 | 
					
						
							|  |  |  | #include <QtCore/qfile.h>
 | 
					
						
							|  |  |  | #include <QtCore/qstringlist.h>
 | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | QT_BEGIN_NAMESPACE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     \class QmlError | 
					
						
							| 
									
										
										
										
											2012-07-31 10:12:26 +02:00
										 |  |  |     \since 5.0 | 
					
						
							|  |  |  |     \inmodule QtQml | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     \brief The QmlError class encapsulates a QML error. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QmlError includes a textual description of the error, as well | 
					
						
							|  |  |  |     as location information (the file, line, and column). The toString() | 
					
						
							|  |  |  |     method creates a single-line, human-readable string containing all of | 
					
						
							|  |  |  |     this information, for example: | 
					
						
							|  |  |  |     \code | 
					
						
							|  |  |  |     file:///home/user/test.qml:7:8: Invalid property assignment: double expected
 | 
					
						
							|  |  |  |     \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     You can use qDebug() or qWarning() to output errors to the console. This method | 
					
						
							|  |  |  |     will attempt to open the file indicated by the error | 
					
						
							|  |  |  |     and include additional contextual information. | 
					
						
							|  |  |  |     \code | 
					
						
							|  |  |  |     file:///home/user/test.qml:7:8: Invalid property assignment: double expected
 | 
					
						
							|  |  |  |             y: "hello" | 
					
						
							|  |  |  |                ^ | 
					
						
							|  |  |  |     \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-31 10:12:26 +02:00
										 |  |  |     Note that the QtQuick 1 version is named QDeclarativeError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \sa QQuickView::errors(), QmlComponent::errors() | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | class QmlErrorPrivate | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     QmlErrorPrivate(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QUrl url; | 
					
						
							|  |  |  |     QString description; | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     int line; | 
					
						
							|  |  |  |     int column; | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QmlErrorPrivate::QmlErrorPrivate() | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  | : line(-1), column(-1) | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Creates an empty error object. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QmlError::QmlError() | 
					
						
							|  |  |  | : d(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Creates a copy of \a other. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QmlError::QmlError(const QmlError &other) | 
					
						
							|  |  |  | : d(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *this = other; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Assigns \a other to this error object. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QmlError &QmlError::operator=(const QmlError &other) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!other.d) { | 
					
						
							|  |  |  |         delete d; | 
					
						
							|  |  |  |         d = 0; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         if (!d) d = new QmlErrorPrivate; | 
					
						
							|  |  |  |         d->url = other.d->url; | 
					
						
							|  |  |  |         d->description = other.d->description; | 
					
						
							|  |  |  |         d->line = other.d->line; | 
					
						
							|  |  |  |         d->column = other.d->column; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     \internal | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QmlError::~QmlError() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     delete d; d = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns true if this error is valid, otherwise false. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | bool QmlError::isValid() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return d != 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns the url for the file that caused this error. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QUrl QmlError::url() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (d) return d->url; | 
					
						
							|  |  |  |     else return QUrl(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Sets the \a url for the file that caused this error. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | void QmlError::setUrl(const QUrl &url) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!d) d = new QmlErrorPrivate; | 
					
						
							|  |  |  |     d->url = url; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns the error description. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QString QmlError::description() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (d) return d->description; | 
					
						
							|  |  |  |     else return QString(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Sets the error \a description. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | void QmlError::setDescription(const QString &description) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!d) d = new QmlErrorPrivate; | 
					
						
							|  |  |  |     d->description = description; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns the error line number. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | int QmlError::line() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     if (d) return d->line; | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  |     else return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Sets the error \a line number. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | void QmlError::setLine(int line) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!d) d = new QmlErrorPrivate; | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     d->line = line; | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns the error column number. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | int QmlError::column() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     if (d) return d->column; | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  |     else return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Sets the error \a column number. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | void QmlError::setColumn(int column) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!d) d = new QmlErrorPrivate; | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     d->column = column; | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Returns the error as a human readable string. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | QString QmlError::toString() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QString rv; | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     if (url().isEmpty()) { | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |         rv = QLatin1String("<Unknown File>"); | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |     } else if (line() != -1) { | 
					
						
							|  |  |  |         rv = url().toString() + QLatin1Char(':') + QString::number(line()); | 
					
						
							|  |  |  |         if (column() != -1) | 
					
						
							|  |  |  |             rv += QLatin1Char(':') + QString::number(column()); | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |         rv = url().toString(); | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     rv += QLatin1String(": ") + description(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return rv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     \relates QmlError | 
					
						
							|  |  |  |     \fn QDebug operator<<(QDebug debug, const QmlError &error) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  |     Outputs a human readable version of \a error to \a debug. | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QDebug operator<<(QDebug debug, const QmlError &error) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     debug << qPrintable(error.toString()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QUrl url = error.url(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (error.line() > 0 && url.scheme() == QLatin1String("file")) { | 
					
						
							|  |  |  |         QString file = url.toLocalFile(); | 
					
						
							|  |  |  |         QFile f(file); | 
					
						
							|  |  |  |         if (f.open(QIODevice::ReadOnly)) { | 
					
						
							|  |  |  |             QByteArray data = f.readAll(); | 
					
						
							|  |  |  |             QTextStream stream(data, QIODevice::ReadOnly); | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  | #ifndef QT_NO_TEXTCODEC
 | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  |             stream.setCodec("UTF-8"); | 
					
						
							| 
									
										
										
										
											2010-10-19 16:08:44 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  |             const QString code = stream.readAll(); | 
					
						
							|  |  |  |             const QStringList lines = code.split(QLatin1Char('\n')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (lines.count() >= error.line()) { | 
					
						
							|  |  |  |                 const QString &line = lines.at(error.line() - 1); | 
					
						
							|  |  |  |                 debug << "\n    " << qPrintable(line); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |                 if (error.column() > 0) { | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  |                     int column = qMax(0, error.column() - 1); | 
					
						
							| 
									
										
										
										
											2013-01-23 15:06:08 +01:00
										 |  |  |                     column = qMin(column, line.length()); | 
					
						
							| 
									
										
										
										
											2010-03-18 12:06:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     QByteArray ind; | 
					
						
							|  |  |  |                     ind.reserve(column); | 
					
						
							|  |  |  |                     for (int i = 0; i < column; ++i) { | 
					
						
							|  |  |  |                         const QChar ch = line.at(i); | 
					
						
							|  |  |  |                         if (ch.isSpace()) | 
					
						
							|  |  |  |                             ind.append(ch.unicode()); | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                             ind.append(' '); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     ind.append('^'); | 
					
						
							|  |  |  |                     debug << "\n    " << ind.constData(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return debug; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QT_END_NAMESPACE |