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 2016/11/18 00:24:48 UTC

git commit: [flex-falcon] [refs/heads/develop] - FLEX-35014 improve Vector support

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 5aa512f2b -> 7a6e27a07


FLEX-35014 improve Vector support


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

Branch: refs/heads/develop
Commit: 7a6e27a07b3003424046f91fea4c8001e4d7e9ba
Parents: 5aa512f
Author: Alex Harui <ah...@apache.org>
Authored: Thu Nov 17 16:19:13 2016 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Nov 17 16:24:46 2016 -0800

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSEmitter.java      |  8 +++
 .../js/flexjs/JSFlexJSEmitterTokens.java        |  1 +
 .../codegen/js/jx/FunctionCallEmitter.java      | 54 +++++++++++++++-----
 .../js/flexjs/TestFlexJSGlobalClasses.java      | 21 ++++----
 .../js/flexjs/TestFlexJSGlobalFunctions.java    | 17 +++---
 .../flex/compiler/internal/test/TestBase.java   | 10 ++++
 6 files changed, 82 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 6d6cb8c..4bcc3cf 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -38,6 +38,7 @@ import org.apache.flex.compiler.definitions.IPackageDefinition;
 import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
+import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.JSSessionModel.ImplicitBindableImplementation;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
@@ -106,6 +107,7 @@ import org.apache.flex.compiler.tree.as.INamespaceNode;
 import org.apache.flex.compiler.tree.as.IPackageNode;
 import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
+import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
 import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
 import org.apache.flex.compiler.utils.ASNodeUtils;
@@ -1251,4 +1253,10 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     	}
     	super.emitLabelStatement(node);
     }
+    
+    @Override
+    public void emitTypedExpression(ITypedExpressionNode node)
+    {
+        write(JSFlexJSEmitterTokens.VECTOR);
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
index 4a140e3..50e612b 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
@@ -56,6 +56,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     SKIP_AS_COERCIONS("skipAsCoercions"),
     SKIP_FUNCTION_COERCIONS("skipFunctionCoercions"),
     JSX("JSX"),
+    VECTOR("org.apache.flex.utils.Language.Vector"),
     ;
 
     private String token;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
index 4b31159..d125eeb 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FunctionCallEmitter.java
@@ -36,6 +36,8 @@ import org.apache.flex.compiler.internal.definitions.InterfaceDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.internal.tree.as.ContainerNode;
 import org.apache.flex.compiler.internal.tree.as.VectorLiteralNode;
+import org.apache.flex.compiler.problems.TooFewFunctionParametersProblem;
+import org.apache.flex.compiler.problems.TooManyFunctionParametersProblem;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -67,7 +69,8 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
         if (id != ASTNodeID.SuperID)
         {
             IDefinition def = null;
-            def = node.getNameNode().resolve(getProject());
+            IExpressionNode nameNode = node.getNameNode();
+            def = nameNode.resolve(getProject());
 
             boolean isClassCast = false;
 
@@ -75,7 +78,9 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
             {
                 if (!(node.getChild(1) instanceof VectorLiteralNode))
                 {
-                    if (def == null || !(def.getBaseName().equals(IASGlobalFunctionConstants._int) || def.getBaseName().equals(IASGlobalFunctionConstants.uint)))
+                    if (def == null || !(def.getBaseName().equals(IASGlobalFunctionConstants._int) || 
+                    					 def.getBaseName().equals(IASGlobalFunctionConstants.uint) ||
+                    					 def instanceof AppliedVectorDefinition))
                     {
 	                    startMapping(node.getNewKeywordNode());
 	                    writeToken(ASEmitterTokens.NEW);
@@ -113,7 +118,6 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
             if (node.isNewExpression())
             {
                 def = node.resolveCalledExpression(getProject());
-                IExpressionNode nameNode = node.getNameNode();
                 // all new calls to a class should be fully qualified names
                 if (def instanceof ClassDefinition)
                 {
@@ -151,7 +155,29 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
                         write(ASEmitterTokens.PAREN_CLOSE);                        
                 }
                 
-                getEmitter().emitArguments(node.getArgumentsNode());
+                if (def instanceof AppliedVectorDefinition)
+                {
+                	ContainerNode args = node.getArgumentsNode();
+                	if (args.getChildCount() == 0)
+                	{
+                    	getEmitter().emitArguments(node.getArgumentsNode());
+                	}
+                	else
+                	{
+                        startMapping(node);
+                        write(ASEmitterTokens.PAREN_OPEN);
+                        endMapping(node);
+                        getWalker().walk(args.getChild(0));
+                        write(ASEmitterTokens.COMMA);
+                        write(ASEmitterTokens.SPACE);
+                        write(ASEmitterTokens.SINGLE_QUOTE);
+                        write(((AppliedVectorDefinition)def).resolveElementType(getWalker().getProject()).getBaseName());
+                        write(ASEmitterTokens.SINGLE_QUOTE);
+                        write(ASEmitterTokens.PAREN_CLOSE);
+                	}
+                }
+                else
+                	getEmitter().emitArguments(node.getArgumentsNode());
             }
             else if (!isClassCast)
             {
@@ -217,16 +243,20 @@ public class FunctionCallEmitter extends JSSubEmitter implements ISubEmitter<IFu
                     {
                         IExpressionNode[] argumentNodes = node.getArgumentNodes();
                         int len = argumentNodes.length;
-                        for (int i = 0; i < len; i++)
-                        {
-                            IExpressionNode argumentNode = argumentNodes[i];
+                    	if (len == 0)
+                    	{
+                    		getWalker().getProject().getProblems().add(new TooFewFunctionParametersProblem(node, 1));
+                    	}
+                    	else if (len > 1)
+                    	{
+                    		getWalker().getProject().getProblems().add(new TooManyFunctionParametersProblem(node, 1));                    		
+                    	}
+                    	else
+                    	{
+                            IExpressionNode argumentNode = argumentNodes[0];
                             getWalker().walk(argumentNode);
-                            if(i < len - 1)
-                            {
-                                write(", ");
-                            }
+                            write(".slice()");
                         }
-                        write(".slice()");
                         return;
                     }
                 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 58324bd..247fcd5 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -282,7 +282,8 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+        //MXMLC does not report an error.  Should we?
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector(['Hello', 'World'], 'String')");
     }
 
     @Test
@@ -314,7 +315,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>();");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = new Array()");
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector()");
     }
 
     @Test
@@ -322,8 +323,8 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World');");
         asBlockWalker.visitVariable(node);
-        // expected error?
-        assertOut("var /** @type {Array} */ a = new Array('Hello', 'World')");
+        //MXMLC does not report an error.  Should we?
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector('Hello', 'String')");
     }
 
     @Test
@@ -331,8 +332,8 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World', 'Three');");
         asBlockWalker.visitVariable(node);
-        // expected error?
-        assertOut("var /** @type {Array} */ a = new Array('Hello', 'World', 'Three')");
+        //MXMLC does not report an error.  Should we?
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector('Hello', 'String')");
     }
 
     @Test
@@ -340,7 +341,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = new Array(30)");
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector(30, 'String')");
     }
 
     @Test
@@ -348,7 +349,8 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, 40);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = new Array(30, 40)");
+        //MXMLC does not report an error.  Should we?
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector(30, 'String')");
     }
 
     @Test
