[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