Deprecate the with statement in QML
authorSimon Hausmann <simon.hausmann@digia.com>
Wed, 29 May 2013 09:14:51 +0000 (11:14 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 31 May 2013 13:09:42 +0000 (15:09 +0200)
It is generally considered deprecated in JavaScript and its use disables
a whole range of optimizations that we would like to apply in the future.

Therefore this patch will issue a warning if the with statement is detected.

This change is also documented, along with the plan on enabling strict mode
in the future.

Change-Id: Ie60f0536e0bdd6ecc537d8e34efbd8868bcad743
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/doc/src/javascript/hostenvironment.qdoc
src/qml/qml/parser/qqmljs.g
src/qml/qml/parser/qqmljsparser.cpp
src/qml/qml/qqmlscript.cpp

index a63ef61..3bd64ac 100644 (file)
@@ -166,6 +166,15 @@ Item {
 }
 \endqml
 
+\li The \c with statement is deprecated. Using the \c with statement will issue a warning
+at loading time and we plan on removing support for it in Qt 5.2. It is generally considered
+a language feature that is not recommended for use due reducing the readability of code and disabling
+many optimizations in the engine. It is also forbidden in ECMAScript 5 strict mode.
+
+\li JavaScript binding expressions are executed in non-strict mode. However we
+plan on changing the default for bindings in Qt 5.2 to execute always in
+ECMAScript 5 strict mode.
+
 \endlist
 
 
index ff4f543..5d279ef 100644 (file)
@@ -2615,6 +2615,10 @@ case $rule_number: {
   node->lparenToken = loc(2);
   node->rparenToken = loc(4);
   sym(1).Node = node;
+  if (lexer->qmlMode()) {
+      const QString msg = qApp->translate("QQmlParser", "Deprecated JavaScript `with' statement detected in QML expression. Support for this will be removed in Qt 5.2!");
+      diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, node->withToken, msg));
+  }
 } break;
 ./
 
index a0fa7a4..46b5c04 100644 (file)
@@ -1515,6 +1515,10 @@ case 311: {
   node->lparenToken = loc(2);
   node->rparenToken = loc(4);
   sym(1).Node = node;
+  if (lexer->qmlMode()) {
+      const QString msg = qApp->translate("QQmlParser", "Deprecated JavaScript `with' statement detected in QML expression. Support for this will be removed in Qt 5.2!");
+      diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, node->withToken, msg));
+  }
 } break;
 
 case 312: {
index 613ff24..ba2882f 100644 (file)
@@ -1318,13 +1318,15 @@ bool QQmlScript::Parser::parse(const QString &qmlcode, const QByteArray & /* pre
 
     QQmlJS::Parser parser(&data->engine);
 
-    if (! parser.parse() || !_errors.isEmpty()) {
+    if (! parser.parse() || !parser.diagnosticMessages().isEmpty()) {
 
         // Extract errors from the parser
         foreach (const DiagnosticMessage &m, parser.diagnosticMessages()) {
 
-            if (m.isWarning())
+            if (m.isWarning()) {
+                qWarning("%s:%d : %s", qPrintable(_scriptFile), m.loc.startLine, qPrintable(m.message));
                 continue;
+            }
 
             QQmlError error;
             error.setUrl(url);