[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [qmlweb/development/qmlweb2] /: [Compiler] Add array and object member access
From: Jan Marker <jan () jangmarker ! de>
Date: 2015-09-30 20:44:34
Message-ID: E1ZhOEs-0000CB-15 () scm ! kde ! org
[Download RAW message or body]
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/purejavascriptgenerator.cpp index 9066f93..fc15853 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -170,6 +170,12 @@ void PureJavaScriptGenerator::endVisit(AST::ArrayLiteral \
*arrayLiteral) { m_outputStack << '[' + elements + elision + ']';
}
+void PureJavaScriptGenerator::endVisit(AST::ArrayMemberExpression *) {
+ const QString keyExpression = m_outputStack.pop();
+ const QString arrayExpression = m_outputStack.pop();
+ m_outputStack << arrayExpression + '[' + keyExpression + ']';
+}
+
void PureJavaScriptGenerator::endVisit(AST::BinaryExpression *) {
const QString rightOperand = m_outputStack.pop();
const QString leftOperand = m_outputStack.pop();
@@ -249,6 +255,12 @@ void PureJavaScriptGenerator::endVisit(AST::ExpressionStatement \
*) { m_outputStack << m_outputStack.pop() + ';';
}
+void PureJavaScriptGenerator::endVisit(AST::FieldMemberExpression \
*fieldMemberExpression) { + const QString objectExpression = m_outputStack.pop();
+ const QString memberName = fieldMemberExpression->name.toString();
+ m_outputStack << objectExpression + '.' + memberName;
+}
+
void PureJavaScriptGenerator::endVisit(AST::FunctionBody *) {
const QString body = m_outputStack.pop();
m_outputStack << '{' + body + '}';
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.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_propertyIdentifierStringRef) + , 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_arrayLiteralWithoutElision) + \
TEST_ENDVISIT_REDUCES(ArrayMemberExpression , AnyCase , "i[2]" \
, ({"i", "2"}) , m_arrayMemberExpression)
TEST_ENDVISIT_REDUCES(BinaryExpression , TwoOperands , "2==4" \
, ({"==", "2", "4"}) , m_equalsBinaryExpression)
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 , \
"expr,eliexpr," , ({"expr", "eli", "expr"}) , \
m_arrayElementsExpElisionExp)
TEST_ENDVISIT_REDUCES(EmptyStatement , DefaultScenario , ";" \
, ({}) , m_emptyStatement)
TEST_ENDVISIT_REDUCES(ExpressionStatement , AnyCase , \
"expression;" , ({"expression"}) , m_expressionStatement) + \
TEST_ENDVISIT_REDUCES(FieldMemberExpression , AnyCase , "obj.property" \
, ({"obj"}) , m_fieldMemberExpression)
TEST_ENDVISIT_REDUCES(FormalParameterList , AnyCase , "i" \
, ({"i"}) , m_twoParameters) // does nothing
TEST_ENDVISIT_REDUCES(FunctionBody , ClosesCorrectly , "{func}" \
, ({"func"}) , m_functionBody)
TEST_ENDVISIT_REDUCES(FunctionDeclaration , BodyNoParameters , "function \
i(){body}" , ({"{body}"}) , \
m_functionDeclarationWithoutParameters)
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() {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic