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/09/30 15:08:47 UTC

[3/5] git commit: [flex-falcon] [refs/heads/develop] - Look for [ArrayElementType] on class (not property) when a class is accessed via numeric dynamic access such as [i] and resolve the results to that type. Allows dynamic array access to Float32Array

Look for [ArrayElementType] on class (not property) when a class is accessed via numeric dynamic access such as [i] and resolve the results to that type.  Allows dynamic array access to Float32Array and things like that


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

Branch: refs/heads/develop
Commit: ed2c72a69113344d561471d93848d18ee654c275
Parents: 7a44e38
Author: Alex Harui <ah...@apache.org>
Authored: Wed Sep 28 07:52:50 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Sep 29 20:56:44 2016 -0700

----------------------------------------------------------------------
 .../codegen/js/jx/BinaryOperatorEmitter.java    | 51 +++++++++++++++-----
 .../codegen/js/jx/VarDeclarationEmitter.java    | 51 +++++++++++++++-----
 .../js/flexjs/TestFlexJSExpressions.java        | 10 ++++
 .../js/flexjs/TestFlexJSFieldMembers.java       |  9 ++++
 4 files changed, 99 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ed2c72a6/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 38d13fe..141949b 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -23,6 +23,8 @@ import org.apache.flex.compiler.codegen.ISubEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.constants.IASLanguageConstants;
 import org.apache.flex.compiler.definitions.IDefinition;
+import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+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.JSSubEmitter;
 import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSDocEmitter;
@@ -31,6 +33,7 @@ import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
+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;
@@ -270,18 +273,44 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
         	boolean rightIsNumber = (rightDef != null && (rightDef.getQualifiedName().equals(IASLanguageConstants.Number) ||
 					  rightDef.getQualifiedName().equals(IASLanguageConstants._int) ||
 					  rightDef.getQualifiedName().equals(IASLanguageConstants.uint)));
