[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [qmlweb/development/qmlweb2] /: [Compiler] Add some missing expressions
From: Jan Marker <jan () jangmarker ! de>
Date: 2015-09-30 20:44:35
Message-ID: E1ZhOEt-0000CB-Ds () scm ! kde ! org
[Download RAW message or body]
Git commit 0945848beca425a9324bbbafd5d3a025c19c7ffb by Jan Marker.
Committed on 30/09/2015 at 20:41.
Pushed by jangmarker into branch 'development/qmlweb2'.
[Compiler] Add some missing expressions
* void, delete, typeof
* unary +,-,!,~
* new
* conditional expression
* nested expression
M +59 -0 src/qmljsc/purejavascriptgenerator.cpp
M +11 -0 src/qmljsc/purejavascriptgenerator.h
M +1 -1 tests/auto/data/javascript/expressions.js
A +1 -0 tests/auto/data/javascript/lefthandexpressions.compiled.js
A +7 -0 tests/auto/data/javascript/lefthandexpressions.js
D +0 -1 tests/auto/data/javascript/propertyaccess.compiled.js
D +0 -3 tests/auto/data/javascript/propertyaccess.js
A +1 -0 tests/auto/data/javascript/unaryoperators.js
M +39 -1 tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M +2 -1 tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
http://commits.kde.org/qmlweb/0945848beca425a9324bbbafd5d3a025c19c7ffb
diff --git a/src/qmljsc/purejavascriptgenerator.cpp \
b/src/qmljsc/purejavascriptgenerator.cpp index ae1fd2e..10708c6 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -230,12 +230,24 @@ void PureJavaScriptGenerator::endVisit(AST::CaseClauses \
*caseClauses) { reduceListStack<AST::CaseClauses>(caseClauses);
}
+void PureJavaScriptGenerator::endVisit(AST::ConditionalExpression *) {
+ const QString secondExpression = m_outputStack.pop();
+ const QString firstExpression = m_outputStack.pop();
+ const QString condition = m_outputStack.pop();
+ m_outputStack << condition + '?' + firstExpression + ':' + secondExpression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::DefaultClause *) {
const QString statement = m_outputStack.pop();
const QString defaultKeyword = m_outputStack.pop();
m_outputStack << defaultKeyword + ':' + statement;
}
+void PureJavaScriptGenerator::endVisit(AST::DeleteExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << "delete " + expression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::ElementList *elementList) {
QString code;
AST::ElementList *currentElement = elementList;
@@ -335,6 +347,27 @@ void PureJavaScriptGenerator::endVisit(AST::LocalForStatement \
*localForStatement
m_outputStack << "for(" + declaration + ';' + condition + ';' + \
incrementExpression + ')' + statement; }
+void PureJavaScriptGenerator::endVisit(AST::NewExpression *) {
+ const QString constructor = m_outputStack.pop();
+ m_outputStack << "new " + constructor;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::NewMemberExpression \
*newMemberExpression) { + const QString arguments = \
(newMemberExpression->arguments)?m_outputStack.pop():""; + const QString \
constructor = m_outputStack.pop(); + m_outputStack << "new " + constructor + '(' + \
arguments + ')'; +}
+
+void PureJavaScriptGenerator::endVisit(AST::NestedExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << '(' + expression + ')';
+}
+
+void PureJavaScriptGenerator::endVisit(AST::NotExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << '!' + expression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::NumericLiteral *) {
}
@@ -406,6 +439,26 @@ void PureJavaScriptGenerator::endVisit(AST::SwitchStatement *) {
m_outputStack << "switch(" + expression + ')' + clauseBlock;
}
+void PureJavaScriptGenerator::endVisit(AST::TildeExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << '~' + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::TypeOfExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << "typeof " + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::UnaryMinusExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << '-' + expression;
+}
+
+void PureJavaScriptGenerator::endVisit(AST::UnaryPlusExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << '+' + expression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::VariableDeclaration *declaration) {
const QString expression = (declaration->expression) ? "="+m_outputStack.pop() : \
""; const QString variableName = declaration->name.toString();
@@ -423,6 +476,12 @@ void PureJavaScriptGenerator::endVisit(AST::VariableStatement *) \
{ m_outputStack << m_outputStack.pop() + ';';
}
+void PureJavaScriptGenerator::endVisit(AST::VoidExpression *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << "void " + expression;
+}
+
+
void PureJavaScriptGenerator::endVisit(AST::WhileStatement *) {
const QString statement = m_outputStack.pop();
const QString expression = m_outputStack.pop();
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.h index 35dfa35..ad4635e 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -57,7 +57,9 @@ public:
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::ConditionalExpression *) override;
virtual void endVisit(QQmlJS::AST::DefaultClause *) override;
+ virtual void endVisit(QQmlJS::AST::DeleteExpression *) override;
virtual void endVisit(QQmlJS::AST::DoWhileStatement *) override;
virtual void endVisit(QQmlJS::AST::ElementList *) override;
virtual void endVisit(QQmlJS::AST::EmptyStatement *) override;
@@ -71,6 +73,10 @@ public:
virtual void endVisit(QQmlJS::AST::IfStatement *) override;
virtual void endVisit(QQmlJS::AST::LocalForEachStatement *) override;
virtual void endVisit(QQmlJS::AST::LocalForStatement *) override;
+ virtual void endVisit(QQmlJS::AST::NewExpression *) override;
+ virtual void endVisit(QQmlJS::AST::NewMemberExpression *) override;
+ virtual void endVisit(QQmlJS::AST::NestedExpression *) override;
+ virtual void endVisit(QQmlJS::AST::NotExpression *) override;
virtual void endVisit(QQmlJS::AST::NumericLiteral *) override;
virtual void endVisit(QQmlJS::AST::ObjectLiteral *) override;
virtual void endVisit(QQmlJS::AST::PostDecrementExpression *) override;
@@ -85,9 +91,14 @@ public:
virtual void endVisit(QQmlJS::AST::StringLiteral *) override;
virtual void endVisit(QQmlJS::AST::StatementList *) override;
virtual void endVisit(QQmlJS::AST::SwitchStatement *) override;
+ virtual void endVisit(QQmlJS::AST::TildeExpression *) override;
+ virtual void endVisit(QQmlJS::AST::TypeOfExpression *) override;
+ virtual void endVisit(QQmlJS::AST::UnaryMinusExpression *) override;
+ virtual void endVisit(QQmlJS::AST::UnaryPlusExpression *) override;
virtual void endVisit(QQmlJS::AST::VariableDeclaration *) override;
virtual void endVisit(QQmlJS::AST::VariableDeclarationList *) override;
virtual void endVisit(QQmlJS::AST::VariableStatement *) override;
+ virtual void endVisit(QQmlJS::AST::VoidExpression *) override;
virtual void endVisit(QQmlJS::AST::WhileStatement *) override;
private:
diff --git a/tests/auto/data/javascript/expressions.js \
b/tests/auto/data/javascript/expressions.js index b97808a..3923c92 100644
--- a/tests/auto/data/javascript/expressions.js
+++ b/tests/auto/data/javascript/expressions.js
@@ -1 +1 @@
-var x;var i;var e=i++;e=++i;e=i--;e=--i;
\ No newline at end of file
+var x;var i;var e=i++;e=++i;e=i--;e=--i;5*(2+3);true?1:2;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/lefthandexpressions.compiled.js \
b/tests/auto/data/javascript/lefthandexpressions.compiled.js new file mode 100644
index 0000000..6a83ce4
--- /dev/null
+++ b/tests/auto/data/javascript/lefthandexpressions.compiled.js
@@ -0,0 +1 @@
+obj.prop;obj["prop"];obj[0];new great();new greater(1);new greater(1,2);new great;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/lefthandexpressions.js \
b/tests/auto/data/javascript/lefthandexpressions.js new file mode 100644
index 0000000..656bd83
--- /dev/null
+++ b/tests/auto/data/javascript/lefthandexpressions.js
@@ -0,0 +1,7 @@
+obj.prop;
+obj["prop"];
+obj[0];
+new great();
+new greater(1);
+new greater(1, 2);
+new great;
\ No newline at end of file
diff --git a/tests/auto/data/javascript/propertyaccess.compiled.js \
b/tests/auto/data/javascript/propertyaccess.compiled.js deleted file mode 100644
index 4a11b7d..0000000
--- a/tests/auto/data/javascript/propertyaccess.compiled.js
+++ /dev/null
@@ -1 +0,0 @@
-obj.prop;obj["prop"];obj[0];
\ No newline at end of file
diff --git a/tests/auto/data/javascript/propertyaccess.js \
b/tests/auto/data/javascript/propertyaccess.js deleted file mode 100644
index 094b1ed..0000000
--- a/tests/auto/data/javascript/propertyaccess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-obj.prop;
-obj["prop"];
-obj[0];
\ No newline at end of file
diff --git a/tests/auto/data/javascript/unaryoperators.js \
b/tests/auto/data/javascript/unaryoperators.js new file mode 100644
index 0000000..26e391a
--- /dev/null
+++ b/tests/auto/data/javascript/unaryoperators.js
@@ -0,0 +1 @@
+delete v;void 4;typeof o;+5;-5;~4;!false;
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index 67573fe..4542e21 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -114,6 +114,7 @@ public:
, m_twoPropertiesPart2(&m_twoProperties, &m_propertyNameAndValue)
, m_objectLiteral(&m_twoProperties)
, m_equalsBinaryExpression(nullptr, QSOperator::Equal, nullptr)
+ , m_nestedExpression(nullptr)
, m_postDecrementExpression(&m_numericalExpressionPi)
, m_postIncrementExpression(&m_numericalExpressionPi)
, m_preDecrementExpression(&m_numericalExpressionPi)
@@ -126,6 +127,17 @@ public:
, m_argumentListTwoArgumentsPart2(&m_argumentListTwoArguments, \
&m_trueLiteral)
, m_callExpressionWithArguments(&m_identifierExpression, \
&m_argumentListTwoArguments)
, m_callExpressionWithoutArguments(&m_identifierExpression, nullptr)
+ , m_newMemberExpressionArguments(&m_identifierExpression, \
&m_argumentListOneArgument) + , \
m_newMemberExpressionNoArguments(&m_identifierExpression, nullptr) + , \
m_newExpression(&m_identifierExpression) + , \
m_tildeExpression(&m_identifierExpression) + , \
m_notExpression(&m_identifierExpression) + , \
m_unaryPlusExpression(&m_identifierExpression) + , \
m_unaryMinusExpression(&m_identifierExpression) + , \
m_deleteExpression(&m_identifierExpression) + , \
m_typeOfExpression(&m_identifierExpression) + , \
m_voidExpression(&m_identifierExpression) + , \
m_conditionalExpression(&m_trueLiteral, &m_numericalExpressionPi, \
&m_numericalExpressionPi) /* Variable Declarations */
, m_constDeclaration1(m_someIdentifierStringRef, nullptr)
, m_constDeclaration2(m_anotherIdentifierStringRef, nullptr)
@@ -252,6 +264,7 @@ private:
AST::ObjectLiteral m_objectLiteral;
AST::BinaryExpression m_equalsBinaryExpression;
+ AST::NestedExpression m_nestedExpression;
AST::PostDecrementExpression m_postDecrementExpression;
AST::PostIncrementExpression m_postIncrementExpression;
@@ -266,6 +279,19 @@ private:
AST::ArgumentList m_argumentListTwoArgumentsPart2;
AST::CallExpression m_callExpressionWithArguments;
AST::CallExpression m_callExpressionWithoutArguments;
+ AST::NewMemberExpression m_newMemberExpressionNoArguments;
+ AST::NewMemberExpression m_newMemberExpressionArguments;
+ AST::NewExpression m_newExpression;
+
+ AST::TildeExpression m_tildeExpression;
+ AST::NotExpression m_notExpression;
+ AST::UnaryPlusExpression m_unaryPlusExpression;
+ AST::UnaryMinusExpression m_unaryMinusExpression;
+ AST::DeleteExpression m_deleteExpression;
+ AST::TypeOfExpression m_typeOfExpression;
+ AST::VoidExpression m_voidExpression;
+
+ AST::ConditionalExpression m_conditionalExpression;
/* Variable Declarations */
AST::VariableDeclaration m_constDeclaration1;
@@ -415,8 +441,10 @@ private slots:
TEST_ENDVISIT_REDUCES(CaseBlock , CasesDefaultCases , \
"{cases;default;cases;}", ({"cases;", "default;", "cases;"}), \
m_caseBlockCasesDefaultCases)
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(ConditionalExpression , AnyCase , "condition?e1:e2" \
, ({"condition", "e1", "e2"}) , m_conditionalExpression)
TEST_ENDVISIT_REDUCES(DefaultClause , AnyCase , \
"default:stm" , ({"default", "stm"}) , m_defaultClause)
- TEST_ENDVISIT_REDUCES(DoWhileStatement , AnyCase , "do \
stm;while(e);", ({"stm;", "e"}) , m_doWhileStatement) + \
TEST_ENDVISIT_REDUCES(DeleteExpression , AnyCase , "delete v" \
, ({"v"}) , m_deleteExpression) + \
TEST_ENDVISIT_REDUCES(DoWhileStatement , AnyCase , "do \
stm;while(e);", ({"stm;", "e"}) , m_doWhileStatement)
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) @@ \
-438,6 +466,11 @@ private slots:
TEST_ENDVISIT_REDUCES(LocalForEachStatement , AnyCase , "for(var i \
in o)stm;", ({"i", "o", "stm;"}) , m_localForEachStatement)
TEST_ENDVISIT_REDUCES(LocalForStatement , AllParts , "for(var \
i;c;++)stm;", ({"var i", "c", "++", "stm;"}), \
m_localForStatementAllParts)
TEST_ENDVISIT_REDUCES(LocalForStatement , NoPart , \
"for(;;)stm;" , ({"stm;"}) , m_localForStatementNoPart) + \
TEST_ENDVISIT_REDUCES(NestedExpression , AnyCase , "(expression)" \
, ({"expression"}) , m_nestedExpression) + \
TEST_ENDVISIT_REDUCES(NewExpression , AnyCase , "new constr" \
, ({"constr"}) , m_newExpression) + \
TEST_ENDVISIT_REDUCES(NewMemberExpression , NoArguments , "new constr()" \
, ({"constr"}) , m_newMemberExpressionNoArguments) + \
TEST_ENDVISIT_REDUCES(NewMemberExpression , Arguments , "new constr(arg)" \
, ({"constr", "arg"}) , m_newMemberExpressionArguments) + \
TEST_ENDVISIT_REDUCES(NotExpression , AnyCase , "!5" \
, ({"5"}) , m_notExpression)
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) @@ -456,12 +489,17 @@ \
private slots:
TEST_ENDVISIT_REDUCES(SourceElements , ThreeStatements , "st1st2st3" \
, ({"st1", "st2", "st3"}) , m_threeStatementsList)
TEST_ENDVISIT_REDUCES(StringLiteral , AnyCase , "another \
string" , ({"another string"}) , m_stringLiteral)
TEST_ENDVISIT_REDUCES(SwitchStatement , AnyCase , \
"switch(e){blk}" , ({"e", "{blk}"}) , m_switchStatement) + \
TEST_ENDVISIT_REDUCES(TildeExpression , AnyCase , "~5" \
, ({"5"}) , m_tildeExpression) + \
TEST_ENDVISIT_REDUCES(TypeOfExpression , AnyCase , "typeof v" \
, ({"v"}) , m_typeOfExpression) + \
TEST_ENDVISIT_REDUCES(UnaryMinusExpression , AnyCase , "-5" \
, ({"5"}) , m_unaryMinusExpression) + \
TEST_ENDVISIT_REDUCES(UnaryPlusExpression , AnyCase , "+5" \
, ({"5"}) , m_unaryPlusExpression)
TEST_ENDVISIT_REDUCES(VariableDeclaration , WithAssignment , "i=5" \
, ({"5"}) , m_variableDeclarationWithAssignment)
TEST_ENDVISIT_REDUCES(VariableDeclaration , WithoutAssignment , "i" \
, ({}) , \
m_variableDeclarationWithoutAssignment)
TEST_ENDVISIT_REDUCES(VariableDeclarationList , TwoDeclarations , "var i,e=5" \
, ({"i", "e=5"}) , m_twoVarDeclarations)
TEST_ENDVISIT_REDUCES(VariableDeclarationList , OneDeclaration , "var e=5" \
, ({"e=5"}) , m_twoVarDeclarationsPart2)
TEST_ENDVISIT_REDUCES(VariableDeclarationList , ConstDeclaration , "const e=5" \
, ({"e=5"}) , m_twoConstDeclarationsPart2)
TEST_ENDVISIT_REDUCES(VariableStatement , AnyCase , "x;" \
, ({"x"}) , m_variableStatement) + \
TEST_ENDVISIT_REDUCES(VoidExpression , AnyCase , "void v" \
, ({"v"}) , m_voidExpression)
TEST_ENDVISIT_REDUCES(WhileStatement , AnyCase , \
"while(e)stm" , ({"e", "stm"}) , m_whileStatement)
TEST_VISIT_BINARYOP_PUTS_ON_STACK(Assign, "=")
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index \
9ec3227..606e556 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -83,6 +83,7 @@ private slots:
addRowForFileWithCompiled("declarations");
addRowForFile("expressions");
addRowForFileWithCompiled("functions");
+ addRowForFile("unaryoperators");
addRowForFileWithCompiled("binaryoperations");
addRowForFileWithCompiled("otherstatements");
addRowForFileWithCompiled("ifstatements");
@@ -90,7 +91,7 @@ private slots:
addRowForFileWithCompiled("literals");
addRowForFileWithCompiled("arrayliterals");
addRowForFileWithCompiled("objectliterals");
- addRowForFileWithCompiled("propertyaccess");
+ addRowForFileWithCompiled("lefthandexpressions");
addRowForFileWithCompiled("functioncalls");
addRowForFileWithCompiled("loops");
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic