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

List:       kde-commits
Subject:    [qmlweb/development/qmlweb2] /: [Compiler] Add some missing expressions
From:       Jan Marker <jan () jangmarker ! de>
Date:       2015-09-30 20:44:35
Message-ID: E1ZhOEt-0000CB-Ds () scm ! kde ! org
[Download RAW message or body]

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

[Compiler] Add some missing expressions

* void, delete, typeof
* unary +,-,!,~
* new
* conditional expression
* nested expression

M  +59   -0    src/qmljsc/purejavascriptgenerator.cpp
M  +11   -0    src/qmljsc/purejavascriptgenerator.h
M  +1    -1    tests/auto/data/javascript/expressions.js
A  +1    -0    tests/auto/data/javascript/lefthandexpressions.compiled.js
A  +7    -0    tests/auto/data/javascript/lefthandexpressions.js
D  +0    -1    tests/auto/data/javascript/propertyaccess.compiled.js
D  +0    -3    tests/auto/data/javascript/propertyaccess.js
A  +1    -0    tests/auto/data/javascript/unaryoperators.js
M  +39   -1    tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M  +2    -1    tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp

http://commits.kde.org/qmlweb/0945848beca425a9324bbbafd5d3a025c19c7ffb

diff --git a/src/qmljsc/purejavascriptgenerator.cpp \
b/src/qmljsc/purejavascriptgenerator.cpp index ae1fd2e..10708c6 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -230,12 +230,24 @@ void PureJavaScriptGenerator::endVisit(AST::CaseClauses \
*caseClauses) {  reduceListStack<AST::CaseClauses>(caseClauses);
 }
 
+void PureJavaScriptGenerator::endVisit(AST::ConditionalExpression *) {
+    const QString secondExpression = m_outputStack.pop();
+    const QString firstExpression = m_outputStack.pop();
+    const QString condition = m_outputStack.pop();
+    m_outputStack << condition + '?' + firstExpression + ':' + secondExpression;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::DefaultClause *) {
     const QString statement = m_outputStack.pop();
     const QString defaultKeyword = m_outputStack.pop();
     m_outputStack << defaultKeyword + ':' + statement;
 }
 
