[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [qmlweb/development/qmlweb2] /: [Compiler] Implement function calls
From:       Jan Marker <jan () jangmarker ! de>
Date:       2015-09-30 20:44:34
Message-ID: E1ZhOEs-0000CB-DV () scm ! kde ! org
[Download RAW message or body]

Git commit ffdefc21736b310d99a83094f8d261e4a8f78d07 by Jan Marker.
Committed on 30/09/2015 at 20:41.
Pushed by jangmarker into branch 'development/qmlweb2'.

[Compiler] Implement function calls

M  +10   -0    src/qmljsc/purejavascriptgenerator.cpp
M  +3    -1    src/qmljsc/purejavascriptgenerator.h
A  +1    -0    tests/auto/data/javascript/functioncalls.compiled.js
A  +8    -0    tests/auto/data/javascript/functioncalls.js
M  +17   -0    tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M  +1    -0    tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp

http://commits.kde.org/qmlweb/ffdefc21736b310d99a83094f8d261e4a8f78d07

diff --git a/src/qmljsc/purejavascriptgenerator.cpp b/src/qmljsc/purejavascriptgenerator.cpp
index fc15853..0ec9859 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -164,6 +164,10 @@ bool PureJavaScriptGenerator::visit(AST::TrueLiteral *) {
     return true;
 }
 
+void PureJavaScriptGenerator::endVisit(AST::ArgumentList *argumentList) {
+    reduceListStack<AST::ArgumentList>(argumentList, ",");
+}
+
 void PureJavaScriptGenerator::endVisit(AST::ArrayLiteral *arrayLiteral) {
     const QString elision = (arrayLiteral->elision)?m_outputStack.pop():"";
     const QString elements = (arrayLiteral->elements)?m_outputStack.pop():"";
@@ -189,6 +193,12 @@ void PureJavaScriptGenerator::endVisit(AST::Block *) {
     m_outputStack << '{' + blockCode + '}';
 }
 
+void PureJavaScriptGenerator::endVisit(AST::CallExpression *callExpression) {
+    const QString arguments = (callExpression->arguments)?m_outputStack.pop():"";
+    const QString function = m_outputStack.pop();
+    m_outputStack << function + '(' + arguments + ')';
+}
+
 void PureJavaScriptGenerator::endVisit(AST::CaseBlock *caseBlock) {
     QString clausesRight;
     if (caseBlock->moreClauses) {
diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascriptgenerator.h
index ea0187f..ea64b2f 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -47,11 +47,13 @@ public:
     virtual bool visit(QQmlJS::AST::StringLiteral *) override;
     virtual bool visit(QQmlJS::AST::ThisExpression *) override;
     virtual bool visit(QQmlJS::AST::TrueLiteral *) override;
-    
+
+    virtual void endVisit(QQmlJS::AST::ArgumentList *) override;
     virtual void endVisit(QQmlJS::AST::ArrayLiteral *) override;
     virtual void endVisit(QQmlJS::AST::ArrayMemberExpression *) override;
     virtual void endVisit(QQmlJS::AST::BinaryExpression *) override;
     virtual void endVisit(QQmlJS::AST::Block *) override;
+    virtual void endVisit(QQmlJS::AST::CallExpression *) override;
     virtual void endVisit(QQmlJS::AST::CaseBlock *) override;
     virtual void endVisit(QQmlJS::AST::CaseClause *) override;
     virtual void endVisit(QQmlJS::AST::CaseClauses *) override;
diff --git a/tests/auto/data/javascript/functioncalls.compiled.js \
b/tests/auto/data/javascript/functioncalls.compiled.js new file mode 100644
index 0000000..17db647
--- /dev/null
+++ b/tests/auto/data/javascript/functioncalls.compiled.js
@@ -0,0 +1 @@
+functionCall();functionCall(arg1);functionCall(arg1,arg2);obj.functionCall();obj.functionCall(arg1);obj.functionCall(arg1,arg2);i=functionCall();i=obj.functionCall();
 \ No newline at end of file
diff --git a/tests/auto/data/javascript/functioncalls.js \
b/tests/auto/data/javascript/functioncalls.js new file mode 100644
index 0000000..ed3801a
--- /dev/null
+++ b/tests/auto/data/javascript/functioncalls.js
@@ -0,0 +1,8 @@
+functionCall();
+functionCall(arg1);
+functionCall(arg1, arg2);
+obj.functionCall();
+obj.functionCall(arg1);
+obj.functionCall(arg1, arg2);
+i = functionCall();
+i = obj.functionCall();
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index ed21e3d..b194a6d 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -121,6 +121,11 @@ public:
         , m_block(nullptr)
         , m_fieldMemberExpression(&m_identifierExpression, m_propertyIdentifierStringRef)
         , m_arrayMemberExpression(nullptr, nullptr)
+        , m_argumentListOneArgument(&m_trueLiteral)
+        , m_argumentListTwoArguments(&m_trueLiteral)
+        , m_argumentListTwoArgumentsPart2(&m_argumentListTwoArguments, &m_trueLiteral)
+        , m_callExpressionWithArguments(&m_identifierExpression, &m_argumentListTwoArguments)
+        , m_callExpressionWithoutArguments(&m_identifierExpression, nullptr)
         /* Variable Declarations */
         , m_constDeclaration1(m_someIdentifierStringRef, nullptr)
         , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr)
@@ -180,6 +185,8 @@ public:
         m_arrayElementsElisionExp.finish();
         m_arrayElementsExpElisionExpPart2.finish();
         m_twoPropertiesPart2.finish();
+        m_argumentListOneArgument.finish();
+        m_argumentListTwoArgumentsPart2.finish();
         m_statementListPart3.finish();
         m_sourceElementsListPart3.finish();
         m_parameterListPart2.finish();
@@ -246,6 +253,12 @@ private:
     AST::FieldMemberExpression m_fieldMemberExpression;
     AST::ArrayMemberExpression m_arrayMemberExpression;
 
+    AST::ArgumentList m_argumentListOneArgument;
+    AST::ArgumentList m_argumentListTwoArguments;
+    AST::ArgumentList m_argumentListTwoArgumentsPart2;
+    AST::CallExpression m_callExpressionWithArguments;
+    AST::CallExpression m_callExpressionWithoutArguments;
+
     /* Variable Declarations */
     AST::VariableDeclaration m_constDeclaration1;
     AST::VariableDeclaration m_constDeclaration2;
@@ -369,12 +382,16 @@ private slots:
     TEST_VISIT_DEFAULT_IMPL_(VariableDeclarationList                                        , \
                m_twoConstDeclarations)
     TEST_VISIT_DEFAULT_IMPL_(VariableStatement                                              , \
m_variableStatement)  
+    TEST_ENDVISIT_REDUCES(ArgumentList            , OneArgument       , "1"               , \
({"1"})                      , m_argumentListOneArgument) +    \
TEST_ENDVISIT_REDUCES(ArgumentList            , TwoArguments      , "1,2"             , ({"1", \
                "2"})                 , m_argumentListTwoArguments)
     TEST_ENDVISIT_REDUCES(ArrayLiteral            , OnlyElision       , "[,,,]"           , \
                ({",,,"})                    , m_arrayLiteralOnlyElision)
     TEST_ENDVISIT_REDUCES(ArrayLiteral            , WithElision       , "[5,,,]"          , \
                ({"5", ",,,"})               , m_arrayLiteralWithElision)
     TEST_ENDVISIT_REDUCES(ArrayLiteral            , WithoutElision    , "[5]"             , \
                ({"5"})                      , m_arrayLiteralWithoutElision)
     TEST_ENDVISIT_REDUCES(ArrayMemberExpression   , AnyCase           , "i[2]"            , \
                ({"i", "2"})                 , m_arrayMemberExpression)
     TEST_ENDVISIT_REDUCES(BinaryExpression        , TwoOperands       , "2==4"            , \
                ({"==", "2", "4"})           , m_equalsBinaryExpression)
     TEST_ENDVISIT_REDUCES(Block                   , AnyCase           , "{content}"       , \
({"content"})                , m_block) +    TEST_ENDVISIT_REDUCES(CallExpression          , \
WithArguments     , "func(args)"      , ({"func", "args"})           , \
m_callExpressionWithArguments) +    TEST_ENDVISIT_REDUCES(CallExpression          , \
WithoutArguments  , "func()"          , ({"func"})                   , \
                m_callExpressionWithoutArguments)
     TEST_ENDVISIT_REDUCES(CaseBlock               , OnlyCases         , "{cases;}"        , \
                ({"cases;"})                 , m_caseBlockOnlyCases)
     TEST_ENDVISIT_REDUCES(CaseBlock               , CasesAndDefault   , "{cases;default;}", \
                ({"cases;", "default;"})     , m_caseBlockCasesAndDefault)
     TEST_ENDVISIT_REDUCES(CaseBlock               , CasesDefaultCases , \
                "{cases;default;cases;}", ({"cases;", "default;", "cases;"}), \
                m_caseBlockCasesDefaultCases)
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index a10fb0e..e88c8dd 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -91,6 +91,7 @@ private slots:
         addRowForFileWithCompiled("arrayliterals");
         addRowForFileWithCompiled("objectliterals");
         addRowForFileWithCompiled("propertyaccess");
+        addRowForFileWithCompiled("functioncalls");
     }
 
     void test_compileJavaScriptFile() {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic