From kde-commits Wed Sep 30 20:44:35 2015 From: Jan Marker Date: Wed, 30 Sep 2015 20:44:35 +0000 To: kde-commits Subject: [qmlweb/development/qmlweb2] /: [Compiler] Add some missing expressions Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=144364588721993 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/purejavasc= riptgenerator.cpp index ae1fd2e..10708c6 100644 --- a/src/qmljsc/purejavascriptgenerator.cpp +++ b/src/qmljsc/purejavascriptgenerator.cpp @@ -230,12 +230,24 @@ void PureJavaScriptGenerator::endVisit(AST::CaseClaus= es *caseClauses) { reduceListStack(caseClauses); } = +void PureJavaScriptGenerator::endVisit(AST::ConditionalExpression *) { + const QString secondExpression =3D m_outputStack.pop(); + const QString firstExpression =3D m_outputStack.pop(); + const QString condition =3D m_outputStack.pop(); + m_outputStack << condition + '?' + firstExpression + ':' + secondExpre= ssion; +} + void PureJavaScriptGenerator::endVisit(AST::DefaultClause *) { const QString statement =3D m_outputStack.pop(); const QString defaultKeyword =3D m_outputStack.pop(); m_outputStack << defaultKeyword + ':' + statement; } = +void PureJavaScriptGenerator::endVisit(AST::DeleteExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << "delete " + expression; +} + void PureJavaScriptGenerator::endVisit(AST::ElementList *elementList) { QString code; AST::ElementList *currentElement =3D elementList; @@ -335,6 +347,27 @@ void PureJavaScriptGenerator::endVisit(AST::LocalForSt= atement *localForStatement m_outputStack << "for(" + declaration + ';' + condition + ';' + increm= entExpression + ')' + statement; } = +void PureJavaScriptGenerator::endVisit(AST::NewExpression *) { + const QString constructor =3D m_outputStack.pop(); + m_outputStack << "new " + constructor; +} + +void PureJavaScriptGenerator::endVisit(AST::NewMemberExpression *newMember= Expression) { + const QString arguments =3D (newMemberExpression->arguments)?m_outputS= tack.pop():""; + const QString constructor =3D m_outputStack.pop(); + m_outputStack << "new " + constructor + '(' + arguments + ')'; +} + +void PureJavaScriptGenerator::endVisit(AST::NestedExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << '(' + expression + ')'; +} + +void PureJavaScriptGenerator::endVisit(AST::NotExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << '!' + expression; +} + void PureJavaScriptGenerator::endVisit(AST::NumericLiteral *) { } = @@ -406,6 +439,26 @@ void PureJavaScriptGenerator::endVisit(AST::SwitchStat= ement *) { m_outputStack << "switch(" + expression + ')' + clauseBlock; } = +void PureJavaScriptGenerator::endVisit(AST::TildeExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << '~' + expression; +} + +void PureJavaScriptGenerator::endVisit(AST::TypeOfExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << "typeof " + expression; +} + +void PureJavaScriptGenerator::endVisit(AST::UnaryMinusExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << '-' + expression; +} + +void PureJavaScriptGenerator::endVisit(AST::UnaryPlusExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << '+' + expression; +} + void PureJavaScriptGenerator::endVisit(AST::VariableDeclaration *declarati= on) { const QString expression =3D (declaration->expression) ? "=3D"+m_outpu= tStack.pop() : ""; const QString variableName =3D declaration->name.toString(); @@ -423,6 +476,12 @@ void PureJavaScriptGenerator::endVisit(AST::VariableSt= atement *) { m_outputStack << m_outputStack.pop() + ';'; } = +void PureJavaScriptGenerator::endVisit(AST::VoidExpression *) { + const QString expression =3D m_outputStack.pop(); + m_outputStack << "void " + expression; +} + + void PureJavaScriptGenerator::endVisit(AST::WhileStatement *) { const QString statement =3D m_outputStack.pop(); const QString expression =3D m_outputStack.pop(); diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascri= ptgenerator.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/ja= vascript/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=3Di++;e=3D++i;e=3Di--;e=3D--i; \ No newline at end of file +var x;var i;var e=3Di++;e=3D++i;e=3Di--;e=3D--i;5*(2+3);true?1:2; \ No newline at end of file diff --git a/tests/auto/data/javascript/lefthandexpressions.compiled.js b/t= ests/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);ne= w 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_argume= ntListTwoArguments) , m_callExpressionWithoutArguments(&m_identifierExpression, nullpt= r) + , m_newMemberExpressionArguments(&m_identifierExpression, &m_argum= entListOneArgument) + , m_newMemberExpressionNoArguments(&m_identifierExpression, nullpt= r) + , 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_caseBlockCase= sDefaultCases) TEST_ENDVISIT_REDUCES(CaseClause , CaseWithStatement , "c= ase exp:stm;" , ({"case", "exp", "stm;"}) , m_caseClause) TEST_ENDVISIT_REDUCES(CaseClauses , TwoClauses , "c= ase e:s;case e2:s2;", ({"case e:s;", "case e2:s2;"}), m_twoCaseClauses) + TEST_ENDVISIT_REDUCES(ConditionalExpression , AnyCase , "c= ondition?e1:e2" , ({"condition", "e1", "e2"}) , m_conditionalExpression) TEST_ENDVISIT_REDUCES(DefaultClause , AnyCase , "d= efault:stm" , ({"default", "stm"}) , m_defaultClause) - TEST_ENDVISIT_REDUCES(DoWhileStatement , AnyCase , "d= o stm;while(e);", ({"stm;", "e"}) , m_doWhileStatement) + TEST_ENDVISIT_REDUCES(DeleteExpression , AnyCase , "d= elete v" , ({"v"}) , m_deleteExpression) + TEST_ENDVISIT_REDUCES(DoWhileStatement , AnyCase , "d= o stm;while(e);", ({"stm;", "e"}) , m_doWhileStatement) TEST_ENDVISIT_REDUCES(ElementList , Expression , "e= xpr," , ({"expr"}) , m_arrayElementsExp) TEST_ENDVISIT_REDUCES(ElementList , TwoExpressions , "e= xpr,expr," , ({"expr", "expr"}) , m_arrayElementsExpExp) TEST_ENDVISIT_REDUCES(ElementList , ElisionExpression , "e= lisionexpr," , ({"elision", "expr"}) , m_arrayElementsElisionExp) @@ -438,6 +466,11 @@ private slots: TEST_ENDVISIT_REDUCES(LocalForEachStatement , AnyCase , "f= or(var i in o)stm;", ({"i", "o", "stm;"}) , m_localForEachStatement) TEST_ENDVISIT_REDUCES(LocalForStatement , AllParts , "f= or(var i;c;++)stm;", ({"var i", "c", "++", "stm;"}), m_localForStatementAll= Parts) TEST_ENDVISIT_REDUCES(LocalForStatement , NoPart , "f= or(;;)stm;" , ({"stm;"}) , m_localForStatementNoPart) + TEST_ENDVISIT_REDUCES(NestedExpression , AnyCase , "(= expression)" , ({"expression"}) , m_nestedExpression) + TEST_ENDVISIT_REDUCES(NewExpression , AnyCase , "n= ew constr" , ({"constr"}) , m_newExpression) + TEST_ENDVISIT_REDUCES(NewMemberExpression , NoArguments , "n= ew constr()" , ({"constr"}) , m_newMemberExpressionNoArg= uments) + TEST_ENDVISIT_REDUCES(NewMemberExpression , Arguments , "n= ew constr(arg)" , ({"constr", "arg"}) , m_newMemberExpressionArgum= ents) + 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 , "s= t1st2st3" , ({"st1", "st2", "st3"}) , m_threeStatementsList) TEST_ENDVISIT_REDUCES(StringLiteral , AnyCase , "a= nother string" , ({"another string"}) , m_stringLiteral) TEST_ENDVISIT_REDUCES(SwitchStatement , AnyCase , "s= witch(e){blk}" , ({"e", "{blk}"}) , m_switchStatement) + TEST_ENDVISIT_REDUCES(TildeExpression , AnyCase , "~= 5" , ({"5"}) , m_tildeExpression) + TEST_ENDVISIT_REDUCES(TypeOfExpression , AnyCase , "t= ypeof 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= =3D5" , ({"5"}) , m_variableDeclarationWit= hAssignment) TEST_ENDVISIT_REDUCES(VariableDeclaration , WithoutAssignment , "i= " , ({}) , m_variableDeclarationWitho= utAssignment) TEST_ENDVISIT_REDUCES(VariableDeclarationList , TwoDeclarations , "v= ar i,e=3D5" , ({"i", "e=3D5"}) , m_twoVarDeclarations) TEST_ENDVISIT_REDUCES(VariableDeclarationList , OneDeclaration , "v= ar e=3D5" , ({"e=3D5"}) , m_twoVarDeclarationsPa= rt2) TEST_ENDVISIT_REDUCES(VariableDeclarationList , ConstDeclaration , "c= onst e=3D5" , ({"e=3D5"}) , m_twoConstDeclarations= Part2) TEST_ENDVISIT_REDUCES(VariableStatement , AnyCase , "x= ;" , ({"x"}) , m_variableStatement) + TEST_ENDVISIT_REDUCES(VoidExpression , AnyCase , "v= oid v" , ({"v"}) , m_voidExpression) TEST_ENDVISIT_REDUCES(WhileStatement , AnyCase , "w= hile(e)stm" , ({"e", "stm"}) , m_whileStatement) = TEST_VISIT_BINARYOP_PUTS_ON_STACK(Assign, "=3D") 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"); }