@@ -356,7 +358,8 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
         IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
+        //MXMLC does not report an error.  Should we?
+        assertOut("var /** @type {Array} */ a = org.apache.flex.utils.Language.Vector(['Hello', 'World'], 'String')");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
index 66397d8..fc49825 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
@@ -162,36 +162,37 @@ public class TestFlexJSGlobalFunctions extends TestGoogGlobalFunctions
         assertOut("var /** @type {Array} */ a = ['Hello', 'World'].slice()");
     }
 
-    @Ignore
+    @Test
     public void testVectorNoArgs()
     {
         IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>();");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = Array()");
+        assertErrors("Incorrect number of arguments.  Expected 1");
     }
 
-    @Ignore
+    @Test
     public void testVectorStringArgs()
     {
         IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>('Hello', 'World');");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = Array('Hello', 'World')");
+        assertErrors("Incorrect number of arguments.  Expected no more than 1");
     }
 
-    @Ignore
+    @Test
     public void testVectorSizeArg()
     {
         IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>(30);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = Array(30)");
+        // MXMLC doesn't report an error either.  Maybe we should. 
+        assertOut("var /** @type {Array} */ a = 30.slice()");
     }
 
-    @Ignore
+    @Test
     public void testVectorNumberArgs()
     {
         IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>(30, 40);");
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Array} */ a = Array(30, 40)");
+        assertErrors("Incorrect number of arguments.  Expected no more than 1");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7a6e27a0/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/TestBase.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/TestBase.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/TestBase.java
index aa495ca..c0234fa 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/TestBase.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/TestBase.java
@@ -154,6 +154,16 @@ public class TestBase implements ITestBase
         return null;
     }
 
+    protected void assertErrors(String errorReport)
+    {
+    	StringBuilder actualErrors = new StringBuilder();
+    	for (ICompilerProblem problem : errors)
+    	{
+    		actualErrors.append(problem.toString());
+    	}
+        assertThat(actualErrors.toString(), is(errorReport));
+    }
+    
     protected void assertOut(String code, boolean keepMetadata)
     {
     	mCode = removeGeneratedString(writer.toString());