Repository: flex-falcon
Updated Branches:
  refs/heads/develop 1fb6f371f -> 22fa6defa


XML support for assignment and for loops


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/22fa6def
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/22fa6def
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/22fa6def

Branch: refs/heads/develop
Commit: 22fa6defa3ed2896de4eba1a5a1b316e1e3c2b0f
Parents: 1fb6f37
Author: Alex Harui <[email protected]>
Authored: Wed Nov 18 23:02:05 2015 -0800
Committer: Alex Harui <[email protected]>
Committed: Wed Nov 18 23:02:05 2015 -0800

----------------------------------------------------------------------
 .../js/flexjs/TestFlexJSGlobalClasses.java      | 42 ++++++++++++++++++++
 .../flex/compiler/internal/test/ASTestBase.java |  6 +++
 .../codegen/js/flexjs/JSFlexJSEmitter.java      | 19 +++++++++
 .../codegen/js/jx/BinaryOperatorEmitter.java    | 36 +++++++++++++++++
 .../internal/codegen/js/jx/ForEachEmitter.java  | 41 ++++++++++++++++---
 5 files changed, 139 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/22fa6def/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
 
b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index c837390..322ee63 100644
--- 
a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ 
b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -23,6 +23,8 @@ import org.apache.flex.compiler.driver.IBackend;
 import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogGlobalClasses;
 import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
 import org.apache.flex.compiler.tree.as.IASNode;
+import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
@@ -341,6 +343,46 @@ public class TestFlexJSGlobalClasses extends 
TestGoogGlobalClasses
         assertOut("var /** @type {XMLList} */ b = 
a.descendants('grandchild').filter(function(node){return 
(node.attribute('attr2') == 'fish')})");
     }
     
+    @Test
+    public void testXMLSetChild()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");a.foo = a.child");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("a.setChild('foo', a.child('child'))");
+    }
+    
+    @Test
+    public void testXMLListConcat()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");a.foo += a.child");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("a.child('foo').concat(a.child('child'))");
+    }
+    
+    @Test
+    public void testXMLListAddAndAssign()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");a.foo = a.child + 
a..grandchild");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("a.setChild('foo', 
a.child('child').copy().concat(a.descendants('grandchild')))");
+    }
+    
+    @Test
+    public void testXMLForLoop()
+    {
+        IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");for (var p:* in a) delete 
a[p];");
+        asBlockWalker.visitForLoop(node);
+        assertOut("for (var /** @type {*} */ p in a.elementNames())\n  
a.removeChild(p);");
+    }
+    
+    @Test
+    public void testXMLForEachLoop()
+    {
+       IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top 
attr1='cat'><child attr2='dog'><grandchild 
attr3='fish'>text</grandchild></child></top>\");for each (var p:XMLList in a) 
var i:int = p.length();");
+        asBlockWalker.visitForLoop(node);
+        assertOut("for (var foreachiter0 in a.elementNames()) \n{\nvar p = 
a.child(foreachiter0);\n\n  var /** @type {number} */ i = p.length();}\n");
+    }
+    
     @Ignore
     public void testNamespaceNoArg()
     {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/22fa6def/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/ASTestBase.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/ASTestBase.java 
b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/ASTestBase.java
index 8da5a9a..8cb7b11 100644
--- 
a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/ASTestBase.java
+++ 
b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/ASTestBase.java
@@ -29,6 +29,7 @@ import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IDynamicAccessNode;
 import org.apache.flex.compiler.tree.as.IExpressionNode;
 import org.apache.flex.compiler.tree.as.IFileNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IInterfaceNode;
 import org.apache.flex.compiler.tree.as.INamespaceAccessExpressionNode;
@@ -152,6 +153,11 @@ public class ASTestBase extends TestBase
         return (IBinaryOperatorNode) getNode(code, IBinaryOperatorNode.class);
     }
 
+    protected IForLoopNode getForLoopNode(String code)
+    {
+        return (IForLoopNode) getNode(code, IForLoopNode.class);
+    }
+
     protected INamespaceAccessExpressionNode getNamespaceAccessExpressionNode(
             String code)
     {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/22fa6def/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index c87cadc..f0431af 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -486,6 +486,25 @@ public class JSFlexJSEmitter extends JSGoogEmitter 
implements IJSFlexJSEmitter
                                return;
                                }
                        }
