Don't rewrite the body of function expressions
authorRoberto Raggi <roberto.raggi@nokia.com>
Fri, 25 May 2012 07:45:24 +0000 (09:45 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 25 May 2012 09:32:45 +0000 (11:32 +0200)
That is, don't look inside function expressions when rewriting
bindings as closures.

Task-number: QTBUG-25901
Change-Id: Ia4b99d3c58c4482e9505cf2461bd14942a9a00ca
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
src/qml/qml/qqmlrewrite.cpp
src/qml/qml/qqmlrewrite_p.h
tests/auto/qml/qqmlecmascript/data/propertyQJSValue.16.qml [new file with mode: 0644]
tests/auto/qml/qqmlecmascript/data/propertyVar.16.qml [new file with mode: 0644]
tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp

index 83ede94..d498f98 100644 (file)
@@ -313,6 +313,16 @@ void RewriteBinding::endVisit(AST::LocalForEachStatement *)
     --_inLoop;
 }
 
+bool RewriteBinding::visit(AST::FunctionExpression *)
+{
+    return false;
+}
+
+bool RewriteBinding::visit(AST::FunctionDeclaration *)
+{
+    return false;
+}
+
 bool RewriteBinding::visit(AST::CaseBlock *ast)
 {
     // Process the initial sequence of the case clauses.
index 0643981..9fcc989 100644 (file)
@@ -120,6 +120,9 @@ protected:
 
     virtual bool visit(AST::CaseBlock *ast);
 
+    virtual bool visit(AST::FunctionExpression *ast);
+    virtual bool visit(AST::FunctionDeclaration *ast);
+
 private:
     int _inLoop;
 };
diff --git a/tests/auto/qml/qqmlecmascript/data/propertyQJSValue.16.qml b/tests/auto/qml/qqmlecmascript/data/propertyQJSValue.16.qml
new file mode 100644 (file)
index 0000000..7c69143
--- /dev/null
@@ -0,0 +1,22 @@
+import QtQuick 2.0
+import Qt.test 1.0
+
+MyQmlObject {
+    property bool test: false
+    property string string1
+
+    qjsvalue: function () {
+        string1 = "Test case 1"
+        return 100;
+    }
+
+    Component.onCompleted: {
+        if (qjsvalue() != 100)
+            return
+
+        if (string1 != "Test case 1")
+            return;
+
+        test = true;
+    }
+}
diff --git a/tests/auto/qml/qqmlecmascript/data/propertyVar.16.qml b/tests/auto/qml/qqmlecmascript/data/propertyVar.16.qml
new file mode 100644 (file)
index 0000000..e208c98
--- /dev/null
@@ -0,0 +1,36 @@
+import QtQuick 2.0
+
+Item {
+    property bool test: false
+    property string string1
+    property string string2
+
+    property var f1 : function () {
+        string1 = "Test case 1"
+        return 100;
+    }
+
+    property var f2;
+    function testcase2() {
+        string2 = "Test case 2"
+        return 100;
+    }
+
+    f2: testcase2
+
+    Component.onCompleted: {
+        if (f1() != 100)
+            return
+
+        if (f2() != 100)
+            return;
+
+        if (string1 != "Test case 1")
+            return;
+
+        if (string2 != "Test case 2")
+            return;
+
+        test = true;
+    }
+}
index f907a1c..e1a59ed 100644 (file)
@@ -4228,6 +4228,7 @@ void tst_qqmlecmascript::propertyVar_data()
     QTest::newRow("declarative binding assignment") << testFileUrl("propertyVar.13.qml");
     QTest::newRow("imperative binding assignment") << testFileUrl("propertyVar.14.qml");
     QTest::newRow("stored binding assignment") << testFileUrl("propertyVar.15.qml");
+    QTest::newRow("function expression binding assignment") << testFileUrl("propertyVar.16.qml");
 }
 
 void tst_qqmlecmascript::propertyVar()
@@ -4263,6 +4264,7 @@ void tst_qqmlecmascript::propertyQJSValue_data()
     QTest::newRow("declarative binding assignment") << testFileUrl("propertyQJSValue.13.qml");
     QTest::newRow("imperative binding assignment") << testFileUrl("propertyQJSValue.14.qml");
     QTest::newRow("stored binding assignment") << testFileUrl("propertyQJSValue.15.qml");
+    QTest::newRow("javascript function binding") << testFileUrl("propertyQJSValue.16.qml");
 
     QTest::newRow("reset property") << testFileUrl("propertyQJSValue.reset.qml");
     QTest::newRow("reset property in binding") << testFileUrl("propertyQJSValue.bindingreset.qml");