summaryrefslogtreecommitdiffstats
path: root/qmake/library
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2016-11-11 15:22:45 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-11-15 17:27:01 +0000
commit887e260a9370dfd8061754ed47cda7d9e4621711 (patch)
treed04565b5510a0b4134a6efaad69e054436b7602e /qmake/library
parente133f0cca44181005f19d006d6c896abe59c1b33 (diff)
Improve QMake JSON error
We can not improve the result from JSON parsing without changing API, so instead recalculate the line and column based on input and offset. Change-Id: I54149233f71023aa5d30deff854d6f3406c5c48c Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'qmake/library')
-rw-r--r--qmake/library/qmakebuiltins.cpp39
1 files changed, 36 insertions, 3 deletions
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index 544ccac6d2..6fe3ba1605 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -396,14 +396,47 @@ static void addJsonValue(const QJsonValue &value, const QString &keyPrefix, ProV
}
}
+struct ErrorPosition {
+ int line;
+ int column;
+};
+
+static ErrorPosition calculateErrorPosition(const QByteArray &json, int offset)
+{
+ ErrorPosition pos = { 0, 0 };
+ offset--; // offset is 1-based, switching to 0-based
+ for (int i = 0; i < offset; ++i) {
+ switch (json.at(i)) {
+ case '\n':
+ pos.line++;
+ pos.column = 0;
+ break;
+ case '\r':
+ break;
+ case '\t':
+ pos.column = (pos.column + 8) & ~7;
+ break;
+ default:
+ pos.column++;
+ break;
+ }
+ }
+ // Lines and columns in text editors are 1-based:
+ pos.line++;
+ pos.column++;
+ return pos;
+}
+
QMakeEvaluator::VisitReturn QMakeEvaluator::parseJsonInto(const QByteArray &json, const QString &into, ProValueMap *value)
{
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(json, &error);
if (document.isNull()) {
- if (error.error != QJsonParseError::NoError)
- evalError(fL1S("Error parsing json at offset %1: %2")
- .arg(error.offset).arg(error.errorString()));
+ if (error.error != QJsonParseError::NoError) {
+ ErrorPosition errorPos = calculateErrorPosition(json, error.offset);
+ evalError(fL1S("Error parsing JSON at %1:%2: %3")
+ .arg(errorPos.line).arg(errorPos.column).arg(error.errorString()));
+ }
return QMakeEvaluator::ReturnFalse;
}