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/08/09 20:45:58 UTC

git commit: [flex-falcon] [refs/heads/develop] - attempt #2 at some implicit type conversions

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 8f68c66d2 -> fff63d367


attempt #2 at some implicit type conversions


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

Branch: refs/heads/develop
Commit: fff63d3673d9b0a288778efa2ae04f2c52073889
Parents: 8f68c66
Author: Alex Harui <ah...@apache.org>
Authored: Tue Aug 9 13:45:41 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Aug 9 13:45:55 2016 -0700

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSDocEmitter.java   |  6 ++
 .../js/flexjs/JSFlexJSEmitterTokens.java        |  1 +
 .../codegen/js/jx/BinaryOperatorEmitter.java    | 23 +++++---
 .../codegen/js/jx/VarDeclarationEmitter.java    | 16 ++---
 .../utils/JSClosureCompilerWrapper.java         |  2 +-
 .../js/flexjs/TestFlexJSExpressions.java        | 62 +++++++++++++++++++-
 .../js/flexjs/TestFlexJSGlobalClasses.java      |  6 +-
 7 files changed, 96 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
index 057bcf1..b94d0b0 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
@@ -50,6 +50,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
     private List<String> classIgnoreList;
     private List<String> ignoreList;
     private List<String> coercionList;
+    public boolean emitStringConversions = true;
 
     public JSFlexJSDocEmitter(IJSEmitter emitter)
     {
@@ -102,6 +103,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
     {
         coercionList = null;
         ignoreList = null;
+        emitStringConversions = true;
 
         IClassDefinition classDefinition = resolveClassDefinition(node);
 
@@ -167,6 +169,10 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
                         		.getToken();
 		                if (docText.contains(ignoreToken))
 		                    loadIgnores(docText);
+                        String noStringToken = JSFlexJSEmitterTokens.IGNORE_STRING_COERCION
+                        		.getToken();
+		                if (docText.contains(noStringToken))
+		                    emitStringConversions = false;
                         write(changeAnnotations(asDoc.commentNoEnd()));
                     }
                     else

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/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 67623a9..2e24236 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
@@ -39,6 +39,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     EMIT_COERCION("@flexjsemitcoercion"),
     IGNORE_COERCION("@flexjsignorecoercion"),
     IGNORE_IMPORT("@flexjsignoreimport"),
+    IGNORE_STRING_COERCION("@flexjsnoimplicitstringconversion"),
     PREINCREMENT("preincrement"),
     PREDECREMENT("predecrement"),
     POSTINCREMENT("postincrement"),

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/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 35e1364..87e07c5 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
@@ -19,12 +19,16 @@
 
 package org.apache.flex.compiler.internal.codegen.js.jx;
 
+import java.util.List;
+
+import org.apache.flex.compiler.asdoc.flexjs.ASDocComment;
 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.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter;
+import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSDocEmitter;
 import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
 import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
@@ -39,6 +43,7 @@ import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
 import org.apache.flex.compiler.tree.as.IExpressionNode;
+import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IIdentifierNode;
 import org.apache.flex.compiler.utils.ASNodeUtils;
 
@@ -287,8 +292,8 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
             				fjs.isXMLList(mae);
             	}
             }
-            super_emitBinaryOperator(node, leftIsNumber, rightIsNumber);
-            if (leftDef != null && leftDef.getQualifiedName().equals(IASLanguageConstants.String))
+            String coercion = (leftIsNumber && !rightIsNumber) ? "Number(" : "";
+            if (isAssignment && leftDef != null && leftDef.getQualifiedName().equals(IASLanguageConstants.String))
             {
             	if (rNode.getNodeID() != ASTNodeID.LiteralStringID &&
             			rNode.getNodeID() != ASTNodeID.LiteralNullID)
@@ -299,11 +304,16 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
 		        			  (!isAssignment && rightIsNumber) ||
 		        			   rightDef.getQualifiedName().equals(IASLanguageConstants.Null))))
 		        	{
-		        		write(".toString()");
+		        		JSFlexJSDocEmitter docEmitter = (JSFlexJSDocEmitter)(getEmitter().getDocEmitter());
+		        		if (docEmitter.emitStringConversions)
+		        		{
+		        			coercion = "org.apache.flex.utils.Language.string(";
+		        		}
 		        	}
             	}
             }
-            if (leftIsNumber && !rightIsNumber)
+            super_emitBinaryOperator(node, coercion);
+            if (coercion.length() > 0)
             	write(")");
             	
             /*
@@ -372,7 +382,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
         }
     }
 
-    private void super_emitBinaryOperator(IBinaryOperatorNode node, boolean leftIsNumber, boolean rightIsNumber)
+    private void super_emitBinaryOperator(IBinaryOperatorNode node, String coercion)
     {
         if (ASNodeUtils.hasParenOpen(node))
             write(ASEmitterTokens.PAREN_OPEN);
@@ -441,8 +451,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
             write(ASEmitterTokens.SPACE);
             endMapping(node);
 
-            if (leftIsNumber && !rightIsNumber)
-            	write("Number(");
+            write(coercion);
             /*
             IDefinition definition = node.getRightOperandNode().resolve(getProject());
         	if (definition instanceof FunctionDefinition &&

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/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 6beafcd..56c3fe9 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
@@ -132,15 +132,17 @@ public class VarDeclarationEmitter extends JSSubEmitter implements
             				fjs.isXMLList(mae);
             	}
             }
+            String coercion = "";
             if (varIsNumber && !valIsNumber)
-            	write("Number(");
-            fjs.emitAssignedValue(avnode);
+            	coercion = "Number(";
             if (variableTypeNode.getNodeID() == ASTNodeID.IdentifierID &&
-            	((IdentifierNode)variableTypeNode).getName().equals(IASLanguageConstants.String) &&
-            	(avdef == null || (!avdef.getQualifiedName().equals(IASLanguageConstants.String) &&
-            			            !avdef.getQualifiedName().equals(IASLanguageConstants.Null))))
-            	write(".toString()");
-            if (varIsNumber && !valIsNumber)
+                	((IdentifierNode)variableTypeNode).getName().equals(IASLanguageConstants.String) &&
+                	(avdef == null || (!avdef.getQualifiedName().equals(IASLanguageConstants.String) &&
+                			            !avdef.getQualifiedName().equals(IASLanguageConstants.Null))))
+                	coercion = "org.apache.flex.utils.Language.string(";
+            write(coercion);
+            fjs.emitAssignedValue(avnode);
+            if (coercion.length() > 0)
               	write(")");
         }
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java
index 4008b01..f39382d 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java
@@ -172,7 +172,7 @@ public class JSClosureCompilerWrapper
         String[] asdocTags = new String[] {"productversion", 
         		"playerversion", "langversion", "copy", 
         		"asparam", "asreturn", "asprivate",
-        		"flexjsignoreimport", "flexjsignorecoercion"};
+        		"flexjsignoreimport", "flexjsignorecoercion", "flexjsnoimplicitstringconversion"};
         options_.setExtraAnnotationNames(Arrays.asList(asdocTags));
     }
     

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/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 64b9cc2..20c16f1 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
@@ -19,11 +19,14 @@
 
 package org.apache.flex.compiler.internal.codegen.js.flexjs;
 
+import org.apache.flex.compiler.clients.MXMLJSC;
 import org.apache.flex.compiler.definitions.IClassDefinition;
 import org.apache.flex.compiler.driver.IBackend;
+import org.apache.flex.compiler.exceptions.ConfigurationException;
 import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogExpressions;
 import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
 import org.apache.flex.compiler.internal.driver.js.goog.JSGoogConfiguration;
+import org.apache.flex.compiler.internal.parsing.as.FlexJSASDocDelegate;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.internal.tree.as.ClassNode;
 import org.apache.flex.compiler.internal.tree.as.LiteralNode;
@@ -42,12 +45,21 @@ import org.junit.Test;
  * @author Erik de Bruin
  */
 public class TestFlexJSExpressions extends TestGoogExpressions
-{
+ {
     @Override
     public void setUp()
     {
     	project = new FlexJSProject(workspace);
-    	((FlexJSProject)project).config = new JSGoogConfiguration();
+        workspace.setASDocDelegate(new FlexJSASDocDelegate());
+    	JSGoogConfiguration config = new JSGoogConfiguration();
+    	try {
+			config.setKeepASDoc(null, true);
+		} catch (ConfigurationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		MXMLJSC.keepASDoc = true;
+    	((FlexJSProject)project).config = config;
         super.setUp();
     }
 
@@ -556,6 +568,52 @@ public class TestFlexJSExpressions extends TestGoogExpressions
     }
 
     @Test
+    public void testVisitBinaryOperatorNode_StringVarAssignmentFromObject()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public var b:String; public var c:Object; public function d() { b = c; }}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("this.b = org.apache.flex.utils.Language.string(this.c)");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_StringVarAssignmentFromObjectSupressed()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public var b:String; public var c:Object; /**\n * @flexjsnoimplicitstringconversion\n */\npublic function d() { b = c; }}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        JSFlexJSDocEmitter docEmitter = (JSFlexJSDocEmitter)(asBlockWalker.getEmitter().getDocEmitter());
+        IFunctionNode methodNode = (IFunctionNode)(node.getAncestorOfType(IFunctionNode.class));
+        
+        // this adds '/**\n * @flexjsnoimplicitstringconversion\n * @export\n */' to the output but parses
+        // the asdoc so the emitter will suppress the output
+        docEmitter.emitMethodDoc(methodNode, asBlockWalker.getProject());
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("/**\n * @flexjsnoimplicitstringconversion\n * @export\n */\nthis.b = this.c");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_StringVarCompareWithObject()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public var b:String; public var c:Object; public function c() { b == c; }}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("this.b == this.c");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_StringVarInObject()
+    {
+        IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+                "public class B {public var b:String; public var c:Object; public function c() { if (b in c); }}",
+                IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("this.b in this.c");
+    }
+
+    @Test
     public void testNamedFunctionAsArgument()
     {
         IFunctionNode node = (IFunctionNode) getNode(

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/fff63d36/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 5e2d3a9..fa17867 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
@@ -480,7 +480,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         IASNode parentNode = node.getParent();
         node = (IVariableNode) parentNode.getChild(1);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {string} */ b = a.name().toString()");
+        assertOut("var /** @type {string} */ b = org.apache.flex.utils.Language.string(a.name())");
     }
     
     @Test
@@ -520,7 +520,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         IASNode parentNode = node.getParent();
         node = (IVariableNode) parentNode.getChild(1);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {string} */ b = a.attribute('attr1').toString()");
+        assertOut("var /** @type {string} */ b = org.apache.flex.utils.Language.string(a.attribute('attr1'))");
     }
     
     @Test
@@ -528,7 +528,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
     	IBinaryOperatorNode node = (IBinaryOperatorNode)getNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:String; b = a.@attr1;", IBinaryOperatorNode.class);
         asBlockWalker.visitBinaryOperator(node);
-        assertOut("b = a.attribute('attr1').toString()");
+        assertOut("b = org.apache.flex.utils.Language.string(a.attribute('attr1'))");
     }
     
     @Test