You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2015/11/19 00:01:49 UTC

[2/2] git commit: [flex-falcon] [refs/heads/develop] - switch XML member access to child() calls

switch XML member access to child() calls


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/1fb6f371
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/1fb6f371
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/1fb6f371

Branch: refs/heads/develop
Commit: 1fb6f371f836f4871f6afbecf8ec31332f555ccc
Parents: f6e619c
Author: Alex Harui <ah...@apache.org>
Authored: Wed Nov 18 14:44:15 2015 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Wed Nov 18 14:44:15 2015 -0800

----------------------------------------------------------------------
 .../js/flexjs/TestFlexJSGlobalClasses.java      | 48 +++++++++++++---
 .../codegen/js/flexjs/JSFlexJSEmitter.java      |  8 +--
 .../codegen/js/jx/MemberAccessEmitter.java      | 58 +++++++++++++-------
 3 files changed, 81 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1fb6f371/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 ffe44b1..c837390 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
@@ -190,6 +190,26 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     }
     
     @Test
+    public void testXMLSingleDot()
+    {
+        IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.child;");
+        IASNode parentNode = node.getParent();
+        node = (IVariableNode) parentNode.getChild(1);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {XMLList} */ b = a.child('child')");
+    }
+    
+    @Test
+    public void testXMLSingleDotChain()
+    {
+        IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.child.grandchild;");
+        IASNode parentNode = node.getParent();
+        node = (IVariableNode) parentNode.getChild(1);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {XMLList} */ b = a.child('child').child('grandchild')");
+    }
+    
+    @Test
     public void testXMLDelete()
     {
         IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child;");
@@ -202,7 +222,7 @@ 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.grandchild;");
         asBlockWalker.visitUnaryOperator(node);
-        assertOut("a.child.removeChild('grandchild')");
+        assertOut("a.child('child').removeChild('grandchild')");
     }
 
     @Test
@@ -211,7 +231,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         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')");
+        assertOut("this.a.child('child').removeChild('grandchild')");
     }
     
     @Test
@@ -219,7 +239,7 @@ 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>\");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')");
+        assertOut("org.apache.flex.utils.Language.as(b.xml, XML, true).child('child').removeChild('grandchild')");
     }
     
     @Test
@@ -227,7 +247,7 @@ 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>\");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')");
+        assertOut("org.apache.flex.utils.Language.as(b.xml, XML).child('child').removeChild('grandchild')");
     }    
 
     @Test
@@ -235,7 +255,7 @@ 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[0];");
         asBlockWalker.visitUnaryOperator(node);
-        assertOut("a.child.removeChildAt(0)");
+        assertOut("a.child('child').removeChildAt(0)");
     }
     
     @Test
@@ -243,7 +263,7 @@ 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.grandchild[0];");
         asBlockWalker.visitUnaryOperator(node);
-        assertOut("a.child.grandchild.removeChildAt(0)");
+        assertOut("a.child('child').child('grandchild').removeChildAt(0)");
     }
     
     @Test
@@ -252,7 +272,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         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)");
+        assertOut("this.a.child('child').child('grandchild').removeChildAt(0)");
     }
     
     @Test
@@ -260,7 +280,7 @@ 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>\");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)");
+        assertOut("org.apache.flex.utils.Language.as(b.xml, XML, true).child('child').child('grandchild').removeChildAt(0)");
     }
     
     @Test
@@ -268,7 +288,7 @@ 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>\");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)");
+        assertOut("org.apache.flex.utils.Language.as(b.xml, XML).child('child').child('grandchild').removeChildAt(0)");
     }
     
     @Test
@@ -282,6 +302,16 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     }
     
     @Test
+    public void testXMLListLengthFunction()
+    {
+    	IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:int = a.child.length();");
+        IASNode parentNode = node.getParent();
+        node = (IVariableNode) parentNode.getChild(1);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {number} */ b = a.child('child').length()");
+    }
+    
+    @Test
     public void testXMLDoubleDot()
     {
         IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a..child;");

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1fb6f371/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 2677035..c87cadc 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
@@ -495,11 +495,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     		        if (ASNodeUtils.hasParenOpen(node))
     		            write(ASEmitterTokens.PAREN_OPEN);
     		        
-    	            String s = stringifyNode(node.getChild(0));
-    	            int c = s.lastIndexOf(".");
-    	            write(s.substring(0, c));
+    	            String s = stringifyNode(obj.getLeftOperandNode());
+    	            write(s);
     	            write(".removeChild('");
-    	            write(s.substring(c + 1));
+    	            s = stringifyNode(obj.getRightOperandNode());
+    	            write(s);
     	            write("')");
     		        if (ASNodeUtils.hasParenClose(node))
     		            write(ASEmitterTokens.PAREN_CLOSE);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1fb6f371/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 b572e8d..2f5aa55 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
@@ -29,7 +29,10 @@ import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
 import org.apache.flex.compiler.internal.tree.as.GetterNode;
+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.UnaryOperatorAtNode;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
@@ -63,29 +66,44 @@ public class MemberAccessEmitter extends JSSubEmitter implements
         IDefinition def = node.resolve(getProject());
         if (def == null)
         {
+        	IASNode parentNode = node.getParent();
         	// could be XML
         	JSFlexJSEmitter fjs = (JSFlexJSEmitter)getEmitter();
-        	if (fjs.isXML((IExpressionNode) leftNode) &&
-        			node.getOperator() == OperatorType.DESCENDANT_ACCESS)
+        	boolean isXML = false;
+        	if (leftNode instanceof MemberAccessExpressionNode)
+        		isXML = fjs.isXMLList((MemberAccessExpressionNode)leftNode);
+        	else if (leftNode instanceof IExpressionNode)
+        		isXML = fjs.isXML((IExpressionNode)leftNode);
+        	if (isXML)
         	{
-        		writeLeftSide(node, leftNode, rightNode);
-        		write(".descendants('");
-        		String s = fjs.stringifyNode(rightNode);
-        		int dot = s.indexOf('.');
-        		if (dot != -1)
-        		{
-        			String name = s.substring(0, dot);
-        			String afterDot = s.substring(dot);
-        			write(name);
-        			write("')");
-        			write(afterDot);
-        		}
-        		else
-        		{
-        			write(s);
-        			write("')");
-        		}
-        		return;
+        		boolean descendant = (node.getOperator() == OperatorType.DESCENDANT_ACCESS);
+        		boolean child = (node.getOperator() == OperatorType.MEMBER_ACCESS) && 
+        							(!(parentNode instanceof FunctionCallNode)) &&
+        							rightNode.getNodeID() != ASTNodeID.Op_AtID;
+        		if (descendant || child)
+	        	{
+	        		writeLeftSide(node, leftNode, rightNode);
+	        		if (descendant)
+	        			write(".descendants('");
+	        		if (child)
+	        			write(".child('");	        			
+	        		String s = fjs.stringifyNode(rightNode);
+	        		int dot = s.indexOf('.');
+	        		if (dot != -1)
+	        		{
+	        			String name = s.substring(0, dot);
+	        			String afterDot = s.substring(dot);
+	        			write(name);
+	        			write("')");
+	        			write(afterDot);
+	        		}
+	        		else
+	        		{
+	        			write(s);
+	        			write("')");
+	        		}
+	        		return;
+	        	}
         	}
         }
         boolean isStatic = false;