[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