[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [qmlweb/development/qmlweb2] /: [Compiler] Implement some literals
From:       Jan Marker <jan () jangmarker ! de>
Date:       2015-09-30 20:44:33
Message-ID: E1ZhOEr-0000CB-5K () scm ! kde ! org
[Download RAW message or body]

Git commit ea758273fcf672cd758ae0002a365e4ecb2ccccf by Jan Marker.
Committed on 30/09/2015 at 20:41.
Pushed by jangmarker into branch 'development/qmlweb2'.

[Compiler] Implement some literals

* true, false, this,...
* array literals
* includes style corrections

M  +64   -0    src/qmljsc/purejavascriptgenerator.cpp
M  +8    -1    src/qmljsc/purejavascriptgenerator.h
A  +1    -0    tests/auto/data/javascript/literals.compiled.js
A  +12   -0    tests/auto/data/javascript/literals.js
M  +57   -13   tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M  +1    -0    tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp

http://commits.kde.org/qmlweb/ea758273fcf672cd758ae0002a365e4ecb2ccccf

diff --git a/src/qmljsc/purejavascriptgenerator.cpp \
b/src/qmljsc/purejavascriptgenerator.cpp index b5adc31..5c4a399 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -101,6 +101,21 @@ bool PureJavaScriptGenerator::visit(AST::DefaultClause *) {
     return true;
 }
 
+bool PureJavaScriptGenerator::visit(AST::Elision *currentElision) {
+    QString output;
+    while (currentElision) {
+        output += ',';
+        currentElision = currentElision->next;
+    }
+    m_outputStack << output;
+    return true;
+}
+
+bool PureJavaScriptGenerator::visit(AST::FalseLiteral *) {
+    m_outputStack << "false";
+    return true;
+}
+
 bool PureJavaScriptGenerator::visit(AST::FormalParameterList *currentParameter) {
     QString parameterCode;
     while (currentParameter) {
@@ -119,6 +134,11 @@ bool PureJavaScriptGenerator::visit(AST::IdentifierExpression \
*identifierExpress  return true;
 }
 
+bool PureJavaScriptGenerator::visit(AST::NullExpression *) {
+    m_outputStack << "null";
+    return true;
+}
+
 bool PureJavaScriptGenerator::visit(AST::NumericLiteral *numericLiteral) {
     m_outputStack.push(QString::number(numericLiteral->value));
     return true;
@@ -129,6 +149,22 @@ bool PureJavaScriptGenerator::visit(AST::StringLiteral \
*stringLiteral) {  return true;
 }
 
+bool PureJavaScriptGenerator::visit(AST::ThisExpression *) {
+    m_outputStack << "this";
+    return true;
+}
+
+bool PureJavaScriptGenerator::visit(AST::TrueLiteral *) {
+    m_outputStack << "true";
+    return true;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::ArrayLiteral *arrayLiteral) {
+    const QString elision = (arrayLiteral->elision)?m_outputStack.pop():"";
+    const QString elements = (arrayLiteral->elements)?m_outputStack.pop():"";
+    m_outputStack << '[' + elements + elision + ']';
+}
+
 void PureJavaScriptGenerator::endVisit(AST::BinaryExpression *) {
     const QString rightOperand = m_outputStack.pop();
     const QString leftOperand = m_outputStack.pop();
@@ -172,6 +208,34 @@ void PureJavaScriptGenerator::endVisit(AST::DefaultClause *) {
     m_outputStack << defaultKeyword + ':' + statement;
 }
 
+void PureJavaScriptGenerator::endVisit(AST::ElementList *elementList) {
+    QString code;
+    AST::ElementList *currentElement = elementList;
+    QStack<QString>::iterator positionOnStack = m_outputStack.end();
+
+    for (currentElement = elementList; currentElement; currentElement = \
currentElement->next) { +        if (currentElement->elision) {
+            --positionOnStack;
+        }
+        if (currentElement->expression) {
+            --positionOnStack;
+        }
+    }
+
+    for (currentElement = elementList; currentElement; currentElement = \
currentElement->next) { +        if (currentElement->elision) {
+            code += *positionOnStack;
+            positionOnStack = m_outputStack.erase(positionOnStack);
+        }
+        if (currentElement->expression) {
+            code += *positionOnStack + ',';
+            positionOnStack = m_outputStack.erase(positionOnStack);
+        }
+    }
+
+    m_outputStack << code;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::EmptyStatement *) {
     m_outputStack << ";";
 }
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.h index 45b6088..f1374d5 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -37,17 +37,24 @@ public:
     virtual bool visit(QQmlJS::AST::CaseClause *) override;
     virtual bool visit(QQmlJS::AST::ContinueStatement *) override;
     virtual bool visit(QQmlJS::AST::DefaultClause *) override;
+    virtual bool visit(QQmlJS::AST::Elision *) override;
+    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::NullExpression *) override;
     virtual bool visit(QQmlJS::AST::NumericLiteral *) override;
     virtual bool visit(QQmlJS::AST::StringLiteral *) override;
-
+    virtual bool visit(QQmlJS::AST::ThisExpression *) override;
+    virtual bool visit(QQmlJS::AST::TrueLiteral *) override;
+    
+    virtual void endVisit(QQmlJS::AST::ArrayLiteral *) override;
     virtual void endVisit(QQmlJS::AST::BinaryExpression *) override;
     virtual void endVisit(QQmlJS::AST::Block *) override;
     virtual void endVisit(QQmlJS::AST::CaseBlock *) override;
     virtual void endVisit(QQmlJS::AST::CaseClause *) override;
     virtual void endVisit(QQmlJS::AST::CaseClauses *) override;
     virtual void endVisit(QQmlJS::AST::DefaultClause *) override;
+    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::FunctionBody *) override;
diff --git a/tests/auto/data/javascript/literals.compiled.js \
b/tests/auto/data/javascript/literals.compiled.js new file mode 100644
index 0000000..bcb5ddd
--- /dev/null
+++ b/tests/auto/data/javascript/literals.compiled.js
@@ -0,0 +1 @@
+this;null;identifier;true;false;4.1;"string";[];[1,2,];[,,,5,];[5,,,5,];[5,];
\ No newline at end of file
diff --git a/tests/auto/data/javascript/literals.js \
b/tests/auto/data/javascript/literals.js new file mode 100644
index 0000000..7f07a67
--- /dev/null
+++ b/tests/auto/data/javascript/literals.js
@@ -0,0 +1,12 @@
+this;
+null;
+identifier;
+true;
+false;
+4.1;
+"string";
+[];
+[1, 2,];
+[,,,5,];
+[5,,,5,];
+[5];
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index c24e419..9282edc 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -58,7 +58,7 @@
             }
 
 #define TEST_ENDVISIT_REDUCES(className, scenarioName, expectedTopOfStack, \
                stackContent, instance) \
-            void test_endVisit_ ## className ## scenarioName ## _reducesStack() { \
+            void test_endVisit_ ## className ## _ ## scenarioName ## _reducesStack() \
                { \
                 asPureJSGen(m_generator)->m_outputStack.append(QVector<QString>stackContent); \
\  m_generator->endVisit(&instance); \
                 QCOMPARE(asPureJSGen(m_generator)->m_outputStack.top(), \
QStringLiteral(expectedTopOfStack)); \ @@ -84,11 +84,24 @@ public:
         , m_anotherIdentifier("e")
         , m_anotherIdentifierStringRef(&m_anotherIdentifier)
         /* Expressions */
+        , m_thisExpression()
+        , m_nullExpression()
         , m_identifierExpression(m_someIdentifierStringRef)
+        , m_trueLiteral()
+        , m_falseLiteral()
         , m_numericalExpressionPi(3.14)
         , m_stringLiteral(m_someStringStringRef)
-        , m_trueExpression()
-        , m_falseExpression()
+        , m_twoElisions()
+        , m_elisionsPart2(&m_twoElisions)
+        , m_arrayElementsExp(nullptr, &m_trueLiteral)
+        , m_arrayElementsExpExp(nullptr, &m_trueLiteral)
+        , m_arrayElementsExpExpPart2(&m_arrayElementsExpExp, nullptr, \
&m_falseLiteral) +        , m_arrayElementsElisionExp(&m_twoElisions, \
&m_falseLiteral) +        , m_arrayElementsExpElisionExp(nullptr, &m_falseLiteral)
+        , m_arrayLiteralWithElision(&m_arrayElementsExp, &m_twoElisions)
+        , m_arrayLiteralWithoutElision(&m_arrayElementsExp)
+        , m_arrayLiteralOnlyElision(&m_twoElisions)
+        , m_arrayElementsExpElisionExpPart2(&m_arrayElementsExpElisionExp, \
&m_twoElisions, &m_trueLiteral)  , m_equalsBinaryExpression(nullptr, \
QSOperator::Equal, nullptr)  , m_postDecrementExpression(&m_numericalExpressionPi)
         , m_postIncrementExpression(&m_numericalExpressionPi)
@@ -98,7 +111,7 @@ public:
         /* Variable Declarations */
         , m_constDeclaration1(m_someIdentifierStringRef, nullptr)
         , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr)
-        , m_variableDeclarationWithAssignment(m_someIdentifierStringRef, \
&m_trueExpression) +        , \
                m_variableDeclarationWithAssignment(m_someIdentifierStringRef, \
                &m_trueLiteral)
         , m_variableDeclarationWithoutAssignment(m_someIdentifierStringRef, nullptr)
         , m_twoConstDeclarations(&m_constDeclaration1)
         , m_twoConstDeclarationsPart2(&m_twoConstDeclarations, &m_constDeclaration2)
@@ -114,10 +127,10 @@ public:
         , m_statement2()
         , m_statement3()
         , m_expressionStatement(nullptr)
-        , m_ifStatementWithoutElse(&m_trueExpression, &m_statement1)
-        , m_ifStatementWithElse(&m_trueExpression, &m_statement1, &m_statement2)
+        , m_ifStatementWithoutElse(&m_trueLiteral, &m_statement1)
+        , m_ifStatementWithElse(&m_trueLiteral, &m_statement1, &m_statement2)
         , m_returnStatementWithoutValue(nullptr)
-        , m_returnStatementWithValue(&m_trueExpression)
+        , m_returnStatementWithValue(&m_trueLiteral)
         , m_variableStatement(&m_twoVarDeclarations)
         , m_threeStatementsList(&m_statement1)
         , m_statementListPart2(&m_threeStatementsList, &m_statement2)
@@ -136,8 +149,8 @@ public:
         , m_functionDeclarationWithParameters(m_someIdentifierStringRef, \
                &m_twoParameters , &m_functionBody)
         , m_functionDeclarationWithoutBody(m_someIdentifierStringRef, \
&m_twoParameters, nullptr)  /* Switch */
-        , m_caseClause1(&m_trueExpression, &m_threeStatementsList)
-        , m_caseClause2(&m_trueExpression, &m_threeStatementsList)
+        , m_caseClause1(&m_trueLiteral, &m_threeStatementsList)
+        , m_caseClause2(&m_trueLiteral, &m_threeStatementsList)
         , m_twoCaseClauses(&m_caseClause1)
         , m_twoCaseClausesPart2(&m_twoCaseClauses, &m_caseClause2)
         , m_defaultClause(&m_threeStatementsList)
@@ -145,9 +158,14 @@ public:
         , m_caseBlockOnlyCases(&m_twoCaseClauses)
         , m_caseBlockCasesAndDefault(&m_twoCaseClauses, &m_defaultClause)
         , m_caseBlockCasesDefaultCases(&m_twoCaseClauses, &m_defaultClause, \
                &m_twoCaseClauses)
-        , m_caseClause(&m_trueExpression, &m_threeStatementsList)
-        , m_switchStatement(&m_trueExpression, &m_caseBlock)
+        , m_caseClause(&m_trueLiteral, &m_threeStatementsList)
+        , m_switchStatement(&m_trueLiteral, &m_caseBlock)
     {
+        m_elisionsPart2.finish();
+        m_arrayElementsExp.finish();
+        m_arrayElementsExpExpPart2.finish();
+        m_arrayElementsElisionExp.finish();
+        m_arrayElementsExpElisionExpPart2.finish();
         m_statementListPart3.finish();
         m_sourceElementsListPart3.finish();
         m_parameterListPart2.finish();
@@ -172,11 +190,25 @@ private:
     const QStringRef m_anotherIdentifierStringRef;
 
     /* Expressions */
+    AST::ThisExpression m_thisExpression;
+    AST::NullExpression m_nullExpression;
     AST::IdentifierExpression m_identifierExpression;
+    AST::TrueLiteral m_trueLiteral;
+    AST::FalseLiteral m_falseLiteral;
     AST::NumericLiteral m_numericalExpressionPi;
     AST::StringLiteral m_stringLiteral;
-    AST::TrueLiteral m_trueExpression;
-    AST::FalseLiteral m_falseExpression;
+
+    AST::Elision m_twoElisions;
+    AST::Elision m_elisionsPart2;
+    AST::ElementList m_arrayElementsExp;
+    AST::ElementList m_arrayElementsExpExp;
+    AST::ElementList m_arrayElementsExpExpPart2;
+    AST::ElementList m_arrayElementsElisionExp;
+    AST::ElementList m_arrayElementsExpElisionExp;
+    AST::ElementList m_arrayElementsExpElisionExpPart2;
+    AST::ArrayLiteral m_arrayLiteralWithElision;
+    AST::ArrayLiteral m_arrayLiteralWithoutElision;
+    AST::ArrayLiteral m_arrayLiteralOnlyElision;
 
     AST::BinaryExpression m_equalsBinaryExpression;
 
@@ -280,14 +312,17 @@ private slots:
     TEST_VISIT_PUTS_ON_STACK(DefaultClause          , Default           , "default"  \
                , m_defaultClause)
     TEST_VISIT_PUTS_ON_STACK(ContinueStatement      , WithLabel         , "continue \
                ALabel;", m_continueStatementWithLabel)
     TEST_VISIT_PUTS_ON_STACK(ContinueStatement      , WithoutLabel      , \
"continue;"       , m_continueStatementWithoutLabel) +    \
TEST_VISIT_PUTS_ON_STACK(Elision                , AnyCase           , ",,"            \
                , m_twoElisions)
     TEST_VISIT_DEFAULT_IMPL_(EmptyStatement                                          \
                , m_emptyStatement)
     TEST_VISIT_DEFAULT_IMPL_(ExpressionStatement                                     \
                , m_expressionStatement)
     TEST_VISIT_PUTS_ON_STACK(FormalParameterList    , OneParameter      , "e"        \
                , m_parameterListPart2)
     TEST_VISIT_PUTS_ON_STACK(FormalParameterList    , TwoParameters     , "i,e"      \
, m_twoParameters) +    TEST_VISIT_PUTS_ON_STACK(FalseLiteral           , AnyCase     \
                , "false"           , m_falseLiteral)
     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_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)
     TEST_VISIT_DEFAULT_IMPL_(PostDecrementExpression                                 \
                , m_postDecrementExpression)
     TEST_VISIT_DEFAULT_IMPL_(PostIncrementExpression                                 \
, m_postIncrementExpression) @@ -298,10 +333,15 @@ private slots:
     TEST_VISIT_DEFAULT_IMPL_(StatementList                                           \
                , m_threeStatementsList)
     TEST_VISIT_PUTS_ON_STACK(StringLiteral          , AnyCase           , "\"some \
                string\"" , m_stringLiteral)
     TEST_VISIT_DEFAULT_IMPL_(SwitchStatement                                         \
, m_switchStatement) +    TEST_VISIT_PUTS_ON_STACK(ThisExpression         , AnyCase   \
, "this"            , m_thisExpression) +    TEST_VISIT_PUTS_ON_STACK(TrueLiteral     \
                , AnyCase           , "true"            , m_trueLiteral)
     TEST_VISIT_DEFAULT_IMPL_(VariableDeclaration                                     \
                , m_variableDeclarationWithoutAssignment)
     TEST_VISIT_DEFAULT_IMPL_(VariableDeclarationList                                 \
                , m_twoConstDeclarations)
     TEST_VISIT_DEFAULT_IMPL_(VariableStatement                                       \
, m_variableStatement)  
+    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(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) @@ -310,6 +350,10 @@ private \
                slots:
     TEST_ENDVISIT_REDUCES(CaseClause              , CaseWithStatement , "case \
                exp:stm;"   , ({"case", "exp", "stm;"})    , m_caseClause)
     TEST_ENDVISIT_REDUCES(CaseClauses             , TwoClauses        , "case \
                e:s;case e2:s2;", ({"case e:s;", "case e2:s2;"}), m_twoCaseClauses)
     TEST_ENDVISIT_REDUCES(DefaultClause           , AnyCase           , \
"default:stm"     , ({"default", "stm"})         , m_defaultClause) +    \
TEST_ENDVISIT_REDUCES(ElementList             , Expression        , "expr,"           \
, ({"expr"})                   , m_arrayElementsExp) +    \
TEST_ENDVISIT_REDUCES(ElementList             , TwoExpressions    , "expr,expr,"      \
, ({"expr", "expr"})           , m_arrayElementsExpExp) +    \
TEST_ENDVISIT_REDUCES(ElementList             , ElisionExpression , "elisionexpr,"    \
, ({"elision", "expr"})        , m_arrayElementsElisionExp) +    \
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(FormalParameterList     , AnyCase           , "i"          \
                , ({"i"})                      , m_twoParameters) // does nothing
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index \
                0a9a000..ba68e96 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -87,6 +87,7 @@ private slots:
         addRowForFileWithCompiled("otherstatements");
         addRowForFileWithCompiled("ifstatements");
         addRowForFileWithCompiled("switchstatements");
+        addRowForFileWithCompiled("literals");
     }
 
     void test_compileJavaScriptFile() {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic