From kde-commits Wed Sep 30 20:44:34 2015 From: Jan Marker Date: Wed, 30 Sep 2015 20:44:34 +0000 To: kde-commits Subject: [qmlweb/development/qmlweb2] /: [Compiler] Add array and object member access Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=144364588421990 Git commit 6e4b81f27b57f5166efa7841ae6184da82495168 by Jan Marker. Committed on 30/09/2015 at 20:41. Pushed by jangmarker into branch 'development/qmlweb2'. [Compiler] Add array and object member access M +12 -0 src/qmljsc/purejavascriptgenerator.cpp M +2 -0 src/qmljsc/purejavascriptgenerator.h A +1 -0 tests/auto/data/javascript/propertyaccess.compiled.js A +3 -0 tests/auto/data/javascript/propertyaccess.js M +11 -0 tests/auto/qmljsc/testpurejavascriptgenerator.cpp M +1 -0 tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp http://commits.kde.org/qmlweb/6e4b81f27b57f5166efa7841ae6184da82495168 diff --git a/src/qmljsc/purejavascriptgenerator.cpp b/src/qmljsc/purejavasc= riptgenerator.cpp index 9066f93..fc15853 100644 --- a/src/qmljsc/purejavascriptgenerator.cpp +++ b/src/qmljsc/purejavascriptgenerator.cpp @@ -170,6 +170,12 @@ void PureJavaScriptGenerator::endVisit(AST::ArrayLiter= al *arrayLiteral) { m_outputStack << '[' + elements + elision + ']'; } = +void PureJavaScriptGenerator::endVisit(AST::ArrayMemberExpression *) { + const QString keyExpression =3D m_outputStack.pop(); + const QString arrayExpression =3D m_outputStack.pop(); + m_outputStack << arrayExpression + '[' + keyExpression + ']'; +} + void PureJavaScriptGenerator::endVisit(AST::BinaryExpression *) { const QString rightOperand =3D m_outputStack.pop(); const QString leftOperand =3D m_outputStack.pop(); @@ -249,6 +255,12 @@ void PureJavaScriptGenerator::endVisit(AST::Expression= Statement *) { m_outputStack << m_outputStack.pop() + ';'; } = +void PureJavaScriptGenerator::endVisit(AST::FieldMemberExpression *fieldMe= mberExpression) { + const QString objectExpression =3D m_outputStack.pop(); + const QString memberName =3D fieldMemberExpression->name.toString(); + m_outputStack << objectExpression + '.' + memberName; +} + void PureJavaScriptGenerator::endVisit(AST::FunctionBody *) { const QString body =3D m_outputStack.pop(); m_outputStack << '{' + body + '}'; diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascri= ptgenerator.h index 415bf62..ea0187f 100644 --- a/src/qmljsc/purejavascriptgenerator.h +++ b/src/qmljsc/purejavascriptgenerator.h @@ -49,6 +49,7 @@ public: virtual bool visit(QQmlJS::AST::TrueLiteral *) override; = virtual void endVisit(QQmlJS::AST::ArrayLiteral *) override; + virtual void endVisit(QQmlJS::AST::ArrayMemberExpression *) override; virtual void endVisit(QQmlJS::AST::BinaryExpression *) override; virtual void endVisit(QQmlJS::AST::Block *) override; virtual void endVisit(QQmlJS::AST::CaseBlock *) override; @@ -58,6 +59,7 @@ public: 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::FieldMemberExpression *) override; virtual void endVisit(QQmlJS::AST::FunctionBody *) override; virtual void endVisit(QQmlJS::AST::FunctionDeclaration *) override; virtual void endVisit(QQmlJS::AST::IdentifierExpression *) override; diff --git a/tests/auto/data/javascript/propertyaccess.compiled.js b/tests/= auto/data/javascript/propertyaccess.compiled.js new file mode 100644 index 0000000..4a11b7d --- /dev/null +++ b/tests/auto/data/javascript/propertyaccess.compiled.js @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000..094b1ed --- /dev/null +++ b/tests/auto/data/javascript/propertyaccess.js @@ -0,0 +1,3 @@ +obj.prop; +obj["prop"]; +obj[0]; \ No newline at end of file diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp b/tests/auto= /qmljsc/testpurejavascriptgenerator.cpp index 9ba9676..ed21e3d 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp @@ -83,6 +83,8 @@ public: , m_someIdentifierStringRef(&m_someIdentifier) , m_anotherIdentifier("e") , m_anotherIdentifierStringRef(&m_anotherIdentifier) + , m_propertyIdentifier("property") + , m_propertyIdentifierStringRef(&m_propertyIdentifier) /* Expressions */ , m_thisExpression() , m_nullExpression() @@ -117,6 +119,8 @@ public: , m_preDecrementExpression(&m_numericalExpressionPi) , m_preIncrementExpression(&m_numericalExpressionPi) , m_block(nullptr) + , m_fieldMemberExpression(&m_identifierExpression, m_propertyIdent= ifierStringRef) + , m_arrayMemberExpression(nullptr, nullptr) /* Variable Declarations */ , m_constDeclaration1(m_someIdentifierStringRef, nullptr) , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr) @@ -198,6 +202,8 @@ private: const QStringRef m_someIdentifierStringRef; const QString m_anotherIdentifier; const QStringRef m_anotherIdentifierStringRef; + const QString m_propertyIdentifier; + const QStringRef m_propertyIdentifierStringRef; = /* Expressions */ AST::ThisExpression m_thisExpression; @@ -237,6 +243,9 @@ private: AST::PreDecrementExpression m_preDecrementExpression; AST::PreIncrementExpression m_preIncrementExpression; = + AST::FieldMemberExpression m_fieldMemberExpression; + AST::ArrayMemberExpression m_arrayMemberExpression; + /* Variable Declarations */ AST::VariableDeclaration m_constDeclaration1; AST::VariableDeclaration m_constDeclaration2; @@ -363,6 +372,7 @@ private slots: 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(ArrayMemberExpression , AnyCase , "i= [2]" , ({"i", "2"}) , m_arrayMemberExpression) 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) @@ -377,6 +387,7 @@ private slots: 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(FieldMemberExpression , AnyCase , "o= bj.property" , ({"obj"}) , m_fieldMemberExpression) TEST_ENDVISIT_REDUCES(FormalParameterList , AnyCase , "i= " , ({"i"}) , m_twoParameters) // does n= othing TEST_ENDVISIT_REDUCES(FunctionBody , ClosesCorrectly , "{= func}" , ({"func"}) , m_functionBody) TEST_ENDVISIT_REDUCES(FunctionDeclaration , BodyNoParameters , "f= unction i(){body}" , ({"{body}"}) , m_functionDeclarationWitho= utParameters) diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp = b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index ea1729d..a10fb0e 100644 --- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp +++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp @@ -90,6 +90,7 @@ private slots: addRowForFileWithCompiled("literals"); addRowForFileWithCompiled("arrayliterals"); addRowForFileWithCompiled("objectliterals"); + addRowForFileWithCompiled("propertyaccess"); } = void test_compileJavaScriptFile() {