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);

Reply via email to