From 7964b819aefbee380ca24288c6234f5917211529 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Wed, 3 Aug 2011 14:00:57 +1000 Subject: [PATCH] Improve error messages from compiler for signals and slots This commit ensures that correct line and column information is provided in some cases (duplicate signal or method name, etc). Task-number: QTBUG-15076 Change-Id: I483bdc92ef4f1d1d2ff565bb957385fd495672da Reviewed-on: http://codereview.qt.nokia.com/1619 Reviewed-by: Qt Sanity Bot Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativecompiler.cpp | 18 ++++++++++-------- src/declarative/qml/qdeclarativeparser.cpp | 2 +- src/declarative/qml/qdeclarativeparser_p.h | 1 + src/declarative/qml/qdeclarativescriptparser.cpp | 1 + .../data/dynamicMeta.3.errors.txt | 2 +- .../data/dynamicMeta.4.errors.txt | 2 +- .../qdeclarativelanguage/data/method.1.errors.txt | 2 +- .../qdeclarativelanguage/data/signal.4.errors.txt | 2 +- 8 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 02c517c..f39e1ab 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -2381,25 +2381,27 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj) } for (int ii = 0; ii < obj->dynamicSignals.count(); ++ii) { - QByteArray name = obj->dynamicSignals.at(ii).name; + const QDeclarativeParser::Object::DynamicSignal &currSig = obj->dynamicSignals.at(ii); + QByteArray name = currSig.name; if (methodNames.contains(name)) - COMPILE_EXCEPTION(obj, tr("Duplicate signal name")); + COMPILE_EXCEPTION(&currSig, tr("Duplicate signal name")); QString nameStr = QString::fromUtf8(name); if (nameStr.at(0).isUpper()) - COMPILE_EXCEPTION(obj, tr("Signal names cannot begin with an upper case letter")); + COMPILE_EXCEPTION(&currSig, tr("Signal names cannot begin with an upper case letter")); if (enginePrivate->v8engine()->illegalNames().contains(nameStr)) - COMPILE_EXCEPTION(obj, tr("Illegal signal name")); + COMPILE_EXCEPTION(&currSig, tr("Illegal signal name")); methodNames.insert(name); } for (int ii = 0; ii < obj->dynamicSlots.count(); ++ii) { - QByteArray name = obj->dynamicSlots.at(ii).name; + const QDeclarativeParser::Object::DynamicSlot &currSlot = obj->dynamicSlots.at(ii); + QByteArray name = currSlot.name; if (methodNames.contains(name)) - COMPILE_EXCEPTION(obj, tr("Duplicate method name")); + COMPILE_EXCEPTION(&currSlot, tr("Duplicate method name")); QString nameStr = QString::fromUtf8(name); if (nameStr.at(0).isUpper()) - COMPILE_EXCEPTION(obj, tr("Method names cannot begin with an upper case letter")); + COMPILE_EXCEPTION(&currSlot, tr("Method names cannot begin with an upper case letter")); if (enginePrivate->v8engine()->illegalNames().contains(nameStr)) - COMPILE_EXCEPTION(obj, tr("Illegal method name")); + COMPILE_EXCEPTION(&currSlot, tr("Illegal method name")); methodNames.insert(name); } diff --git a/src/declarative/qml/qdeclarativeparser.cpp b/src/declarative/qml/qdeclarativeparser.cpp index 0447ea3..a405022 100644 --- a/src/declarative/qml/qdeclarativeparser.cpp +++ b/src/declarative/qml/qdeclarativeparser.cpp @@ -191,7 +191,7 @@ QDeclarativeParser::Object::DynamicSignal::DynamicSignal() QDeclarativeParser::Object::DynamicSignal::DynamicSignal(const DynamicSignal &o) : name(o.name), parameterTypes(o.parameterTypes), - parameterNames(o.parameterNames) + parameterNames(o.parameterNames), location(o.location) { } diff --git a/src/declarative/qml/qdeclarativeparser_p.h b/src/declarative/qml/qdeclarativeparser_p.h index 59c41ef..7080a8d 100644 --- a/src/declarative/qml/qdeclarativeparser_p.h +++ b/src/declarative/qml/qdeclarativeparser_p.h @@ -212,6 +212,7 @@ namespace QDeclarativeParser QByteArray name; QList parameterTypes; QList parameterNames; + LocationSpan location; }; struct DynamicSlot { DynamicSlot(); diff --git a/src/declarative/qml/qdeclarativescriptparser.cpp b/src/declarative/qml/qdeclarativescriptparser.cpp index 3f84329..dcd12e2 100644 --- a/src/declarative/qml/qdeclarativescriptparser.cpp +++ b/src/declarative/qml/qdeclarativescriptparser.cpp @@ -528,6 +528,7 @@ bool ProcessAST::visit(AST::UiPublicMember *node) p = p->finish(); } + signal.location = location(node->typeToken, node->semicolonToken); _stateStack.top().object->dynamicSignals << signal; } else { const QString memberType = node->memberType->asString(); diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt index c5860a2..8226c16 100644 --- a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt @@ -1 +1 @@ -3:1:Duplicate signal name +5:12:Duplicate signal name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt index b293c86..18e0745 100644 --- a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt @@ -1 +1 @@ -3:1:Duplicate method name +5:5:Duplicate method name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt index b10984f..0dab632 100644 --- a/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt +++ b/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt @@ -1 +1 @@ -3:1:Method names cannot begin with an upper case letter +4:5:Method names cannot begin with an upper case letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt index d96f9e3..513ff60 100644 --- a/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt @@ -1 +1 @@ -3:1:Signal names cannot begin with an upper case letter +4:12:Signal names cannot begin with an upper case letter -- 1.7.2.5