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 {}
//----------------------------------