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/master Commit: fff63d3673d9b0a288778efa2ae04f2c52073889 Parents: 8f68c66 Author: Alex Harui <[email protected]> Authored: Tue Aug 9 13:45:41 2016 -0700 Committer: Alex Harui <[email protected]> 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
