From kde-commits Wed Sep 30 20:44:33 2015 From: Jan Marker Date: Wed, 30 Sep 2015 20:44:33 +0000 To: kde-commits Subject: [qmlweb/development/qmlweb2] /: [Compiler] Implement some literals Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=144364588221988 Git commit ea758273fcf672cd758ae0002a365e4ecb2ccccf by Jan Marker. Committed on 30/09/2015 at 20:41. Pushed by jangmarker into branch 'development/qmlweb2'. [Compiler] Implement some literals * true, false, this,... * array literals * includes style corrections M +64 -0 src/qmljsc/purejavascriptgenerator.cpp M +8 -1 src/qmljsc/purejavascriptgenerator.h A +1 -0 tests/auto/data/javascript/literals.compiled.js A +12 -0 tests/auto/data/javascript/literals.js M +57 -13 tests/auto/qmljsc/testpurejavascriptgenerator.cpp M +1 -0 tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp http://commits.kde.org/qmlweb/ea758273fcf672cd758ae0002a365e4ecb2ccccf diff --git a/src/qmljsc/purejavascriptgenerator.cpp b/src/qmljsc/purejavasc= riptgenerator.cpp index b5adc31..5c4a399 100644 --- a/src/qmljsc/purejavascriptgenerator.cpp +++ b/src/qmljsc/purejavascriptgenerator.cpp @@ -101,6 +101,21 @@ bool PureJavaScriptGenerator::visit(AST::DefaultClause= *) { return true; } = +bool PureJavaScriptGenerator::visit(AST::Elision *currentElision) { + QString output; + while (currentElision) { + output +=3D ','; + currentElision =3D currentElision->next; + } + m_outputStack << output; + return true; +} + +bool PureJavaScriptGenerator::visit(AST::FalseLiteral *) { + m_outputStack << "false"; + return true; +} + bool PureJavaScriptGenerator::visit(AST::FormalParameterList *currentParam= eter) { QString parameterCode; while (currentParameter) { @@ -119,6 +134,11 @@ bool PureJavaScriptGenerator::visit(AST::IdentifierExp= ression *identifierExpress return true; } = +bool PureJavaScriptGenerator::visit(AST::NullExpression *) { + m_outputStack << "null"; + return true; +} + bool PureJavaScriptGenerator::visit(AST::NumericLiteral *numericLiteral) { m_outputStack.push(QString::number(numericLiteral->value)); return true; @@ -129,6 +149,22 @@ bool PureJavaScriptGenerator::visit(AST::StringLiteral= *stringLiteral) { return true; } = +bool PureJavaScriptGenerator::visit(AST::ThisExpression *) { + m_outputStack << "this"; + return true; +} + +bool PureJavaScriptGenerator::visit(AST::TrueLiteral *) { + m_outputStack << "true"; + return true; +} + +void PureJavaScriptGenerator::endVisit(AST::ArrayLiteral *arrayLiteral) { + const QString elision =3D (arrayLiteral->elision)?m_outputStack.pop():= ""; + const QString elements =3D (arrayLiteral->elements)?m_outputStack.pop(= ):""; + m_outputStack << '[' + elements + elision + ']'; +} + void PureJavaScriptGenerator::endVisit(AST::BinaryExpression *) { const QString rightOperand =3D m_outputStack.pop(); const QString leftOperand =3D m_outputStack.pop(); @@ -172,6 +208,34 @@ void PureJavaScriptGenerator::endVisit(AST::DefaultCla= use *) { m_outputStack << defaultKeyword + ':' + statement; } = +void PureJavaScriptGenerator::endVisit(AST::ElementList *elementList) { + QString code; + AST::ElementList *currentElement =3D elementList; + QStack::iterator positionOnStack =3D m_outputStack.end(); + + for (currentElement =3D elementList; currentElement; currentElement = =3D currentElement->next) { + if (currentElement->elision) { + --positionOnStack; + } + if (currentElement->expression) { + --positionOnStack; + } + } + + for (currentElement =3D elementList; currentElement; currentElement = =3D currentElement->next) { + if (currentElement->elision) { + code +=3D *positionOnStack; + positionOnStack =3D m_outputStack.erase(positionOnStack); + } + if (currentElement->expression) { + code +=3D *positionOnStack + ','; + positionOnStack =3D m_outputStack.erase(positionOnStack); + } + } + + m_outputStack << code; +} + void PureJavaScriptGenerator::endVisit(AST::EmptyStatement *) { m_outputStack << ";"; } diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascri= ptgenerator.h index 45b6088..f1374d5 100644 --- a/src/qmljsc/purejavascriptgenerator.h +++ b/src/qmljsc/purejavascriptgenerator.h @@ -37,17 +37,24 @@ public: virtual bool visit(QQmlJS::AST::CaseClause *) override; virtual bool visit(QQmlJS::AST::ContinueStatement *) override; virtual bool visit(QQmlJS::AST::DefaultClause *) override; + virtual bool visit(QQmlJS::AST::Elision *) override; + virtual bool visit(QQmlJS::AST::FalseLiteral *) override; virtual bool visit(QQmlJS::AST::FormalParameterList *) override; virtual bool visit(QQmlJS::AST::IdentifierExpression *) override; + virtual bool visit(QQmlJS::AST::NullExpression *) override; virtual bool visit(QQmlJS::AST::NumericLiteral *) override; 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::ArrayLiteral *) override; virtual void endVisit(QQmlJS::AST::BinaryExpression *) override; virtual void endVisit(QQmlJS::AST::Block *) override; 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::DefaultClause *) override; + virtual void endVisit(QQmlJS::AST::ElementList *) override; virtual void endVisit(QQmlJS::AST::EmptyStatement *) override; virtual void endVisit(QQmlJS::AST::ExpressionStatement *) override; virtual void endVisit(QQmlJS::AST::FunctionBody *) override; diff --git a/tests/auto/data/javascript/literals.compiled.js b/tests/auto/d= ata/javascript/literals.compiled.js new file mode 100644 index 0000000..bcb5ddd --- /dev/null +++ b/tests/auto/data/javascript/literals.compiled.js @@ -0,0 +1 @@ +this;null;identifier;true;false;4.1;"string";[];[1,2,];[,,,5,];[5,,,5,];[5= ,]; \ No newline at end of file diff --git a/tests/auto/data/javascript/literals.js b/tests/auto/data/javas= cript/literals.js new file mode 100644 index 0000000..7f07a67 --- /dev/null +++ b/tests/auto/data/javascript/literals.js @@ -0,0 +1,12 @@ +this; +null; +identifier; +true; +false; +4.1; +"string"; +[]; +[1, 2,]; +[,,,5,]; +[5,,,5,]; +[5]; \ No newline at end of file diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp b/tests/auto= /qmljsc/testpurejavascriptgenerator.cpp index c24e419..9282edc 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp @@ -58,7 +58,7 @@ } = #define TEST_ENDVISIT_REDUCES(className, scenarioName, expectedTopOfStack,= stackContent, instance) \ - void test_endVisit_ ## className ## scenarioName ## _reducesSt= ack() { \ + void test_endVisit_ ## className ## _ ## scenarioName ## _redu= cesStack() { \ asPureJSGen(m_generator)->m_outputStack.append(QVectorstackContent); \ m_generator->endVisit(&instance); \ QCOMPARE(asPureJSGen(m_generator)->m_outputStack.top(), QS= tringLiteral(expectedTopOfStack)); \ @@ -84,11 +84,24 @@ public: , m_anotherIdentifier("e") , m_anotherIdentifierStringRef(&m_anotherIdentifier) /* Expressions */ + , m_thisExpression() + , m_nullExpression() , m_identifierExpression(m_someIdentifierStringRef) + , m_trueLiteral() + , m_falseLiteral() , m_numericalExpressionPi(3.14) , m_stringLiteral(m_someStringStringRef) - , m_trueExpression() - , m_falseExpression() + , m_twoElisions() + , m_elisionsPart2(&m_twoElisions) + , m_arrayElementsExp(nullptr, &m_trueLiteral) + , m_arrayElementsExpExp(nullptr, &m_trueLiteral) + , m_arrayElementsExpExpPart2(&m_arrayElementsExpExp, nullptr, &m_f= alseLiteral) + , m_arrayElementsElisionExp(&m_twoElisions, &m_falseLiteral) + , m_arrayElementsExpElisionExp(nullptr, &m_falseLiteral) + , m_arrayLiteralWithElision(&m_arrayElementsExp, &m_twoElisions) + , m_arrayLiteralWithoutElision(&m_arrayElementsExp) + , m_arrayLiteralOnlyElision(&m_twoElisions) + , m_arrayElementsExpElisionExpPart2(&m_arrayElementsExpElisionExp,= &m_twoElisions, &m_trueLiteral) , m_equalsBinaryExpression(nullptr, QSOperator::Equal, nullptr) , m_postDecrementExpression(&m_numericalExpressionPi) , m_postIncrementExpression(&m_numericalExpressionPi) @@ -98,7 +111,7 @@ public: /* Variable Declarations */ , m_constDeclaration1(m_someIdentifierStringRef, nullptr) , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr) - , m_variableDeclarationWithAssignment(m_someIdentifierStringRef, &= m_trueExpression) + , m_variableDeclarationWithAssignment(m_someIdentifierStringRef, &= m_trueLiteral) , m_variableDeclarationWithoutAssignment(m_someIdentifierStringRef= , nullptr) , m_twoConstDeclarations(&m_constDeclaration1) , m_twoConstDeclarationsPart2(&m_twoConstDeclarations, &m_constDec= laration2) @@ -114,10 +127,10 @@ public: , m_statement2() , m_statement3() , m_expressionStatement(nullptr) - , m_ifStatementWithoutElse(&m_trueExpression, &m_statement1) - , m_ifStatementWithElse(&m_trueExpression, &m_statement1, &m_state= ment2) + , m_ifStatementWithoutElse(&m_trueLiteral, &m_statement1) + , m_ifStatementWithElse(&m_trueLiteral, &m_statement1, &m_statemen= t2) , m_returnStatementWithoutValue(nullptr) - , m_returnStatementWithValue(&m_trueExpression) + , m_returnStatementWithValue(&m_trueLiteral) , m_variableStatement(&m_twoVarDeclarations) , m_threeStatementsList(&m_statement1) , m_statementListPart2(&m_threeStatementsList, &m_statement2) @@ -136,8 +149,8 @@ public: , m_functionDeclarationWithParameters(m_someIdentifierStringRef, &= m_twoParameters , &m_functionBody) , m_functionDeclarationWithoutBody(m_someIdentifierStringRef, &m_t= woParameters, nullptr) /* Switch */ - , m_caseClause1(&m_trueExpression, &m_threeStatementsList) - , m_caseClause2(&m_trueExpression, &m_threeStatementsList) + , m_caseClause1(&m_trueLiteral, &m_threeStatementsList) + , m_caseClause2(&m_trueLiteral, &m_threeStatementsList) , m_twoCaseClauses(&m_caseClause1) , m_twoCaseClausesPart2(&m_twoCaseClauses, &m_caseClause2) , m_defaultClause(&m_threeStatementsList) @@ -145,9 +158,14 @@ public: , m_caseBlockOnlyCases(&m_twoCaseClauses) , m_caseBlockCasesAndDefault(&m_twoCaseClauses, &m_defaultClause) , m_caseBlockCasesDefaultCases(&m_twoCaseClauses, &m_defaultClause= , &m_twoCaseClauses) - , m_caseClause(&m_trueExpression, &m_threeStatementsList) - , m_switchStatement(&m_trueExpression, &m_caseBlock) + , m_caseClause(&m_trueLiteral, &m_threeStatementsList) + , m_switchStatement(&m_trueLiteral, &m_caseBlock) { + m_elisionsPart2.finish(); + m_arrayElementsExp.finish(); + m_arrayElementsExpExpPart2.finish(); + m_arrayElementsElisionExp.finish(); + m_arrayElementsExpElisionExpPart2.finish(); m_statementListPart3.finish(); m_sourceElementsListPart3.finish(); m_parameterListPart2.finish(); @@ -172,11 +190,25 @@ private: const QStringRef m_anotherIdentifierStringRef; = /* Expressions */ + AST::ThisExpression m_thisExpression; + AST::NullExpression m_nullExpression; AST::IdentifierExpression m_identifierExpression; + AST::TrueLiteral m_trueLiteral; + AST::FalseLiteral m_falseLiteral; AST::NumericLiteral m_numericalExpressionPi; AST::StringLiteral m_stringLiteral; - AST::TrueLiteral m_trueExpression; - AST::FalseLiteral m_falseExpression; + + AST::Elision m_twoElisions; + AST::Elision m_elisionsPart2; + AST::ElementList m_arrayElementsExp; + AST::ElementList m_arrayElementsExpExp; + AST::ElementList m_arrayElementsExpExpPart2; + AST::ElementList m_arrayElementsElisionExp; + AST::ElementList m_arrayElementsExpElisionExp; + AST::ElementList m_arrayElementsExpElisionExpPart2; + AST::ArrayLiteral m_arrayLiteralWithElision; + AST::ArrayLiteral m_arrayLiteralWithoutElision; + AST::ArrayLiteral m_arrayLiteralOnlyElision; = AST::BinaryExpression m_equalsBinaryExpression; = @@ -280,14 +312,17 @@ private slots: TEST_VISIT_PUTS_ON_STACK(DefaultClause , Default , = "default" , m_defaultClause) TEST_VISIT_PUTS_ON_STACK(ContinueStatement , WithLabel , = "continue ALabel;", m_continueStatementWithLabel) TEST_VISIT_PUTS_ON_STACK(ContinueStatement , WithoutLabel , = "continue;" , m_continueStatementWithoutLabel) + TEST_VISIT_PUTS_ON_STACK(Elision , AnyCase , = ",," , m_twoElisions) TEST_VISIT_DEFAULT_IMPL_(EmptyStatement = , m_emptyStatement) TEST_VISIT_DEFAULT_IMPL_(ExpressionStatement = , m_expressionStatement) TEST_VISIT_PUTS_ON_STACK(FormalParameterList , OneParameter , = "e" , m_parameterListPart2) TEST_VISIT_PUTS_ON_STACK(FormalParameterList , TwoParameters , = "i,e" , m_twoParameters) + TEST_VISIT_PUTS_ON_STACK(FalseLiteral , AnyCase , = "false" , m_falseLiteral) TEST_VISIT_DEFAULT_IMPL_(FunctionBody = , m_functionBody) TEST_VISIT_DEFAULT_IMPL_(FunctionDeclaration = , m_functionDeclarationWithParameters) TEST_VISIT_PUTS_ON_STACK(IdentifierExpression , AnyCase , = "i" , m_identifierExpression) TEST_VISIT_DEFAULT_IMPL_(IfStatement = , m_ifStatementWithoutElse) + TEST_VISIT_PUTS_ON_STACK(NullExpression , AnyCase , = "null" , m_nullExpression) TEST_VISIT_PUTS_ON_STACK(NumericLiteral , Pi , = "3.14" , m_numericalExpressionPi) TEST_VISIT_DEFAULT_IMPL_(PostDecrementExpression = , m_postDecrementExpression) TEST_VISIT_DEFAULT_IMPL_(PostIncrementExpression = , m_postIncrementExpression) @@ -298,10 +333,15 @@ private slots: TEST_VISIT_DEFAULT_IMPL_(StatementList = , m_threeStatementsList) TEST_VISIT_PUTS_ON_STACK(StringLiteral , AnyCase , = "\"some string\"" , m_stringLiteral) TEST_VISIT_DEFAULT_IMPL_(SwitchStatement = , m_switchStatement) + TEST_VISIT_PUTS_ON_STACK(ThisExpression , AnyCase , = "this" , m_thisExpression) + TEST_VISIT_PUTS_ON_STACK(TrueLiteral , AnyCase , = "true" , m_trueLiteral) TEST_VISIT_DEFAULT_IMPL_(VariableDeclaration = , m_variableDeclarationWithoutAssignment) TEST_VISIT_DEFAULT_IMPL_(VariableDeclarationList = , m_twoConstDeclarations) TEST_VISIT_DEFAULT_IMPL_(VariableStatement = , m_variableStatement) = + TEST_ENDVISIT_REDUCES(ArrayLiteral , OnlyElision , "[= ,,,]" , ({",,,"}) , m_arrayLiteralOnlyElision) + TEST_ENDVISIT_REDUCES(ArrayLiteral , WithElision , "[= 5,,,]" , ({"5", ",,,"}) , m_arrayLiteralWithElision) + TEST_ENDVISIT_REDUCES(ArrayLiteral , WithoutElision , "[= 5]" , ({"5"}) , m_arrayLiteralWithoutElisi= on) TEST_ENDVISIT_REDUCES(BinaryExpression , TwoOperands , "2= =3D=3D4" , ({"=3D=3D", "2", "4"}) , m_equalsBinaryExpr= ession) TEST_ENDVISIT_REDUCES(Block , AnyCase , "{= content}" , ({"content"}) , m_block) TEST_ENDVISIT_REDUCES(CaseBlock , OnlyCases , "{= cases;}" , ({"cases;"}) , m_caseBlockOnlyCases) @@ -310,6 +350,10 @@ private slots: 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(DefaultClause , AnyCase , "d= efault:stm" , ({"default", "stm"}) , m_defaultClause) + 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) + TEST_ENDVISIT_REDUCES(ElementList , ExprElisionExpr , "e= xpr,eliexpr," , ({"expr", "eli", "expr"}) , m_arrayElementsExpElisionE= xp) TEST_ENDVISIT_REDUCES(EmptyStatement , DefaultScenario , ";= " , ({}) , m_emptyStatement) TEST_ENDVISIT_REDUCES(ExpressionStatement , AnyCase , "e= xpression;" , ({"expression"}) , m_expressionStatement) TEST_ENDVISIT_REDUCES(FormalParameterList , AnyCase , "i= " , ({"i"}) , m_twoParameters) // does n= othing diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp = b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index 0a9a000..ba68e96 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp @@ -87,6 +87,7 @@ private slots: addRowForFileWithCompiled("otherstatements"); addRowForFileWithCompiled("ifstatements"); addRowForFileWithCompiled("switchstatements"); + addRowForFileWithCompiled("literals"); } = void test_compileJavaScriptFile() {