+void PureJavaScriptGenerator::endVisit(AST::DeleteExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << "delete " + expression;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::ElementList *elementList) {
     QString code;
     AST::ElementList *currentElement = elementList;
@@ -335,6 +347,27 @@ void PureJavaScriptGenerator::endVisit(AST::LocalForStatement \
                *localForStatement
     m_outputStack << "for(" + declaration + ';' + condition + ';' + \
incrementExpression + ')' + statement;  }
 
+void PureJavaScriptGenerator::endVisit(AST::NewExpression *) {
+    const QString constructor = m_outputStack.pop();
+    m_outputStack << "new " + constructor;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::NewMemberExpression \
*newMemberExpression) { +    const QString arguments = \
(newMemberExpression->arguments)?m_outputStack.pop():""; +    const QString \
constructor = m_outputStack.pop(); +    m_outputStack << "new " + constructor + '(' + \
arguments + ')'; +}
+
+void PureJavaScriptGenerator::endVisit(AST::NestedExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << '(' + expression + ')';
+}
+
+void PureJavaScriptGenerator::endVisit(AST::NotExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << '!' + expression;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::NumericLiteral *) {
 }
 
@@ -406,6 +439,26 @@ void PureJavaScriptGenerator::endVisit(AST::SwitchStatement *) {
     m_outputStack << "switch(" + expression + ')' + clauseBlock;
 }
 
+void PureJavaScriptGenerator::endVisit(AST::TildeExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << '~' + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::TypeOfExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << "typeof " + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::UnaryMinusExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << '-' + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::UnaryPlusExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << '+' + expression;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::VariableDeclaration *declaration) {
     const QString expression = (declaration->expression) ? "="+m_outputStack.pop() : \
"";  const QString variableName = declaration->name.toString();
@@ -423,6 +476,12 @@ void PureJavaScriptGenerator::endVisit(AST::VariableStatement *) \
{  m_outputStack << m_outputStack.pop() + ';';
 }
 
+void PureJavaScriptGenerator::endVisit(AST::VoidExpression *) {
+    const QString expression = m_outputStack.pop();
+    m_outputStack << "void " + expression;
+}
+
+
 void PureJavaScriptGenerator::endVisit(AST::WhileStatement *) {
     const QString statement = m_outputStack.pop();
     const QString expression = m_outputStack.pop();
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.h index 35dfa35..ad4635e 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -57,7 +57,9 @@ public:
     virtual void endVisit(QQmlJS::AST::CaseBlock *) override;
     virtual void endVisit(QQmlJS::AST::CaseClause *) override;
     virtual void endVisit(QQmlJS::AST::CaseClauses *) override;
+    virtual void endVisit(QQmlJS::AST::ConditionalExpression *) override;
     virtual void endVisit(QQmlJS::AST::DefaultClause *) override;
+    virtual void endVisit(QQmlJS::AST::DeleteExpression *) override;
     virtual void endVisit(QQmlJS::AST::DoWhileStatement *) override;
     virtual void endVisit(QQmlJS::AST::ElementList *) override;
     virtual void endVisit(QQmlJS::AST::EmptyStatement *) override;
@@ -71,6 +73,10 @@ public:
     virtual void endVisit(QQmlJS::AST::IfStatement *) override;
     virtual void endVisit(QQmlJS::AST::LocalForEachStatement *) override;
     virtual void endVisit(QQmlJS::AST::LocalForStatement *) override;
+    virtual void endVisit(QQmlJS::AST::NewExpression *) override;
+    virtual void endVisit(QQmlJS::AST::NewMemberExpression *) override;
+    virtual void endVisit(QQmlJS::AST::NestedExpression *) override;
+    virtual void endVisit(QQmlJS::AST::NotExpression *) override;
     virtual void endVisit(QQmlJS::AST::NumericLiteral *) override;
     virtual void endVisit(QQmlJS::AST::ObjectLiteral *) override;
     virtual void endVisit(QQmlJS::AST::PostDecrementExpression *) override;
@@ -85,9 +91,14 @@ public:
     virtual void endVisit(QQmlJS::AST::StringLiteral *) override;
     virtual void endVisit(QQmlJS::AST::StatementList *) override;
     virtual void endVisit(QQmlJS::AST::SwitchStatement *) override;
+    virtual void endVisit(QQmlJS::AST::TildeExpression *) override;
+    virtual void endVisit(QQmlJS::AST::TypeOfExpression *) override;
+    virtual void endVisit(QQmlJS::AST::UnaryMinusExpression *) override;
+    virtual void endVisit(QQmlJS::AST::UnaryPlusExpression *) override;
     virtual void endVisit(QQmlJS::AST::VariableDeclaration *) override;
     virtual void endVisit(QQmlJS::AST::VariableDeclarationList *) override;
     virtual void endVisit(QQmlJS::AST::VariableStatement *) override;
+    virtual void endVisit(QQmlJS::AST::VoidExpression *) override;
     virtual void endVisit(QQmlJS::AST::WhileStatement *) override;
 
 private:
diff --git a/tests/auto/data/javascript/expressions.js \
b/tests/auto/data/javascript/expressions.js index b97808a..3923c92 100644
--- a/tests/auto/data/javascript/expressions.js
+++ b/tests/auto/data/javascript/expressions.js
@@ -1 +1 @@
-var x;var i;var e=i++;e=++i;e=i--;e=--i;
\ No newline at end of file
+var x;var i;var e=i++;e=++i;e=i--;e=--i;5*(2+3);true?1:2;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/lefthandexpressions.compiled.js \
b/tests/auto/data/javascript/lefthandexpressions.compiled.js new file mode 100644
index 0000000..6a83ce4
--- /dev/null
+++ b/tests/auto/data/javascript/lefthandexpressions.compiled.js
@@ -0,0 +1 @@
+obj.prop;obj["prop"];obj[0];new great();new greater(1);new greater(1,2);new great;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/lefthandexpressions.js \
b/tests/auto/data/javascript/lefthandexpressions.js new file mode 100644
index 0000000..656bd83
--- /dev/null
+++ b/tests/auto/data/javascript/lefthandexpressions.js
@@ -0,0 +1,7 @@
+obj.prop;
+obj["prop"];
+obj[0];
+new great();
+new greater(1);
+new greater(1, 2);
+new great;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/propertyaccess.compiled.js \
b/tests/auto/data/javascript/propertyaccess.compiled.js deleted file mode 100644
index 4a11b7d..0000000
--- a/tests/auto/data/javascript/propertyaccess.compiled.js
+++ /dev/null
@@ -1 +0,0 @@
-obj.prop;obj["prop"];obj[0];
\ No newline at end of file
diff --git a/tests/auto/data/javascript/propertyaccess.js \
b/tests/auto/data/javascript/propertyaccess.js deleted file mode 100644
index 094b1ed..0000000
--- a/tests/auto/data/javascript/propertyaccess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-obj.prop;
-obj["prop"];
-obj[0];
\ No newline at end of file
diff --git a/tests/auto/data/javascript/unaryoperators.js \
b/tests/auto/data/javascript/unaryoperators.js new file mode 100644
index 0000000..26e391a
--- /dev/null
+++ b/tests/auto/data/javascript/unaryoperators.js
@@ -0,0 +1 @@
+delete v;void 4;typeof o;+5;-5;~4;!false;
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index 67573fe..4542e21 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -114,6 +114,7 @@ public:
         , m_twoPropertiesPart2(&m_twoProperties, &m_propertyNameAndValue)
         , m_objectLiteral(&m_twoProperties)
         , m_equalsBinaryExpression(nullptr, QSOperator::Equal, nullptr)
+        , m_nestedExpression(nullptr)
         , m_postDecrementExpression(&m_numericalExpressionPi)
         , m_postIncrementExpression(&m_numericalExpressionPi)
         , m_preDecrementExpression(&m_numericalExpressionPi)
@@ -126,6 +127,17 @@ public:
         , m_argumentListTwoArgumentsPart2(&m_argumentListTwoArguments, \
                &m_trueLiteral)
         , m_callExpressionWithArguments(&m_identifierExpression, \
                &m_argumentListTwoArguments)
         , m_callExpressionWithoutArguments(&m_identifierExpression, nullptr)
+        , m_newMemberExpressionArguments(&m_identifierExpression, \
&m_argumentListOneArgument) +        , \
m_newMemberExpressionNoArguments(&m_identifierExpression, nullptr) +        , \
m_newExpression(&m_identifierExpression) +        , \
m_tildeExpression(&m_identifierExpression) +        , \
m_notExpression(&m_identifierExpression) +        , \
m_unaryPlusExpression(&m_identifierExpression) +        , \
m_unaryMinusExpression(&m_identifierExpression) +        , \
m_deleteExpression(&m_identifierExpression) +        , \
m_typeOfExpression(&m_identifierExpression) +        , \
m_voidExpression(&m_identifierExpression) +        , \
m_conditionalExpression(&m_trueLiteral, &m_numericalExpressionPi, \
&m_numericalExpressionPi)  /* Variable Declarations */
         , m_constDeclaration1(m_someIdentifierStringRef, nullptr)
         , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr)
@@ -252,6 +264,7 @@ private:
     AST::ObjectLiteral m_objectLiteral;
 
     AST::BinaryExpression m_equalsBinaryExpression;
+    AST::NestedExpression m_nestedExpression;
 
     AST::PostDecrementExpression m_postDecrementExpression;
     AST::PostIncrementExpression m_postIncrementExpression;
@@ -266,6 +279,19 @@ private:
     AST::ArgumentList m_argumentListTwoArgumentsPart2;
     AST::CallExpression m_callExpressionWithArguments;
     AST::CallExpression m_callExpressionWithoutArguments;
+    AST::NewMemberExpression m_newMemberExpressionNoArguments;
+    AST::NewMemberExpression m_newMemberExpressionArguments;
+    AST::NewExpression m_newExpression;
+
+    AST::TildeExpression m_tildeExpression;
+    AST::NotExpression m_notExpression;
+    AST::UnaryPlusExpression m_unaryPlusExpression;
+    AST::UnaryMinusExpression m_unaryMinusExpression;
+    AST::DeleteExpression m_deleteExpression;
+    AST::TypeOfExpression m_typeOfExpression;
+    AST::VoidExpression m_voidExpression;
+
+    AST::ConditionalExpression m_conditionalExpression;
 
     /* Variable Declarations */
     AST::VariableDeclaration m_constDeclaration1;
@@ -415,8 +441,10 @@ private slots:
     TEST_ENDVISIT_REDUCES(CaseBlock               , CasesDefaultCases , \
"{cases;default;cases;}", ({"cases;", "default;", "cases;"}), \
                m_caseBlockCasesDefaultCases)
     TEST_ENDVISIT_REDUCES(CaseClause              , CaseWithStatement , "case \
                exp:stm;"   , ({"case", "exp", "stm;"})    , m_caseClause)
     TEST_ENDVISIT_REDUCES(CaseClauses             , TwoClauses        , "case \
e:s;case e2:s2;", ({"case e:s;", "case e2:s2;"}), m_twoCaseClauses) +    \
TEST_ENDVISIT_REDUCES(ConditionalExpression   , AnyCase           , "condition?e1:e2" \
                , ({"condition", "e1", "e2"})  , m_conditionalExpression)
     TEST_ENDVISIT_REDUCES(DefaultClause           , AnyCase           , \
                "default:stm"     , ({"default", "stm"})         , m_defaultClause)
-    TEST_ENDVISIT_REDUCES(DoWhileStatement        , AnyCase           , "do \
stm;while(e);", ({"stm;", "e"})               , m_doWhileStatement) +    \
TEST_ENDVISIT_REDUCES(DeleteExpression        , AnyCase           , "delete v"        \
, ({"v"})                      , m_deleteExpression) +    \
TEST_ENDVISIT_REDUCES(DoWhileStatement        , AnyCase           , "do \
                stm;while(e);", ({"stm;", "e"})              , m_doWhileStatement)
     TEST_ENDVISIT_REDUCES(ElementList             , Expression        , "expr,"      \
                , ({"expr"})                   , m_arrayElementsExp)
     TEST_ENDVISIT_REDUCES(ElementList             , TwoExpressions    , "expr,expr," \
                , ({"expr", "expr"})           , m_arrayElementsExpExp)
     TEST_ENDVISIT_REDUCES(ElementList             , ElisionExpression , \
"elisionexpr,"    , ({"elision", "expr"})        , m_arrayElementsElisionExp) @@ \
                -438,6 +466,11 @@ private slots:
     TEST_ENDVISIT_REDUCES(LocalForEachStatement   , AnyCase           , "for(var i \
                in o)stm;", ({"i", "o", "stm;"})      , m_localForEachStatement)
     TEST_ENDVISIT_REDUCES(LocalForStatement       , AllParts          , "for(var \
                i;c;++)stm;", ({"var i", "c", "++", "stm;"}), \
                m_localForStatementAllParts)
     TEST_ENDVISIT_REDUCES(LocalForStatement       , NoPart            , \
"for(;;)stm;"     , ({"stm;"})                   , m_localForStatementNoPart) +    \
TEST_ENDVISIT_REDUCES(NestedExpression        , AnyCase           , "(expression)"    \
, ({"expression"})             , m_nestedExpression) +    \
TEST_ENDVISIT_REDUCES(NewExpression           , AnyCase           , "new constr"      \
, ({"constr"})                 , m_newExpression) +    \
TEST_ENDVISIT_REDUCES(NewMemberExpression     , NoArguments       , "new constr()"    \
, ({"constr"})                 , m_newMemberExpressionNoArguments) +    \
TEST_ENDVISIT_REDUCES(NewMemberExpression     , Arguments         , "new constr(arg)" \
, ({"constr", "arg"})          , m_newMemberExpressionArguments) +    \
TEST_ENDVISIT_REDUCES(NotExpression           , AnyCase           , "!5"              \
                , ({"5"})                      , m_notExpression)
     TEST_ENDVISIT_REDUCES(NumericLiteral          , AnyCase           , "2.7"        \
                , ({"2.7"})                    , m_numericalExpressionPi)
     TEST_ENDVISIT_REDUCES(ObjectLiteral           , AnyCase           , \
                "{properties}"    , ({"properties"})             , m_objectLiteral)
     TEST_ENDVISIT_REDUCES(PostDecrementExpression , AnyCase           , "2.7--"      \
, ({"2.7"})                    , m_postDecrementExpression) @@ -456,12 +489,17 @@ \
                private slots:
     TEST_ENDVISIT_REDUCES(SourceElements          , ThreeStatements   , "st1st2st3"  \
                , ({"st1", "st2", "st3"})      , m_threeStatementsList)
     TEST_ENDVISIT_REDUCES(StringLiteral           , AnyCase           , "another \
                string"  , ({"another string"})         , m_stringLiteral)
     TEST_ENDVISIT_REDUCES(SwitchStatement         , AnyCase           , \
"switch(e){blk}"  , ({"e", "{blk}"})             , m_switchStatement) +    \
TEST_ENDVISIT_REDUCES(TildeExpression         , AnyCase           , "~5"              \
, ({"5"})                      , m_tildeExpression) +    \
TEST_ENDVISIT_REDUCES(TypeOfExpression        , AnyCase           , "typeof v"        \
, ({"v"})                      , m_typeOfExpression) +    \
TEST_ENDVISIT_REDUCES(UnaryMinusExpression    , AnyCase           , "-5"              \
, ({"5"})                      , m_unaryMinusExpression) +    \
TEST_ENDVISIT_REDUCES(UnaryPlusExpression     , AnyCase           , "+5"              \
                , ({"5"})                      , m_unaryPlusExpression)
     TEST_ENDVISIT_REDUCES(VariableDeclaration     , WithAssignment    , "i=5"        \
                , ({"5"})                      , m_variableDeclarationWithAssignment)
     TEST_ENDVISIT_REDUCES(VariableDeclaration     , WithoutAssignment , "i"          \
                , ({})                         , \
                m_variableDeclarationWithoutAssignment)
     TEST_ENDVISIT_REDUCES(VariableDeclarationList , TwoDeclarations   , "var i,e=5"  \
                , ({"i", "e=5"})               , m_twoVarDeclarations)
     TEST_ENDVISIT_REDUCES(VariableDeclarationList , OneDeclaration    , "var e=5"    \
                , ({"e=5"})                    , m_twoVarDeclarationsPart2)
     TEST_ENDVISIT_REDUCES(VariableDeclarationList , ConstDeclaration  , "const e=5"  \
                , ({"e=5"})                    , m_twoConstDeclarationsPart2)
     TEST_ENDVISIT_REDUCES(VariableStatement       , AnyCase           , "x;"         \
, ({"x"})                      , m_variableStatement) +    \
TEST_ENDVISIT_REDUCES(VoidExpression          , AnyCase           , "void v"          \
                , ({"v"})                      , m_voidExpression)
     TEST_ENDVISIT_REDUCES(WhileStatement          , AnyCase           , \
"while(e)stm"     , ({"e", "stm"})               , m_whileStatement)  
     TEST_VISIT_BINARYOP_PUTS_ON_STACK(Assign, "=")
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index \
                9ec3227..606e556 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -83,6 +83,7 @@ private slots:
         addRowForFileWithCompiled("declarations");
         addRowForFile("expressions");
         addRowForFileWithCompiled("functions");
+        addRowForFile("unaryoperators");
         addRowForFileWithCompiled("binaryoperations");
         addRowForFileWithCompiled("otherstatements");
         addRowForFileWithCompiled("ifstatements");
@@ -90,7 +91,7 @@ private slots:
         addRowForFileWithCompiled("literals");
         addRowForFileWithCompiled("arrayliterals");
         addRowForFileWithCompiled("objectliterals");
-        addRowForFileWithCompiled("propertyaccess");
+        addRowForFileWithCompiled("lefthandexpressions");
         addRowForFileWithCompiled("functioncalls");
         addRowForFileWithCompiled("loops");
     }


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

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