You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jo...@apache.org on 2016/04/29 20:13:48 UTC

[5/6] git commit: [flex-falcon] [refs/heads/develop] - source maps for for-each loops

source maps for for-each 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/a6b4152e
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/a6b4152e
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/a6b4152e

Branch: refs/heads/develop
Commit: a6b4152e6e79bba2a08a7316c08ab5cd569fcf86
Parents: 031e70d
Author: Josh Tynjala <jo...@gmail.com>
Authored: Fri Apr 29 11:05:51 2016 -0700
Committer: Josh Tynjala <jo...@gmail.com>
Committed: Fri Apr 29 11:05:51 2016 -0700

----------------------------------------------------------------------
 .../internal/codegen/js/jx/ForEachEmitter.java  | 28 ++++++-
 .../js/sourcemaps/TestSourceMapStatements.java  | 83 ++++++++++++++++++++
 2 files changed, 108 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/a6b4152e/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
index 501f5ae..78d0b40 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
@@ -30,6 +30,8 @@ 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.IContainerNode;
+import org.apache.flex.compiler.tree.as.IExpressionNode;
 import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IIdentifierNode;
 import org.apache.flex.compiler.tree.as.IVariableExpressionNode;
@@ -47,23 +49,28 @@ public class ForEachEmitter extends JSSubEmitter implements
     @Override
     public void emit(IForLoopNode node)
     {
-        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
-                .getConditionalsContainerNode().getChild(0);
-        IASNode childNode = bnode.getChild(0);
+        IContainerNode cnode = node.getConditionalsContainerNode();
+        IBinaryOperatorNode bnode = (IBinaryOperatorNode) cnode.getChild(0);
+        IExpressionNode childNode = bnode.getLeftOperandNode();
+        IExpressionNode rnode = bnode.getRightOperandNode();
 
         final String iterName = getModel().getCurrentForeachName();
         getModel().incForeachLoopCount();
         final String targetName = iterName + "_target";
         
+        startMapping(rnode);
         write(ASEmitterTokens.VAR);
         write(ASEmitterTokens.SPACE);
         write(targetName);
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.EQUAL);
         write(ASEmitterTokens.SPACE);
+        endMapping(rnode);
         IASNode obj = bnode.getChild(1);
         getWalker().walk(obj);
+        startMapping(rnode);
         write(ASEmitterTokens.SEMICOLON);
+        endMapping(rnode);
         writeNewline();
 
         if (node.getParent().getNodeID() == ASTNodeID.BlockID &&
@@ -75,15 +82,23 @@ public class ForEachEmitter extends JSSubEmitter implements
             writeToken(ASEmitterTokens.COLON);
 
         }
+
+        startMapping(node);
         write(ASEmitterTokens.FOR);
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.PAREN_OPEN);
+        endMapping(node);
+        startMapping(rnode);
         write(ASEmitterTokens.VAR);
         write(ASEmitterTokens.SPACE);
         write(iterName);
+        endMapping(rnode);
+        startMapping(bnode, childNode);
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.IN);
         write(ASEmitterTokens.SPACE);
+        endMapping(bnode);
+        startMapping(rnode);
         write(targetName);
         boolean isXML = false;
         boolean isProxy = false;
@@ -113,10 +128,14 @@ public class ForEachEmitter extends JSSubEmitter implements
                 isXML = true;
             }
         }
+        endMapping(rnode);
+        startMapping(node, cnode);
         writeToken(ASEmitterTokens.PAREN_CLOSE);
+        endMapping(node);
         writeNewline();
         write(ASEmitterTokens.BLOCK_OPEN);
         writeNewline();
+        startMapping(childNode);
         if (childNode instanceof IVariableExpressionNode)
         {
             write(ASEmitterTokens.VAR);
@@ -128,6 +147,8 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.EQUAL);
         write(ASEmitterTokens.SPACE);
+        endMapping(childNode);
+        startMapping(rnode);
         write(targetName);
         if (isXML)
         {
@@ -148,6 +169,7 @@ public class ForEachEmitter extends JSSubEmitter implements
 	        write(ASEmitterTokens.SQUARE_CLOSE);
         }
         write(ASEmitterTokens.SEMICOLON);
+        endMapping(rnode);
         writeNewline();
         getWalker().walk(node.getStatementContentsNode());
         write(ASEmitterTokens.BLOCK_CLOSE);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/a6b4152e/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
index a462d03..45187b1 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
@@ -205,6 +205,89 @@ public class TestSourceMapStatements extends SourceMapTestBase
         assertMapping(node, 0, 21, 0, 39, 0, 40); // )
     }
 
