Git commit cced0e2387398165b7d909b876542680b24d69de by Jan Marker. Committed on 30/09/2015 at 20:41. Pushed by jangmarker into branch 'development/qmlweb2'. [Compiler] Implement object literals M +31 -0 src/qmljsc/purejavascriptgenerator.cpp M +5 -0 src/qmljsc/purejavascriptgenerator.h A +1 -0 tests/auto/data/javascript/arrayliterals.compiled.js A +5 -0 tests/auto/data/javascript/arrayliterals.js M +1 -1 tests/auto/data/javascript/literals.compiled.js M +1 -6 tests/auto/data/javascript/literals.js A +1 -0 tests/auto/data/javascript/objectliterals.compiled.js A +3 -0 tests/auto/data/javascript/objectliterals.js M +28 -0 tests/auto/qmljsc/testpurejavascriptgenerator.cpp M +2 -0 tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp http://commits.kde.org/qmlweb/cced0e2387398165b7d909b876542680b24d69de diff --git a/src/qmljsc/purejavascriptgenerator.cpp b/src/qmljsc/purejavasc= riptgenerator.cpp index 5c4a399..9066f93 100644 --- a/src/qmljsc/purejavascriptgenerator.cpp +++ b/src/qmljsc/purejavascriptgenerator.cpp @@ -134,6 +134,11 @@ bool PureJavaScriptGenerator::visit(AST::IdentifierExp= ression *identifierExpress return true; } = +bool PureJavaScriptGenerator::visit(AST::IdentifierPropertyName *identifie= rPropertyName) { + m_outputStack << identifierPropertyName->id.toString(); + return true; +} + bool PureJavaScriptGenerator::visit(AST::NullExpression *) { m_outputStack << "null"; return true; @@ -274,6 +279,11 @@ void PureJavaScriptGenerator::endVisit(AST::IfStatemen= t *ifExpression) { void PureJavaScriptGenerator::endVisit(AST::NumericLiteral *) { } = +void PureJavaScriptGenerator::endVisit(AST::ObjectLiteral *) { + const QString properties =3D m_outputStack.pop(); + m_outputStack << '{' + properties + '}'; +} + void PureJavaScriptGenerator::endVisit(AST::PostDecrementExpression *) { const QString expression =3D m_outputStack.pop(); m_outputStack << expression + "--"; @@ -294,6 +304,27 @@ void PureJavaScriptGenerator::endVisit(AST::PreIncreme= ntExpression *) { m_outputStack << "++" + expression; } = +void PureJavaScriptGenerator::endVisit(AST::PropertyAssignmentList *assign= mentList) { + reduceListStack(assignmentList, ","); +} + +void PureJavaScriptGenerator::endVisit(AST::PropertyGetterSetter *getterSe= tter) { + const QString functionBody =3D (getterSetter->functionBody)?m_outputSt= ack.pop():"{}"; + const QString parameters =3D (getterSetter->formals)?m_outputStack.pop= ():""; + const QString propertyName =3D m_outputStack.pop(); + if (getterSetter->type =3D=3D AST::PropertyGetterSetter::Getter) { + m_outputStack << "get " + propertyName + "()" + functionBody; + } else { + m_outputStack << "set " + propertyName + '(' + parameters + ')' + = functionBody; + } +} + +void PureJavaScriptGenerator::endVisit(AST::PropertyNameAndValue *) { + const QString expression =3D m_outputStack.pop(); + const QString propertyName =3D m_outputStack.pop(); + m_outputStack << propertyName + ':' + expression; +} + void PureJavaScriptGenerator::endVisit(AST::ReturnStatement *returnStateme= nt) { const QString expression =3D (returnStatement->expression) ? ' '+m_out= putStack.pop() : ""; m_outputStack << "return" + expression + ';'; diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascri= ptgenerator.h index f1374d5..415bf62 100644 --- a/src/qmljsc/purejavascriptgenerator.h +++ b/src/qmljsc/purejavascriptgenerator.h @@ -41,6 +41,7 @@ public: 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::IdentifierPropertyName *) override; virtual bool visit(QQmlJS::AST::NullExpression *) override; virtual bool visit(QQmlJS::AST::NumericLiteral *) override; virtual bool visit(QQmlJS::AST::StringLiteral *) override; @@ -62,10 +63,14 @@ public: virtual void endVisit(QQmlJS::AST::IdentifierExpression *) override; virtual void endVisit(QQmlJS::AST::IfStatement *) override; virtual void endVisit(QQmlJS::AST::NumericLiteral *) override; + virtual void endVisit(QQmlJS::AST::ObjectLiteral *) override; virtual void endVisit(QQmlJS::AST::PostDecrementExpression *) override; virtual void endVisit(QQmlJS::AST::PostIncrementExpression *) override; virtual void endVisit(QQmlJS::AST::PreDecrementExpression *) override; virtual void endVisit(QQmlJS::AST::PreIncrementExpression *) override; + virtual void endVisit(QQmlJS::AST::PropertyAssignmentList *) override; + virtual void endVisit(QQmlJS::AST::PropertyGetterSetter *) override; + virtual void endVisit(QQmlJS::AST::PropertyNameAndValue *) override; virtual void endVisit(QQmlJS::AST::ReturnStatement *) override; virtual void endVisit(QQmlJS::AST::SourceElements *) override; virtual void endVisit(QQmlJS::AST::StringLiteral *) override; diff --git a/tests/auto/data/javascript/arrayliterals.compiled.js b/tests/a= uto/data/javascript/arrayliterals.compiled.js new file mode 100644 index 0000000..5763660 --- /dev/null +++ b/tests/auto/data/javascript/arrayliterals.compiled.js @@ -0,0 +1 @@ +[];[1,2,];[,,,5,];[5,,,5,];[5,]; \ No newline at end of file diff --git a/tests/auto/data/javascript/arrayliterals.js b/tests/auto/data/= javascript/arrayliterals.js new file mode 100644 index 0000000..6aa6e32 --- /dev/null +++ b/tests/auto/data/javascript/arrayliterals.js @@ -0,0 +1,5 @@ +[]; +[1, 2,]; +[,,,5,]; +[5,,,5,]; +[5]; \ No newline at end of file diff --git a/tests/auto/data/javascript/literals.compiled.js b/tests/auto/d= ata/javascript/literals.compiled.js index bcb5ddd..4a47b75 100644 --- a/tests/auto/data/javascript/literals.compiled.js +++ b/tests/auto/data/javascript/literals.compiled.js @@ -1 +1 @@ -this;null;identifier;true;false;4.1;"string";[];[1,2,];[,,,5,];[5,,,5,];[5= ,]; \ No newline at end of file +this;null;identifier;true;false;4.1;"string"; \ No newline at end of file diff --git a/tests/auto/data/javascript/literals.js b/tests/auto/data/javas= cript/literals.js index 7f07a67..a6a89c0 100644 --- a/tests/auto/data/javascript/literals.js +++ b/tests/auto/data/javascript/literals.js @@ -4,9 +4,4 @@ identifier; true; false; 4.1; -"string"; -[]; -[1, 2,]; -[,,,5,]; -[5,,,5,]; -[5]; \ No newline at end of file +"string"; \ No newline at end of file diff --git a/tests/auto/data/javascript/objectliterals.compiled.js b/tests/= auto/data/javascript/objectliterals.compiled.js new file mode 100644 index 0000000..ddcf169 --- /dev/null +++ b/tests/auto/data/javascript/objectliterals.compiled.js @@ -0,0 +1 @@ +x=3D{property1:"value"};x=3D{property1:"value",property2:"value2"};x=3D{pr= operty1:null,get property1(){},set property1(x){}}; \ No newline at end of file diff --git a/tests/auto/data/javascript/objectliterals.js b/tests/auto/data= /javascript/objectliterals.js new file mode 100644 index 0000000..030ad6a --- /dev/null +++ b/tests/auto/data/javascript/objectliterals.js @@ -0,0 +1,3 @@ +x =3D {property1: "value"}; +x =3D {property1: "value", property2: "value2"}; +x =3D {property1: null, get property1(){}, set property1(x){}}; \ No newline at end of file diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp b/tests/auto= /qmljsc/testpurejavascriptgenerator.cpp index 9282edc..9ba9676 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp @@ -102,6 +102,15 @@ public: , m_arrayLiteralWithoutElision(&m_arrayElementsExp) , m_arrayLiteralOnlyElision(&m_twoElisions) , m_arrayElementsExpElisionExpPart2(&m_arrayElementsExpElisionExp,= &m_twoElisions, &m_trueLiteral) + , m_identifierPropertyName(m_someIdentifierStringRef) + , m_propertyNameAndValue(&m_identifierPropertyName, &m_falseLitera= l) + , m_propertyGetter(&m_identifierPropertyName, &m_functionBody) + , m_propertyGetterEmptyBody(&m_identifierPropertyName, nullptr) + , m_propertySetter(&m_identifierPropertyName, &m_twoParameters, &m= _functionBody) + , m_propertySetterEmptyBody(&m_identifierPropertyName, &m_twoParam= eters, nullptr) + , m_twoProperties(&m_propertyNameAndValue) + , m_twoPropertiesPart2(&m_twoProperties, &m_propertyNameAndValue) + , m_objectLiteral(&m_twoProperties) , m_equalsBinaryExpression(nullptr, QSOperator::Equal, nullptr) , m_postDecrementExpression(&m_numericalExpressionPi) , m_postIncrementExpression(&m_numericalExpressionPi) @@ -166,6 +175,7 @@ public: m_arrayElementsExpExpPart2.finish(); m_arrayElementsElisionExp.finish(); m_arrayElementsExpElisionExpPart2.finish(); + m_twoPropertiesPart2.finish(); m_statementListPart3.finish(); m_sourceElementsListPart3.finish(); m_parameterListPart2.finish(); @@ -210,6 +220,16 @@ private: AST::ArrayLiteral m_arrayLiteralWithoutElision; AST::ArrayLiteral m_arrayLiteralOnlyElision; = + AST::IdentifierPropertyName m_identifierPropertyName; + AST::PropertyNameAndValue m_propertyNameAndValue; + AST::PropertyGetterSetter m_propertyGetter; + AST::PropertyGetterSetter m_propertyGetterEmptyBody; + AST::PropertyGetterSetter m_propertySetter; + AST::PropertyGetterSetter m_propertySetterEmptyBody; + AST::PropertyAssignmentList m_twoProperties; + AST::PropertyAssignmentList m_twoPropertiesPart2; + AST::ObjectLiteral m_objectLiteral; + AST::BinaryExpression m_equalsBinaryExpression; = AST::PostDecrementExpression m_postDecrementExpression; @@ -321,6 +341,7 @@ private slots: 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_PUTS_ON_STACK(IdentifierPropertyName , AnyCase , = "i" , m_identifierPropertyName) 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) @@ -365,10 +386,17 @@ private slots: TEST_ENDVISIT_REDUCES(IfStatement , OnlyIf , "i= f(exp)stm;" , ({"exp", "stm;"}) , m_ifStatementWithoutElse) TEST_ENDVISIT_REDUCES(IfStatement , IfElse , "i= f(exp)s;else s;", ({"exp", "s;", "s;"}) , m_ifStatementWithElse) 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) TEST_ENDVISIT_REDUCES(PostIncrementExpression , AnyCase , "2= .7++" , ({"2.7"}) , m_postIncrementExpression) TEST_ENDVISIT_REDUCES(PreDecrementExpression , AnyCase , "-= -2.7" , ({"2.7"}) , m_preDecrementExpression) TEST_ENDVISIT_REDUCES(PreIncrementExpression , AnyCase , "+= +2.7" , ({"2.7"}) , m_preIncrementExpression) + TEST_ENDVISIT_REDUCES(PropertyAssignmentList , TwoProperties , "p= rop1,prop2" , ({"prop1", "prop2"}) , m_twoProperties) + TEST_ENDVISIT_REDUCES(PropertyGetterSetter , Getter , "g= et i(){body}" , ({"i", "{body}"}) , m_propertyGetter) + TEST_ENDVISIT_REDUCES(PropertyGetterSetter , GetterEmptyBody , "g= et i(){}" , ({"i"}) , m_propertyGetterEmptyBody) + TEST_ENDVISIT_REDUCES(PropertyGetterSetter , Setter , "s= et i(param){body}", ({"i", "param", "{body}"}) , m_propertySetter) + TEST_ENDVISIT_REDUCES(PropertyGetterSetter , SetterEmptyBody , "s= et i(param){}" , ({"i", "param"}) , m_propertySetterEmptyBody) + TEST_ENDVISIT_REDUCES(PropertyNameAndValue , AnyCase , "p= rop:expr" , ({"prop", "expr"}) , m_propertyNameAndValue) TEST_ENDVISIT_REDUCES(ReturnStatement , WithoutReturnValue, "r= eturn;" , ({}) , m_returnStatementWithoutVa= lue) TEST_ENDVISIT_REDUCES(ReturnStatement , WithReturnValue , "r= eturn true;" , ({"true"}) , m_returnStatementWithValue) TEST_ENDVISIT_REDUCES(SourceElements , ThreeSrcElements , "s= El1sEl2sEl3" , ({"sEl1", "sEl2", "sEl3"}) , m_threeSourceElementsList) diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp = b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index ba68e96..ea1729d 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp @@ -88,6 +88,8 @@ private slots: addRowForFileWithCompiled("ifstatements"); addRowForFileWithCompiled("switchstatements"); addRowForFileWithCompiled("literals"); + addRowForFileWithCompiled("arrayliterals"); + addRowForFileWithCompiled("objectliterals"); } = void test_compileJavaScriptFile() {