Repository: flex-falcon Updated Branches: refs/heads/develop d518a97c5 -> 1fb6f371f
more delete scenarios that call removeChild or removeChildAt. Also remove use of _as3_ prefix for XML methods Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f6e619cd Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f6e619cd Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f6e619cd Branch: refs/heads/develop Commit: f6e619cd01ee6f3579c2a5168e86bfb1d141cd25 Parents: d518a97 Author: Alex Harui <[email protected]> Authored: Tue Nov 17 23:49:56 2015 -0800 Committer: Alex Harui <[email protected]> Committed: Tue Nov 17 23:49:56 2015 -0800 ---------------------------------------------------------------------- .../js/flexjs/TestFlexJSGlobalClasses.java | 72 +++++++++++++++++++- .../flex/compiler/internal/test/ASTestBase.java | 5 ++ .../codegen/js/flexjs/JSFlexJSEmitter.java | 69 ++++++++++++++++--- .../codegen/js/jx/FunctionCallEmitter.java | 19 +----- 4 files changed, 136 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f6e619cd/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 cda026b..ffe44b1 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 @@ -194,15 +194,81 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses { IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child;"); asBlockWalker.visitUnaryOperator(node); - assertOut("delete a.child"); + assertOut("a.removeChild('child')"); } @Test + public void testXMLDeleteChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child.grandchild;"); + asBlockWalker.visitUnaryOperator(node); + assertOut("a.child.removeChild('grandchild')"); + } + + @Test + public void testXMLDeleteObjChain() + { + IUnaryOperatorNode node = getUnaryNode("public var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");private function foo() { delete this.a.child.grandchild;}", + WRAP_LEVEL_CLASS); + asBlockWalker.visitUnaryOperator(node); + assertOut("this.a.child.removeChild('grandchild')"); + } + + @Test + public void testXMLDeleteCastChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete XML(b.xml).child.grandchild;"); + asBlockWalker.visitUnaryOperator(node); + assertOut("org.apache.flex.utils.Language.as(b.xml, XML, true).child.removeChild('grandchild')"); + } + + @Test + public void testXMLDeleteCastAsChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete (b.xml as XML).child.grandchild;"); + asBlockWalker.visitUnaryOperator(node); + assertOut("org.apache.flex.utils.Language.as(b.xml, XML).child.removeChild('grandchild')"); + } + + @Test public void testXMLListDelete() { IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child[0];"); asBlockWalker.visitUnaryOperator(node); - assertOut("a.child._as3_removeChildAt(0)"); + assertOut("a.child.removeChildAt(0)"); + } + + @Test + public void testXMLListChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child.grandchild[0];"); + asBlockWalker.visitUnaryOperator(node); + assertOut("a.child.grandchild.removeChildAt(0)"); + } + + @Test + public void testXMLListObjChain() + { + IUnaryOperatorNode node = getUnaryNode("public var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");private function foo() { delete this.a.child.grandchild[0];}", + WRAP_LEVEL_CLASS); + asBlockWalker.visitUnaryOperator(node); + assertOut("this.a.child.grandchild.removeChildAt(0)"); + } + + @Test + public void testXMLListCastChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete XML(b.xml).child.grandchild[0];"); + asBlockWalker.visitUnaryOperator(node); + assertOut("org.apache.flex.utils.Language.as(b.xml, XML, true).child.grandchild.removeChildAt(0)"); + } + + @Test + public void testXMLListAsCastChain() + { + IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete (b.xml as XML).child.grandchild[0];"); + asBlockWalker.visitUnaryOperator(node); + assertOut("org.apache.flex.utils.Language.as(b.xml, XML).child.grandchild.removeChildAt(0)"); } @Test @@ -212,7 +278,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses IASNode parentNode = node.getParent(); node = (IVariableNode) parentNode.getChild(1); asBlockWalker.visitVariable(node); - assertOut("var /** @type {string} */ b = a._as3_name()"); + assertOut("var /** @type {string} */ b = a.name()"); } @Test http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f6e619cd/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 cdb2c70..8da5a9a 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 @@ -169,6 +169,11 @@ public class ASTestBase extends TestBase return (IUnaryOperatorNode) getNode(code, IUnaryOperatorNode.class); } + protected IUnaryOperatorNode getUnaryNode(String code, int wrapLevel) + { + return (IUnaryOperatorNode) getNode(code, IUnaryOperatorNode.class, wrapLevel); + } + protected IVariableNode getVariable(String code) { return (IVariableNode) getNode(code, IVariableNode.class); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f6e619cd/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 0d32289..2677035 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 @@ -51,7 +51,9 @@ import org.apache.flex.compiler.internal.codegen.js.jx.SelfReferenceEmitter; import org.apache.flex.compiler.internal.codegen.js.jx.SuperCallEmitter; import org.apache.flex.compiler.internal.codegen.js.jx.VarDeclarationEmitter; import org.apache.flex.compiler.internal.projects.FlexJSProject; +import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAsNode; import org.apache.flex.compiler.internal.tree.as.DynamicAccessNode; +import org.apache.flex.compiler.internal.tree.as.FunctionCallNode; import org.apache.flex.compiler.internal.tree.as.IdentifierNode; import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode; import org.apache.flex.compiler.internal.tree.as.TernaryOperatorNode; @@ -476,7 +478,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter getWalker().walk(obj); DynamicAccessNode dan = (DynamicAccessNode)(node.getChild(0)); IASNode indexNode = dan.getChild(1); - write("._as3_removeChildAt("); + write(".removeChildAt("); getWalker().walk(indexNode); write(")"); if (ASNodeUtils.hasParenClose(node)) @@ -485,6 +487,26 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter } } } + else if (node.getChild(0).getNodeID() == ASTNodeID.MemberAccessExpressionID) + { + MemberAccessExpressionNode obj = (MemberAccessExpressionNode)(node.getChild(0)); + if (isXMLList(obj)) + { + if (ASNodeUtils.hasParenOpen(node)) + write(ASEmitterTokens.PAREN_OPEN); + + String s = stringifyNode(node.getChild(0)); + int c = s.lastIndexOf("."); + write(s.substring(0, c)); + write(".removeChild('"); + write(s.substring(c + 1)); + write("')"); + if (ASNodeUtils.hasParenClose(node)) + write(ASEmitterTokens.PAREN_CLOSE); + return; + } + } + } else if (node.getNodeID() == ASTNodeID.Op_AtID) { @@ -511,13 +533,37 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter IExpressionNode leftNode = obj.getLeftOperandNode(); IExpressionNode rightNode = obj.getRightOperandNode(); ASTNodeID rightID = rightNode.getNodeID(); - if (rightID == ASTNodeID.IdentifierID) - { - if (isXML(leftNode)) - return true; - } - else if (rightID == ASTNodeID.MemberAccessExpressionID) - return isXMLList((MemberAccessExpressionNode) rightNode); + if (rightID == ASTNodeID.IdentifierID) + { + IDefinition rightDef = rightNode.resolveType(getWalker().getProject()); + if (rightDef != null) + return IdentifierNode.isXMLish(rightDef, getWalker().getProject()); + } + ASTNodeID leftID = leftNode.getNodeID(); + if (leftID == ASTNodeID.IdentifierID) + { + IDefinition leftDef = leftNode.resolveType(getWalker().getProject()); + if (leftDef != null) + return IdentifierNode.isXMLish(leftDef, getWalker().getProject()); + } + else if (leftID == ASTNodeID.MemberAccessExpressionID) + { + return isXMLList((MemberAccessExpressionNode)leftNode); + } + else if (leftID == ASTNodeID.FunctionCallID) + { + FunctionCallNode fcn = (FunctionCallNode)leftNode; + String fname = fcn.getFunctionName(); + if (fname.equals("XML") || fname.equals("XMLList")) + return true; + } + else if (leftID == ASTNodeID.Op_AsID) + { + BinaryOperatorAsNode boan = (BinaryOperatorAsNode)leftNode; + String fname = ((IdentifierNode)boan.getChild(1)).getName(); + if (fname.equals("XML") || fname.equals("XMLList")) + return true; + } return false; } @@ -535,4 +581,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter IDefinition leftDef = obj.resolveType(getWalker().getProject()); return IdentifierNode.isXMLish(leftDef, getWalker().getProject()); } + + public MemberAccessExpressionNode getLastMAEInChain(MemberAccessExpressionNode node) + { + while (node.getRightOperandNode() instanceof MemberAccessExpressionNode) + node = (MemberAccessExpressionNode)node.getRightOperandNode(); + return node; + } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f6e619cd/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java index f4431af..6c1c42d 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java @@ -66,7 +66,6 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu IDefinition def = null; boolean isClassCast = false; - boolean isXMLMethod = false; if (node.isNewExpression()) { @@ -96,13 +95,6 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu { def = node.getNameNode().resolve(getProject()); - if (def == null) - { - IExpressionNode nameNode = node.getNameNode(); - if (nameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID) - if (fjs.isXML((IExpressionNode) nameNode.getChild(0))) - isXMLMethod = true; - } isClassCast = (def instanceof ClassDefinition || def instanceof InterfaceDefinition) && !(NativeUtils.isJSNative(def.getBaseName())); } @@ -154,16 +146,7 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu return; } } - if (isXMLMethod) - { - String s = fjs.stringifyNode(node.getNameNode()); - int lastDot = s.lastIndexOf('.'); - String name = s.substring(lastDot + 1); - s = s.substring(0, lastDot + 1) + "_as3_" + name; - write(s); - } - else - getWalker().walk(node.getNameNode()); + getWalker().walk(node.getNameNode()); write(ASEmitterTokens.PAREN_OPEN); fjs.walkArguments(node.getArgumentNodes()); write(ASEmitterTokens.PAREN_CLOSE);