+    @Test
+    public void testVisitForEach_1()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj) { break; }", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        //var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n  break;\n}}\n
+        assertMapping(node, 0, 22, 0, 0, 0, 26);   // var foreachiter0_target = 
+        assertMapping(node, 0, 22, 0, 26, 0, 29);  // obj
+        assertMapping(node, 0, 22, 0, 29, 0, 30);  // ;
+        assertMapping(node, 0, 0, 1, 0, 1, 5);     // for (
+        assertMapping(node, 0, 22, 1, 5, 1, 21);   // var foreachiter0
+        assertMapping(node, 0, 22, 1, 25, 1, 44);  // foreachiter0_target
+        assertMapping(node, 0, 25, 1, 44, 1, 46);  // )
+        assertMapping(node, 0, 9, 3, 0, 3, 8);     // var i = 
+        assertMapping(node, 0, 22, 3, 8, 3, 42);   // foreachiter0_target[foreachiter0];
+        assertMapping(node, 0, 27, 4, 0, 4, 1);    // {
+        assertMapping(node, 0, 29, 5, 2, 5, 7);    // break
+        assertMapping(node, 0, 36, 6, 0, 6, 1);    // }
+    }
+
+    @Test
+    public void testVisitForEach_1a()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj)  break; ", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        //var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n\n  break;}\n
+        assertMapping(node, 0, 22, 0, 0, 0, 26);   // var foreachiter0_target = 
+        assertMapping(node, 0, 22, 0, 26, 0, 29);  // obj
+        assertMapping(node, 0, 22, 0, 29, 0, 30);  // ;
+        assertMapping(node, 0, 0, 1, 0, 1, 5);     // for (
+        assertMapping(node, 0, 22, 1, 5, 1, 21);   // var foreachiter0
+        assertMapping(node, 0, 22, 1, 25, 1, 44);  // foreachiter0_target
+        assertMapping(node, 0, 25, 1, 44, 1, 46);  // )
+        assertMapping(node, 0, 9, 3, 0, 3, 8);     // var i = 
+        assertMapping(node, 0, 22, 3, 8, 3, 42);   // foreachiter0_target[foreachiter0];
+        assertMapping(node, 0, 28, 5, 2, 5, 7);    // break
+    }
+
+    @Test
+    public void testVisitForEach_2()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj.foo()) { break; }", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        //var foreachiter0_target = obj.foo();\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n  break;\n}}\n
+        assertMapping(node, 0, 22, 0, 0, 0, 26);   // var foreachiter0_target = 
+        assertMapping(node, 0, 22, 0, 26, 0, 29);  // obj
+        assertMapping(node, 0, 25, 0, 29, 0, 30);  // .
+        assertMapping(node, 0, 26, 0, 30, 0, 33);  // foo
+        assertMapping(node, 0, 22, 0, 35, 0, 36);  // ;
+        assertMapping(node, 0, 0, 1, 0, 1, 5);     // for (
+        assertMapping(node, 0, 22, 1, 5, 1, 21);   // var foreachiter0
+        assertMapping(node, 0, 22, 1, 25, 1, 44);  // foreachiter0_target
+        assertMapping(node, 0, 31, 1, 44, 1, 46);  // )
+        assertMapping(node, 0, 9, 3, 0, 3, 8);     // var i = 
+        assertMapping(node, 0, 22, 3, 8, 3, 42);   // foreachiter0_target[foreachiter0];
+        assertMapping(node, 0, 33, 4, 0, 4, 1);    // {
+        assertMapping(node, 0, 35, 5, 2, 5, 7);    // break
+        assertMapping(node, 0, 42, 6, 0, 6, 1);    // }
+    }
+
+    @Test
+    public void testVisitForEach_HoistedVar()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "var i:int; for each(i in obj)  break; ", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        System.out.println(removeGeneratedString(writer.toString()));
+        //var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\ni = foreachiter0_target[foreachiter0];\n\n  break;}\n
+        assertMapping(node, 0, 14, 0, 0, 0, 26);   // var foreachiter0_target = 
+        assertMapping(node, 0, 14, 0, 26, 0, 29);  // obj
+        assertMapping(node, 0, 14, 0, 29, 0, 30);  // ;
+        assertMapping(node, 0, 0, 1, 0, 1, 5);     // for (
+        assertMapping(node, 0, 14, 1, 5, 1, 21);   // var foreachiter0
+        assertMapping(node, 0, 14, 1, 25, 1, 44);  // foreachiter0_target
+        assertMapping(node, 0, 17, 1, 44, 1, 46);  // )
+        assertMapping(node, 0, 9, 3, 0, 3, 4);     // i =
+        assertMapping(node, 0, 14, 3, 4, 3, 38);   // foreachiter0_target[foreachiter0];
+        assertMapping(node, 0, 20, 5, 2, 5, 7);    // break
+    }
+
     //----------------------------------
     // try {} catch () {} finally {}
     //----------------------------------