source maps for member access and dynamic access
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f31918b0 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f31918b0 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f31918b0 Branch: refs/heads/develop Commit: f31918b08b8bf0e5b9e79ab19fb22519a2a64624 Parents: 9138c3d Author: Josh Tynjala <[email protected]> Authored: Fri Apr 1 10:32:07 2016 -0700 Committer: Josh Tynjala <[email protected]> Committed: Fri Apr 1 10:32:07 2016 -0700 ---------------------------------------------------------------------- .../js/sourcemaps/TestSourceMapExpressions.java | 44 ++++++++++++++++++++ .../compiler/internal/codegen/js/JSEmitter.java | 21 ++++++++++ .../codegen/js/jx/MemberAccessEmitter.java | 4 ++ 3 files changed, 69 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f31918b0/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java index 0d282f8..c34f68a 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java @@ -6,8 +6,10 @@ import org.apache.flex.compiler.internal.test.SourceMapTestBase; import org.apache.flex.compiler.internal.tree.as.ArrayLiteralNode; import org.apache.flex.compiler.internal.tree.as.ObjectLiteralNode; import org.apache.flex.compiler.tree.as.IBinaryOperatorNode; +import org.apache.flex.compiler.tree.as.IDynamicAccessNode; import org.apache.flex.compiler.tree.as.IFunctionCallNode; import org.apache.flex.compiler.tree.as.IIterationFlowNode; +import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode; import org.apache.flex.compiler.tree.as.IReturnNode; import org.apache.flex.compiler.tree.as.ITernaryOperatorNode; import org.apache.flex.compiler.tree.as.IUnaryOperatorNode; @@ -385,6 +387,28 @@ public class TestSourceMapExpressions extends SourceMapTestBase //---------------------------------- @Test + public void testVisitDynamicAccessNode_1() + { + IDynamicAccessNode node = getDynamicAccessNode("a[b]"); + asBlockWalker.visitDynamicAccess(node); + assertMapping(node, 0, 1, 0, 1, 0, 2); + assertMapping(node, 0, 3, 0, 3, 0, 4); + } + + @Test + public void testVisitDynamicAccessNode_2() + { + IDynamicAccessNode node = getDynamicAccessNode("a[b[c][d]]"); + asBlockWalker.visitDynamicAccess(node); + assertMapping(node, 0, 1, 0, 1, 0, 2); + assertMapping(node, 0, 3, 0, 3, 0, 4); + assertMapping(node, 0, 5, 0, 5, 0, 6); + assertMapping(node, 0, 6, 0, 6, 0, 7); + assertMapping(node, 0, 8, 0, 8, 0, 9); + assertMapping(node, 0, 9, 0, 9, 0, 10); + } + + @Test public void testVisitBinaryOperatorNode_Comma() { IBinaryOperatorNode node = getBinaryNode("a, b"); @@ -411,6 +435,26 @@ public class TestSourceMapExpressions extends SourceMapTestBase } @Test + public void testVisitMemberAccess_1() + { + IMemberAccessExpressionNode node = (IMemberAccessExpressionNode) getExpressionNode( + "a.b", IMemberAccessExpressionNode.class); + asBlockWalker.visitMemberAccessExpression(node); + assertMapping(node, 0, 1, 0, 1, 0, 2); + } + + @Test + public void testVisitMemberAccess_2() + { + IMemberAccessExpressionNode node = (IMemberAccessExpressionNode) getExpressionNode( + "a.b.c.d", IMemberAccessExpressionNode.class); + asBlockWalker.visitMemberAccessExpression(node); + assertMapping(node, 0, 1, 0, 1, 0, 2); + assertMapping(node, 0, 3, 0, 3, 0, 4); + assertMapping(node, 0, 5, 0, 5, 0, 6); + } + + @Test public void testVisitBinaryOperator_In() { IBinaryOperatorNode node = getBinaryNode("a in b"); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f31918b0/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java index e42056c..01a3298 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java @@ -39,6 +39,7 @@ import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IConditionalNode; import org.apache.flex.compiler.tree.as.IContainerNode; import org.apache.flex.compiler.tree.as.IDefinitionNode; +import org.apache.flex.compiler.tree.as.IDynamicAccessNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionNode; import org.apache.flex.compiler.tree.as.IFunctionObjectNode; @@ -300,6 +301,26 @@ public class JSEmitter extends ASEmitter implements IJSEmitter } @Override + public void emitDynamicAccess(IDynamicAccessNode node) + { + IExpressionNode leftOperandNode = node.getLeftOperandNode(); + getWalker().walk(leftOperandNode); + + startMapping(node, leftOperandNode.getLine(), + leftOperandNode.getColumn() + leftOperandNode.getEnd() - leftOperandNode.getStart()); + write(ASEmitterTokens.SQUARE_OPEN); + endMapping(node); + + IExpressionNode rightOperandNode = node.getRightOperandNode(); + getWalker().walk(rightOperandNode); + + startMapping(node, rightOperandNode.getLine(), + rightOperandNode.getColumn() + rightOperandNode.getEnd() - rightOperandNode.getStart()); + write(ASEmitterTokens.SQUARE_CLOSE); + endMapping(node); + } + + @Override public void emitMemberKeyword(IDefinitionNode node) { IKeywordNode keywordNode = null; http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f31918b0/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java index 5175a79..4d9b11a 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java @@ -245,7 +245,11 @@ public class MemberAccessEmitter extends JSSubEmitter implements continueWalk = writeLeftSide(node, leftNode, rightNode); if (continueWalk) + { + getEmitter().startMapping(node, node.getLeftOperandNode().getAbsoluteEnd() - node.getAbsoluteStart()); write(node.getOperator().getOperatorText()); + getEmitter().endMapping(node); + } } if (continueWalk)
