[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [qmlweb/development/qmlweb2] /: [Compiler] Implement object literals
From: Jan Marker <jan () jangmarker ! de>
Date: 2015-09-30 20:44:33
Message-ID: E1ZhOEr-0000CB-Im () scm ! kde ! org
[Download RAW message or body]
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/purejavascriptgenerator.cpp index 5c4a399..9066f93 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -134,6 +134,11 @@ bool PureJavaScriptGenerator::visit(AST::IdentifierExpression \
*identifierExpress return true;
}
+bool PureJavaScriptGenerator::visit(AST::IdentifierPropertyName \
*identifierPropertyName) { + 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::IfStatement \
*ifExpression) { void PureJavaScriptGenerator::endVisit(AST::NumericLiteral *) {
}
+void PureJavaScriptGenerator::endVisit(AST::ObjectLiteral *) {
+ const QString properties = m_outputStack.pop();
+ m_outputStack << '{' + properties + '}';
+}
+
void PureJavaScriptGenerator::endVisit(AST::PostDecrementExpression *) {
const QString expression = m_outputStack.pop();
m_outputStack << expression + "--";
@@ -294,6 +304,27 @@ void \
PureJavaScriptGenerator::endVisit(AST::PreIncrementExpression *) { m_outputStack << \
"++" + expression; }
+void PureJavaScriptGenerator::endVisit(AST::PropertyAssignmentList *assignmentList) \
{ + reduceListStack<AST::PropertyAssignmentList>(assignmentList, ",");
+}
+
+void PureJavaScriptGenerator::endVisit(AST::PropertyGetterSetter *getterSetter) {
+ const QString functionBody = \
(getterSetter->functionBody)?m_outputStack.pop():"{}"; + const QString parameters \
= (getterSetter->formals)?m_outputStack.pop():""; + const QString propertyName = \
m_outputStack.pop(); + if (getterSetter->type == \
AST::PropertyGetterSetter::Getter) { + m_outputStack << "get " + propertyName \
+ "()" + functionBody; + } else {
+ m_outputStack << "set " + propertyName + '(' + parameters + ')' + \
functionBody; + }
+}
+
+void PureJavaScriptGenerator::endVisit(AST::PropertyNameAndValue *) {
+ const QString expression = m_outputStack.pop();
+ const QString propertyName = m_outputStack.pop();
+ m_outputStack << propertyName + ':' + expression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::ReturnStatement *returnStatement) {
const QString expression = (returnStatement->expression) ? ' \
'+m_outputStack.pop() : ""; m_outputStack << "return" + expression + ';';
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.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/auto/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/data/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/javascript/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={property1:"value"};x={property1:"value",property2:"value2"};x={property1: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 = {property1: "value"};
+x = {property1: "value", property2: "value2"};
+x = {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_falseLiteral) + , \
m_propertyGetter(&m_identifierPropertyName, &m_functionBody) + , \
m_propertyGetterEmptyBody(&m_identifierPropertyName, nullptr) + , \
m_propertySetter(&m_identifierPropertyName, &m_twoParameters, &m_functionBody) + \
, m_propertySetterEmptyBody(&m_identifierPropertyName, &m_twoParameters, 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 , \
"if(exp)stm;" , ({"exp", "stm;"}) , \
m_ifStatementWithoutElse)
TEST_ENDVISIT_REDUCES(IfStatement , IfElse , \
"if(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 , "prop1,prop2" \
, ({"prop1", "prop2"}) , m_twoProperties) + \
TEST_ENDVISIT_REDUCES(PropertyGetterSetter , Getter , "get i(){body}" \
, ({"i", "{body}"}) , m_propertyGetter) + \
TEST_ENDVISIT_REDUCES(PropertyGetterSetter , GetterEmptyBody , "get i(){}" \
, ({"i"}) , m_propertyGetterEmptyBody) + \
TEST_ENDVISIT_REDUCES(PropertyGetterSetter , Setter , "set \
i(param){body}", ({"i", "param", "{body}"}) , m_propertySetter) + \
TEST_ENDVISIT_REDUCES(PropertyGetterSetter , SetterEmptyBody , "set i(param){}" \
, ({"i", "param"}) , m_propertySetterEmptyBody) + \
TEST_ENDVISIT_REDUCES(PropertyNameAndValue , AnyCase , "prop:expr" \
, ({"prop", "expr"}) , m_propertyNameAndValue)
TEST_ENDVISIT_REDUCES(ReturnStatement , WithoutReturnValue, "return;" \
, ({}) , m_returnStatementWithoutValue)
TEST_ENDVISIT_REDUCES(ReturnStatement , WithReturnValue , "return \
true;" , ({"true"}) , \
m_returnStatementWithValue)
TEST_ENDVISIT_REDUCES(SourceElements , ThreeSrcElements , \
"sEl1sEl2sEl3" , ({"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() {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic