special case toString() on *

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

Branch: refs/heads/master
Commit: b10a1cd3d08df58228d459fcd0351489716877d5
Parents: 23df02a
Author: Alex Harui <[email protected]>
Authored: Wed Aug 10 15:28:38 2016 -0700
Committer: Alex Harui <[email protected]>
Committed: Wed Aug 10 15:28:38 2016 -0700

----------------------------------------------------------------------
 .../codegen/js/jx/BinaryOperatorEmitter.java        | 16 ++++++++++++++++
 .../codegen/js/flexjs/TestFlexJSExpressions.java    | 10 ++++++++++
 2 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b10a1cd3/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 87e07c5..bb454fc 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
@@ -300,6 +300,9 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                {
                                if (rightDef == null ||
                                                
(!(rightDef.getQualifiedName().equals(IASLanguageConstants.String) ||
+                                                 
(rightDef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE)
+                                               && rNode.getNodeID() == 
ASTNodeID.FunctionCallID &&
+                                               isToString(rNode)) ||
                                                  // if not an assignment we 
don't need to coerce numbers
                                                  (!isAssignment && 
rightIsNumber) ||
                                                   
rightDef.getQualifiedName().equals(IASLanguageConstants.Null))))
@@ -381,6 +384,19 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
             */
         }
     }
+    
+    private boolean isToString(IASNode rNode)
+    {
+       IExpressionNode fnNameNode = ((FunctionCallNode)rNode).getNameNode();
+       if (fnNameNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+       {
+               MemberAccessExpressionNode mae = 
(MemberAccessExpressionNode)fnNameNode;
+               IExpressionNode rightNode = mae.getRightOperandNode();
+               return rightNode.getNodeID() == ASTNodeID.IdentifierID && 
+                               
((IdentifierNode)rightNode).getName().equals("toString");
+       }
+       return false;
+    }
 
     private void super_emitBinaryOperator(IBinaryOperatorNode node, String 
coercion)
     {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b10a1cd3/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 40ee688..2def937 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
@@ -624,6 +624,16 @@ public class TestFlexJSExpressions extends 
TestGoogExpressions
     }
 
     @Test
+    public void testVisitBinaryOperatorNode_StringAssignFromStarToString()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public var b:String; public var c:*; public 
function d() { b = c.toString(); }}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("this.b = this.c.toString()");
+    }
+
+    @Test
     public void testNamedFunctionAsArgument()
     {
         IFunctionNode node = (IFunctionNode) getNode(

Reply via email to