-            if (leftIsNumber && !rightIsNumber && (rightDef == null || rightDef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE))
-            		&& rNode.getNodeID() == ASTNodeID.FunctionCallID)
+            if (leftIsNumber && !rightIsNumber && (rightDef == null || rightDef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE)))
             {
-            	IExpressionNode fnNameNode = ((FunctionCallNode)rNode).getNameNode();
-            	if (fnNameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
-            	{
-            		MemberAccessExpressionNode mae = (MemberAccessExpressionNode)fnNameNode;
-            		IExpressionNode rightNode = mae.getRightOperandNode();
-            		rightIsNumber = rightNode.getNodeID() == ASTNodeID.IdentifierID && 
-            				((IdentifierNode)rightNode).getName().equals("length") &&
-            				fjs.isXMLList(mae);
-            	}
+        		if (rNode.getNodeID() == ASTNodeID.FunctionCallID)
+        		{
+	            	IExpressionNode fnNameNode = ((FunctionCallNode)rNode).getNameNode();
+	            	if (fnNameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+	            	{
+	            		MemberAccessExpressionNode mae = (MemberAccessExpressionNode)fnNameNode;
+	            		IExpressionNode rightNode = mae.getRightOperandNode();
+	            		rightIsNumber = rightNode.getNodeID() == ASTNodeID.IdentifierID && 
+	            				((IdentifierNode)rightNode).getName().equals("length") &&
+	            				fjs.isXMLList(mae);
+	            	}
+        		}
+        		else if (rNode.getNodeID() == ASTNodeID.ArrayIndexExpressionID)
+        		{
+        			DynamicAccessNode dyn = (DynamicAccessNode)rNode;
+        			IDefinition lDef = dyn.getLeftOperandNode().resolveType(getProject());
+        			IDefinition rDef = dyn.getRightOperandNode().resolveType(getProject());
+        			// numeric indexing?
+        			if (rDef.getQualifiedName().equals(IASLanguageConstants.Number))
+        			{
+        				IMetaTag[] metas = lDef.getAllMetaTags();
+        				for (IMetaTag meta : metas)
+        				{
+        					if (meta.getTagName().equals("ArrayElementType"))
+        					{
+        						IMetaTagAttribute[] attrs = meta.getAllAttributes();
+        						for (IMetaTagAttribute attr : attrs)
+        						{
+        							String t = attr.getValue();
+            						if (t.equals(IASLanguageConstants.Number))
+            							rightIsNumber = true;
+        						}
+        					}
+        				}
+        			}
+        		}
             }
             String coercion = (leftIsNumber && !rightIsNumber && isAssignment) ? "Number(" : "";
             if (isAssignment && leftDef != null && leftDef.getQualifiedName().equals(IASLanguageConstants.String))

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ed2c72a6/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
index 3d66f97..4e35e39 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
@@ -23,10 +23,13 @@ import org.apache.flex.compiler.codegen.ISubEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.constants.IASLanguageConstants;
 import org.apache.flex.compiler.definitions.IDefinition;
+import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+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.JSSubEmitter;
 import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
 import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
+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;
@@ -119,18 +122,44 @@ public class VarDeclarationEmitter extends JSSubEmitter implements
             boolean valIsNumber = (avdef != null && (avdef.getQualifiedName().equals(IASLanguageConstants.Number) ||
             										 avdef.getQualifiedName().equals(IASLanguageConstants._int) ||
             										 avdef.getQualifiedName().equals(IASLanguageConstants.uint)));
-            if (varIsNumber && !valIsNumber && (avdef == null || avdef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE))
-            		&& avnode.getNodeID() == ASTNodeID.FunctionCallID)
+            if (varIsNumber && !valIsNumber && (avdef == null || avdef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE)))
             {
-            	IExpressionNode fnNameNode = ((FunctionCallNode)avnode).getNameNode();
-            	if (fnNameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
-            	{
-            		MemberAccessExpressionNode mae = (MemberAccessExpressionNode)fnNameNode;
-            		IExpressionNode rightNode = mae.getRightOperandNode();
-            		valIsNumber = rightNode.getNodeID() == ASTNodeID.IdentifierID && 
-            				((IdentifierNode)rightNode).getName().equals("length") &&
-            				fjs.isXMLList(mae);
-            	}
+        		if (avnode.getNodeID() == ASTNodeID.FunctionCallID)
+        		{
+	            	IExpressionNode fnNameNode = ((FunctionCallNode)avnode).getNameNode();
+	            	if (fnNameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+	            	{
+	            		MemberAccessExpressionNode mae = (MemberAccessExpressionNode)fnNameNode;
+	            		IExpressionNode rightNode = mae.getRightOperandNode();
+	            		valIsNumber = rightNode.getNodeID() == ASTNodeID.IdentifierID && 
+	            				((IdentifierNode)rightNode).getName().equals("length") &&
+	            				fjs.isXMLList(mae);
+	            	}
+        		}
+        		else if (avnode.getNodeID() == ASTNodeID.ArrayIndexExpressionID)
+        		{
+        			DynamicAccessNode dyn = (DynamicAccessNode)avnode;
+        			IDefinition leftDef = dyn.getLeftOperandNode().resolveType(getProject());
+        			IDefinition rightDef = dyn.getRightOperandNode().resolveType(getProject());
+        			// numeric indexing?
+        			if (rightDef.getQualifiedName().equals(IASLanguageConstants.Number))
+        			{
+        				IMetaTag[] metas = leftDef.getAllMetaTags();
+        				for (IMetaTag meta : metas)
+        				{
+        					if (meta.getTagName().equals("ArrayElementType"))
+        					{
+        						IMetaTagAttribute[] attrs = meta.getAllAttributes();
+        						for (IMetaTagAttribute attr : attrs)
+        						{
+        							String t = attr.getValue();
+            						if (t.equals(IASLanguageConstants.Number))
+            							valIsNumber = true;
+        						}
+        					}
+        				}
+        			}
+        		}
             }
             String coercion = "";
             if (varIsNumber && !valIsNumber)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ed2c72a6/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
index c9594c5..e46d9ca 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
@@ -653,6 +653,16 @@ public class TestFlexJSExpressions extends TestGoogExpressions
     }
 
     @Test
+    public void testVisitBinaryOperatorNode_ArrayElementType()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public function d() { var b:Number; b = c[0]; var c:C;}}\n[ArrayElementType(\"Number\")]\nclass C {}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("b = c[0]");
+    }
+
+    @Test
     public void testNamedFunctionAsArgument()
     {
         IFunctionNode node = (IFunctionNode) getNode(

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ed2c72a6/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
index ef54f29..4725485 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
@@ -81,6 +81,15 @@ public class TestFlexJSFieldMembers extends TestGoogFieldMembers
         assertOut("/**\n * @export\n * @type {number}\n */\nFalconTest_A.prototype.foo = -420");
     }
 
+    @Test
+    public void testVariable_withTypeValue_ArrayElementType()
+    {
+        IVariableNode node = (IVariableNode)getNode("public class A { function foobar():void {var foo:Number = bar[0];var bar:B;}}\n[ArrayElementType(\"Number\")]\nclass B {}",
+        		IVariableNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {number} */ foo = bar[0]");
+    }
+
     @Override
     @Test
     public void testField_withNamespaceTypeValue()