[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.func \
tionCall(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