You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2018/11/09 07:03:49 UTC

[royale-compiler] branch develop updated: Fix for Array.sort. Alex please review against your changes in Language.as. Feel free to revert if you don't want this in the release. (I think there needs to be a typedef change as well for Array.sort method signature, but I don't know how to do that yet)

This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 1b9d049  Fix for Array.sort. Alex please review against your changes in Language.as. Feel free to revert if you don't want this in the release. (I think there needs to be a typedef change as well for Array.sort method signature, but I don't know how to do that yet)
1b9d049 is described below

commit 1b9d04956f855b707d34230d22e74ce68efa0f5a
Author: greg-dove <gr...@gmail.com>
AuthorDate: Fri Nov 9 20:03:33 2018 +1300

    Fix for Array.sort.
    Alex please review against your changes in Language.as. Feel free to revert if you don't want this in the release.
    (I think there needs to be a typedef change as well for Array.sort method signature, but I don't know how to do that yet)
---
 .../codegen/js/jx/FunctionCallEmitter.java         | 48 ++++++++++++----------
 .../codegen/js/royale/TestRoyaleGlobalClasses.java | 40 +++++++++++++++++-
 2 files changed, 65 insertions(+), 23 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
index 2cfa711..776ebca 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
@@ -79,7 +79,7 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
             {
                 if (!(node.getChild(1) instanceof VectorLiteralNode))
                 {
-                    if (def == null || !(def.getBaseName().equals(IASGlobalFunctionConstants._int) || 
+                    if (def == null || !(def.getBaseName().equals(IASGlobalFunctionConstants._int) ||
                     					 def.getBaseName().equals(IASGlobalFunctionConstants.uint) ||
                     					 def instanceof AppliedVectorDefinition))
                     {
@@ -150,13 +150,13 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
                     // otherwise it just looks like any other "new function"
                     // in JS.
                     if (nameNode.hasParenthesis())
-                        write(ASEmitterTokens.PAREN_OPEN);                        
+                        write(ASEmitterTokens.PAREN_OPEN);
                     // I think we still need this for "new someVarOfTypeClass"
                     getEmitter().getWalker().walk(nameNode);
                     if (nameNode.hasParenthesis())
-                        write(ASEmitterTokens.PAREN_CLOSE);                        
+                        write(ASEmitterTokens.PAREN_CLOSE);
                 }
-                
+
                 if (def instanceof AppliedVectorDefinition)
                 {
                 	ContainerNode args = node.getArgumentsNode();
@@ -226,21 +226,27 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
                 			IExpressionNode args[] = node.getArgumentNodes();
                 			if (args.length > 0)
                 			{
-	                			IExpressionNode param1 = args[0];
-	                            ICompilerProject project = this.getProject();
-	                			IDefinition paramDef1 = param1.resolveType(project);
-	                			if (paramDef1.getBaseName().equals(IASLanguageConstants._int))
-	                			{
-		                            if (project instanceof RoyaleJSProject)
-		                                ((RoyaleJSProject) project).needLanguage = true;
-		                            getEmitter().getModel().needLanguage = true;
-		                            write(JSRoyaleEmitterTokens.LANGUAGE_QNAME);
-		                            write(ASEmitterTokens.MEMBER_ACCESS);
-		                            write("sort");
-		                            IContainerNode newArgs = EmitterUtils.insertArgumentsBefore(node.getArgumentsNode(), cnode);
-		                            fjs.emitArguments(newArgs);
-		                            return;
-	                			}
+                                IExpressionNode optionsParamCheck = args.length == 1 ? args[0] : args[1];
+                                ICompilerProject project = this.getProject();
+                                IDefinition paramCheck = optionsParamCheck.resolveType(project);
+
+                                if (paramCheck.getBaseName().equals(IASLanguageConstants._int)
+                                    || paramCheck.getBaseName().equals(IASLanguageConstants.uint)
+                                    || paramCheck.getBaseName().equals(IASLanguageConstants.Number))
+                                {
+                                    //deal with specific numeric option argument variations
+                                    //either: Array.sort(option:uint) or Array.sort(compareFunction:Function, option:uint)
+                                    //use our Language sort implementation to support these actionscript-specific method signatures
+                                    if (project instanceof RoyaleJSProject)
+                                        ((RoyaleJSProject) project).needLanguage = true;
+                                    getEmitter().getModel().needLanguage = true;
+                                    write(JSRoyaleEmitterTokens.LANGUAGE_QNAME);
+                                    write(ASEmitterTokens.MEMBER_ACCESS);
+                                    write("sort");
+                                    IContainerNode newArgs = EmitterUtils.insertArgumentsBefore(node.getArgumentsNode(), cnode);
+                                    fjs.emitArguments(newArgs);
+                                    return;
+                                }
                 			}
             			}
             		}
@@ -255,7 +261,7 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
                     	}
                     	else if (len > 1)
                     	{
-                    		getWalker().getProject().getProblems().add(new TooManyFunctionParametersProblem(node, 1));                    		
+                    		getWalker().getProject().getProblems().add(new TooManyFunctionParametersProblem(node, 1));
                     	}
                     	else
                     	{
@@ -286,7 +292,7 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
 	                    for (int i = 0; i < n; i++)
 	                    {
 		                    write(", ");
-	                        getWalker().walk(args[i]);	                    	
+	                        getWalker().walk(args[i]);
 	                    }
                     }
                     write(ASEmitterTokens.PAREN_CLOSE);
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
index f00b0d2..4489082 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
@@ -143,6 +143,42 @@ public class TestRoyaleGlobalClasses extends TestGoogGlobalClasses
     }
 
     @Test
+    public void testArraySortNoArgs()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();a.sort()");
+        IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
+        asBlockWalker.visitFunctionCall(parentNode);
+        assertOut("a.sort()");
+    }
+
+    @Test
+    public void testArraySortOptArgOnly()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();a.sort(Array.NUMERIC)");
+        IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
+        asBlockWalker.visitFunctionCall(parentNode);
+        assertOut("org.apache.royale.utils.Language.sort(a, 16)");
+    }
+
+    @Test
+    public void testArraySortCompareFunctionArgOnly()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(f)");
+        IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
+        asBlockWalker.visitFunctionCall(parentNode);
+        assertOut("a.sort(f)");
+    }
+
+    @Test
+    public void testArraySortCompareFunctionWithOptArg()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(f, Array.UNIQUESORT)");
+        IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
+        asBlockWalker.visitFunctionCall(parentNode);
+        assertOut("org.apache.royale.utils.Language.sort(a, f, 4)");
+    }
+
+    @Test
     public void testArraySortOn()
     {
         IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array(); a.sortOn('foo')");
@@ -551,7 +587,7 @@ public class TestRoyaleGlobalClasses 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.royale.utils.Language.as(b.xml, XML).child('child').removeChild('grandchild')");
-    }    
+    }
 
     @Test
     public void testXMLListDelete()
@@ -927,7 +963,7 @@ public class TestRoyaleGlobalClasses extends TestGoogGlobalClasses
         asBlockWalker.visitVariable(node);
         assertOut("var /** @type {Namespace} */ a = new Namespace('foo', 'bar')");
     }
-        
+    
     @Test
     public void testQNameNoArg()
     {