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

List:       kde-commits
Subject:    [qmlweb/development/qmlweb2] /: [Compiler] Add array and object member access
From:       Jan Marker <jan () jangmarker ! de>
Date:       2015-09-30 20:44:34
Message-ID: E1ZhOEs-0000CB-15 () scm ! kde ! org
[Download RAW message or body]

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

[Compiler] Add array and object member access

M  +12   -0    src/qmljsc/purejavascriptgenerator.cpp
M  +2    -0    src/qmljsc/purejavascriptgenerator.h
A  +1    -0    tests/auto/data/javascript/propertyaccess.compiled.js
A  +3    -0    tests/auto/data/javascript/propertyaccess.js
M  +11   -0    tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M  +1    -0    tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp

http://commits.kde.org/qmlweb/6e4b81f27b57f5166efa7841ae6184da82495168

diff --git a/src/qmljsc/purejavascriptgenerator.cpp \
b/src/qmljsc/purejavascriptgenerator.cpp index 9066f93..fc15853 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -170,6 +170,12 @@ void PureJavaScriptGenerator::endVisit(AST::ArrayLiteral \
*arrayLiteral) {  m_outputStack << '[' + elements + elision + ']';
 }
 
+void PureJavaScriptGenerator::endVisit(AST::ArrayMemberExpression *) {
+    const QString keyExpression = m_outputStack.pop();
+    const QString arrayExpression = m_outputStack.pop();
+    m_outputStack << arrayExpression + '[' + keyExpression + ']';
+}
+
 void PureJavaScriptGenerator::endVisit(AST::BinaryExpression *) {
     const QString rightOperand = m_outputStack.pop();
     const QString leftOperand = m_outputStack.pop();
@@ -249,6 +255,12 @@ void PureJavaScriptGenerator::endVisit(AST::ExpressionStatement \
*) {  m_outputStack << m_outputStack.pop() + ';';
 }
 
+void PureJavaScriptGenerator::endVisit(AST::FieldMemberExpression \
*fieldMemberExpression) { +    const QString objectExpression = m_outputStack.pop();
+    const QString memberName = fieldMemberExpression->name.toString();
+    m_outputStack << objectExpression + '.' + memberName;
+}
+
 void PureJavaScriptGenerator::endVisit(AST::FunctionBody *) {
     const QString body = m_outputStack.pop();
     m_outputStack << '{' + body + '}';
diff --git a/src/qmljsc/purejavascriptgenerator.h \
b/src/qmljsc/purejavascriptgenerator.h index 415bf62..ea0187f 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -49,6 +49,7 @@ public:
     virtual bool visit(QQmlJS::AST::TrueLiteral *) override;
     
     virtual void endVisit(QQmlJS::AST::ArrayLiteral *) override;
+    virtual void endVisit(QQmlJS::AST::ArrayMemberExpression *) override;
     virtual void endVisit(QQmlJS::AST::BinaryExpression *) override;
     virtual void endVisit(QQmlJS::AST::Block *) override;
     virtual void endVisit(QQmlJS::AST::CaseBlock *) override;
@@ -58,6 +59,7 @@ public:
     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::FieldMemberExpression *) override;
     virtual void endVisit(QQmlJS::AST::FunctionBody *) override;
     virtual void endVisit(QQmlJS::AST::FunctionDeclaration *) override;
     virtual void endVisit(QQmlJS::AST::IdentifierExpression *) override;
diff --git a/tests/auto/data/javascript/propertyaccess.compiled.js \
b/tests/auto/data/javascript/propertyaccess.compiled.js new file mode 100644
index 0000000..4a11b7d
--- /dev/null
+++ b/tests/auto/data/javascript/propertyaccess.compiled.js
@@ -0,0 +1 @@
+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 new file mode 100644
index 0000000..094b1ed
--- /dev/null
+++ b/tests/auto/data/javascript/propertyaccess.js
@@ -0,0 +1,3 @@
+obj.prop;
+obj["prop"];
+obj[0];
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index 9ba9676..ed21e3d 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -83,6 +83,8 @@ public:
         , m_someIdentifierStringRef(&m_someIdentifier)
         , m_anotherIdentifier("e")
         , m_anotherIdentifierStringRef(&m_anotherIdentifier)
+        , m_propertyIdentifier("property")
+        , m_propertyIdentifierStringRef(&m_propertyIdentifier)
         /* Expressions */
         , m_thisExpression()
         , m_nullExpression()
@@ -117,6 +119,8 @@ public:
         , m_preDecrementExpression(&m_numericalExpressionPi)
         , m_preIncrementExpression(&m_numericalExpressionPi)
         , m_block(nullptr)
+        , m_fieldMemberExpression(&m_identifierExpression, \
m_propertyIdentifierStringRef) +        , m_arrayMemberExpression(nullptr, nullptr)
         /* Variable Declarations */
         , m_constDeclaration1(m_someIdentifierStringRef, nullptr)
         , m_constDeclaration2(m_anotherIdentifierStringRef, nullptr)
@@ -198,6 +202,8 @@ private:
     const QStringRef m_someIdentifierStringRef;
     const QString m_anotherIdentifier;
     const QStringRef m_anotherIdentifierStringRef;
+    const QString m_propertyIdentifier;
+    const QStringRef m_propertyIdentifierStringRef;
 
     /* Expressions */
     AST::ThisExpression m_thisExpression;
@@ -237,6 +243,9 @@ private:
     AST::PreDecrementExpression m_preDecrementExpression;
     AST::PreIncrementExpression m_preIncrementExpression;
 
+    AST::FieldMemberExpression m_fieldMemberExpression;
+    AST::ArrayMemberExpression m_arrayMemberExpression;
+
     /* Variable Declarations */
     AST::VariableDeclaration m_constDeclaration1;
     AST::VariableDeclaration m_constDeclaration2;
@@ -363,6 +372,7 @@ private slots:
     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(ArrayMemberExpression   , AnyCase           , "i[2]"            \
                , ({"i", "2"})                 , m_arrayMemberExpression)
     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) @@ -377,6 +387,7 @@ private \
                slots:
     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(FieldMemberExpression   , AnyCase           , "obj.property"    \
                , ({"obj"})                    , m_fieldMemberExpression)
     TEST_ENDVISIT_REDUCES(FormalParameterList     , AnyCase           , "i"          \
                , ({"i"})                      , m_twoParameters) // does nothing
     TEST_ENDVISIT_REDUCES(FunctionBody            , ClosesCorrectly   , "{func}"     \
                , ({"func"})                   , m_functionBody)
     TEST_ENDVISIT_REDUCES(FunctionDeclaration     , BodyNoParameters  , "function \
                i(){body}"    , ({"{body}"})           , \
                m_functionDeclarationWithoutParameters)
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index \
                ea1729d..a10fb0e 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -90,6 +90,7 @@ private slots:
         addRowForFileWithCompiled("literals");
         addRowForFileWithCompiled("arrayliterals");
         addRowForFileWithCompiled("objectliterals");
+        addRowForFileWithCompiled("propertyaccess");
     }
 
     void test_compileJavaScriptFile() {


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

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