+                       else if (node.getChild(0).getChild(0).getNodeID() == 
ASTNodeID.IdentifierID)
+                       {
+                               if 
(isXML((IdentifierNode)(node.getChild(0).getChild(0))))
+                               {
+                               if (ASNodeUtils.hasParenOpen(node))
+                                   write(ASEmitterTokens.PAREN_OPEN);
+                               
+                           getWalker().walk(node.getChild(0).getChild(0));
+                           DynamicAccessNode dan = 
(DynamicAccessNode)(node.getChild(0));
+                           IASNode indexNode = dan.getChild(1);
+                           write(".removeChild(");
+                           getWalker().walk(indexNode);
+                           write(")");
+                               if (ASNodeUtils.hasParenClose(node))
+                                   write(ASEmitterTokens.PAREN_CLOSE);
+                               return;                                 
+                               }
+                       }
+
                }
                else if (node.getChild(0).getNodeID() == 
ASTNodeID.MemberAccessExpressionID)
                {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/22fa6def/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 4a7d1e7..38935e2 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -28,6 +28,7 @@ import 
org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
 import 
org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -142,6 +143,36 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                         return;
                     }
                 }
+                else if 
(((JSFlexJSEmitter)getEmitter()).isXMLList((MemberAccessExpressionNode)leftSide))
+                {
+                       MemberAccessExpressionNode xmlNode = 
(MemberAccessExpressionNode)leftSide;
+                       if (node.getNodeID() == ASTNodeID.Op_AssignId)
+                       {
+                           getWalker().walk(xmlNode.getLeftOperandNode());
+                           write(".setChild('");
+                           getWalker().walk(xmlNode.getRightOperandNode());
+                           write("', ");
+                           getWalker().walk(node.getRightOperandNode());
+                           write(ASEmitterTokens.PAREN_CLOSE);
+                           return;
+                       }
+                       else if (node.getNodeID() == ASTNodeID.Op_AddAssignID)
+                       {
+                           getWalker().walk(xmlNode);
+                           write(".concat(");
+                           getWalker().walk(node.getRightOperandNode());
+                           write(ASEmitterTokens.PAREN_CLOSE);
+                           return;
+                       }
+                       else if (node.getNodeID() == ASTNodeID.Op_AddID)
+                       {
+                           getWalker().walk(xmlNode);
+                           write(".copy().concat(");
+                           getWalker().walk(node.getRightOperandNode());
+                           write(ASEmitterTokens.PAREN_CLOSE);
+                           return;
+                       }
+                }
             }
 
             super_emitBinaryOperator(node);
@@ -278,6 +309,11 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                }
                else */
                        getWalker().walk(node.getRightOperandNode());
+                if (node.getNodeID() == ASTNodeID.Op_InID &&
+                        
((JSFlexJSEmitter)getEmitter()).isXML(node.getRightOperandNode()))
+                {
+                       write(".elementNames()");
+                }   
         }
 
         if (ASNodeUtils.hasParenOpen(node))

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/22fa6def/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
index 1b33061..cf151b5 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
@@ -23,6 +23,10 @@ import org.apache.flex.compiler.codegen.ISubEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter;
+import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
+import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
+import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
+import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IForLoopNode;
@@ -58,7 +62,25 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.IN);
         write(ASEmitterTokens.SPACE);
-        getWalker().walk(bnode.getChild(1));
+        IASNode obj = bnode.getChild(1);
+        getWalker().walk(obj);
+        boolean isXML = false;
+        if (obj.getNodeID() == ASTNodeID.IdentifierID)
+        {
+               if (((JSFlexJSEmitter)getEmitter()).isXML((IdentifierNode)obj))
+               {
+                       write(".elementNames()");
+                       isXML = true;
+               }
+        }
+        else if (obj.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+        {
+            if 
(((JSFlexJSEmitter)getEmitter()).isXMLList((MemberAccessExpressionNode)obj))
+            {
+                write(".elementNames()");
+                isXML = true;
+            }
+        }
         writeToken(ASEmitterTokens.PAREN_CLOSE);
         writeNewline();
         write(ASEmitterTokens.BLOCK_OPEN);
@@ -74,10 +96,19 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.EQUAL);
         write(ASEmitterTokens.SPACE);
-        getWalker().walk(bnode.getChild(1));
-        write(ASEmitterTokens.SQUARE_OPEN);
-        write(iterName);
-        write(ASEmitterTokens.SQUARE_CLOSE);
+        getWalker().walk(obj);
+        if (isXML)
+        {
+               write(".child(");
+               write(iterName);
+               write(")");
+        }
+        else
+        {
+               write(ASEmitterTokens.SQUARE_OPEN);
+               write(iterName);
+               write(ASEmitterTokens.SQUARE_CLOSE);
+        }
         write(ASEmitterTokens.SEMICOLON);
         writeNewline();
         getWalker().walk(node.getStatementContentsNode());

Reply via email to