[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