[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