Improve error messages from compiler for signals and slots
authorChris Adams <christopher.adams@nokia.com>
Wed, 3 Aug 2011 04:00:57 +0000 (14:00 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 4 Aug 2011 04:07:22 +0000 (06:07 +0200)
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 <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/qdeclarativecompiler.cpp
src/declarative/qml/qdeclarativeparser.cpp
src/declarative/qml/qdeclarativeparser_p.h
src/declarative/qml/qdeclarativescriptparser.cpp
tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt
tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt
tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt
tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt

index 02c517c..f39e1ab 100644 (file)
@@ -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);
     }
 
index 0447ea3..a405022 100644 (file)
@@ -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)
 {
 }
 
index 59c41ef..7080a8d 100644 (file)
@@ -212,6 +212,7 @@ namespace QDeclarativeParser
             QByteArray name;
             QList<QByteArray> parameterTypes;
             QList<QByteArray> parameterNames;
+            LocationSpan location;
         };
         struct DynamicSlot {
             DynamicSlot();
index 3f84329..dcd12e2 100644 (file)
@@ -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();