Language.string needed a cast. I just committed a fix for that. I think it was a side effect of Josh fixing string casting… ;-)
Harbs > On Jan 29, 2019, at 12:46 PM, Piotr Zarzycki <piotrzarzyck...@gmail.com> > wrote: > > Hi Josh, > > I'm not sure if it's related but I just build two applications using latest > sources and both of them are not working. I'm getting following error in > console [1] > It happened in function: > > org.apache.royale.utils.Language.string = function(value) { > return org.apache.royale.utils.Language.string(value == null ? null : > value.toString()); > }; > > [1] https://imgur.com/a/XemjI5P > > Thanks, > Piotr > > wt., 29 sty 2019 o 00:25 <joshtynj...@apache.org> napisał(a): > >> This is an automated email from the ASF dual-hosted git repository. >> >> joshtynjala pushed a commit to branch develop >> in repository https://gitbox.apache.org/repos/asf/royale-compiler.git >> >> >> The following commit(s) were added to refs/heads/develop by this push: >> new afb00e4 compiler-jx: Assigning a value to an int or uint coerces >> it so that variables don't store decimal values (closes #74) >> afb00e4 is described below >> >> commit afb00e48c74476618811bfb37cc830e78e700753 >> Author: Josh Tynjala <joshtynj...@apache.org> >> AuthorDate: Mon Jan 28 15:18:56 2019 -0800 >> >> compiler-jx: Assigning a value to an int or uint coerces it so that >> variables don't store decimal values (closes #74) >> >> Applies to variable declarations, the assignment binary operator, >> returning a value from a function, and passing an argument to a function. >> >> In the case of return statements and parameters, I included some other >> basic coercions to make it more consistent with what was already there for >> variable declarations and assignment. There was some coercion related to >> dynamic array access and XML that should probably also be shared, but I >> left that out for now because those ones in particular could use some >> cleanup. The new return statements and parameters currently call a shared >> IJSEmitter.emitAssignmentCoercion(). Ideally, all four [...] >> --- >> .../royale/compiler/codegen/js/IJSEmitter.java | 3 + >> .../compiler/internal/codegen/js/JSEmitter.java | 87 ++++++++++++ >> .../codegen/js/jx/BinaryOperatorEmitter.java | 116 ++++++++++++---- >> .../js/jx/FunctionCallArgumentsEmitter.java | 29 +++- >> .../internal/codegen/js/jx/ReturnEmitter.java | 14 +- >> .../codegen/js/jx/VarDeclarationEmitter.java | 86 ++++++++++-- >> .../codegen/js/goog/TestGoogAccessorMembers.java | 4 +- >> .../internal/codegen/js/goog/TestGoogEmitter.java | 2 +- >> .../codegen/js/royale/TestRoyaleClass.java | 36 +++++ >> .../codegen/js/royale/TestRoyaleEmitter.java | 2 +- >> .../codegen/js/royale/TestRoyaleExpressions.java | 152 >> +++++++++++++++------ >> .../codegen/js/royale/TestRoyaleGlobalClasses.java | 10 +- >> .../js/royale/TestRoyaleGlobalFunctions.java | 4 +- >> .../codegen/js/royale/TestRoyaleMethodMembers.java | 4 +- >> .../codegen/js/royale/TestRoyaleStatements.java | 18 +++ >> 15 files changed, 473 insertions(+), 94 deletions(-) >> >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java >> index 5dffb4d..b68f9f0 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java >> @@ -25,6 +25,7 @@ import org.apache.royale.compiler.codegen.as.IASEmitter; >> import org.apache.royale.compiler.definitions.IDefinition; >> import org.apache.royale.compiler.internal.codegen.js.JSSessionModel; >> import org.apache.royale.compiler.tree.as.IASNode; >> +import org.apache.royale.compiler.tree.as.IExpressionNode; >> import org.apache.royale.compiler.tree.as.ITypeNode; >> import org.apache.royale.compiler.visitor.IASNodeStrategy; >> >> @@ -45,4 +46,6 @@ public interface IJSEmitter extends IASEmitter, >> IMappingEmitter >> >> void emitClosureStart(); >> void emitClosureEnd(IASNode node, IDefinition nodeDef); >> + >> + void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition >> definition); >> } >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java >> index 6b2b8e2..997c562 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java >> @@ -28,6 +28,7 @@ import org.apache.royale.compiler.codegen.ISubEmitter; >> import org.apache.royale.compiler.codegen.js.IJSEmitter; >> import org.apache.royale.compiler.codegen.js.IMappingEmitter; >> import org.apache.royale.compiler.common.ISourceLocation; >> +import >> org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType; >> import org.apache.royale.compiler.definitions.IDefinition; >> import org.apache.royale.compiler.internal.codegen.as.ASEmitter; >> import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; >> @@ -58,11 +59,13 @@ import >> org.apache.royale.compiler.internal.codegen.js.jx.UnaryOperatorEmitter; >> import org.apache.royale.compiler.internal.codegen.js.jx.WhileLoopEmitter; >> import org.apache.royale.compiler.internal.codegen.js.jx.WithEmitter; >> import org.apache.royale.compiler.internal.tree.as.FunctionNode; >> +import org.apache.royale.compiler.projects.ICompilerProject; >> import org.apache.royale.compiler.tree.as.IASNode; >> import org.apache.royale.compiler.tree.as.ICatchNode; >> import org.apache.royale.compiler.tree.as.IContainerNode; >> import org.apache.royale.compiler.tree.as.IDefinitionNode; >> import org.apache.royale.compiler.tree.as.IDynamicAccessNode; >> +import org.apache.royale.compiler.tree.as.IExpressionNode; >> import org.apache.royale.compiler.tree.as.IForLoopNode; >> import org.apache.royale.compiler.tree.as.IFunctionNode; >> import org.apache.royale.compiler.tree.as.IFunctionObjectNode; >> @@ -515,4 +518,88 @@ public class JSEmitter extends ASEmitter implements >> IJSEmitter >> return className.replace(".", "_") + "_" + name; >> } >> >> + public void emitAssignmentCoercion(IExpressionNode assignedNode, >> IDefinition definition) >> + { >> + IDefinition assignedDef = null; >> + ICompilerProject project = getWalker().getProject(); >> + if (assignedNode != null) >> + { >> + assignedDef = assignedNode.resolveType(project); >> + } >> + String coercionStart = null; >> + String coercionEnd = null; >> + if >> (project.getBuiltinType(BuiltinType.INT).equals(definition)) >> + { >> + boolean needsCoercion = false; >> + if (assignedNode instanceof INumericLiteralNode) >> + { >> + INumericLiteralNode numericLiteral = >> (INumericLiteralNode) assignedNode; >> + if >> (!BuiltinType.INT.equals(numericLiteral.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = true; >> + } >> + } >> + else >> if(!project.getBuiltinType(BuiltinType.INT).equals(assignedDef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >> 0"; >> + } >> + } >> + else if >> (project.getBuiltinType(BuiltinType.UINT).equals(definition)) >> + { >> + boolean needsCoercion = false; >> + if (assignedNode instanceof INumericLiteralNode) >> + { >> + INumericLiteralNode numericLiteral = >> (INumericLiteralNode) assignedNode; >> + if >> (!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = true; >> + } >> + } >> + else >> if(!project.getBuiltinType(BuiltinType.UINT).equals(assignedDef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >>> 0"; >> + } >> + } >> + else if >> (project.getBuiltinType(BuiltinType.NUMBER).equals(definition) >> + && >> !project.getBuiltinType(BuiltinType.NUMBER).equals(assignedDef) >> + && >> !project.getBuiltinType(BuiltinType.INT).equals(assignedDef) >> + && >> !project.getBuiltinType(BuiltinType.UINT).equals(assignedDef)) >> + { >> + coercionStart = "Number("; >> + } >> + else if >> (project.getBuiltinType(BuiltinType.STRING).equals(definition) >> + && >> !project.getBuiltinType(BuiltinType.STRING).equals(assignedDef) >> + && >> !project.getBuiltinType(BuiltinType.NULL).equals(assignedDef)) >> + { >> + coercionStart = "org.apache.royale.utils.Language.string("; >> + } >> + >> + if (coercionStart != null) >> + { >> + write(coercionStart); >> + } >> + getWalker().walk(assignedNode); >> + if (coercionStart != null) >> + { >> + if (coercionEnd != null) >> + { >> + write(coercionEnd); >> + } >> + else >> + { >> + write(")"); >> + } >> + } >> + } >> + >> } >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java >> index 756c3d8..ff09dd4 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java >> @@ -22,6 +22,7 @@ package >> org.apache.royale.compiler.internal.codegen.js.jx; >> import org.apache.royale.compiler.codegen.ISubEmitter; >> import org.apache.royale.compiler.codegen.js.IJSEmitter; >> import org.apache.royale.compiler.constants.IASLanguageConstants; >> +import >> org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType; >> import org.apache.royale.compiler.definitions.IDefinition; >> import org.apache.royale.compiler.definitions.ITypeDefinition; >> import org.apache.royale.compiler.definitions.metadata.IMetaTag; >> @@ -45,6 +46,7 @@ import >> org.apache.royale.compiler.tree.as.IBinaryOperatorNode; >> import org.apache.royale.compiler.tree.as.IClassNode; >> import org.apache.royale.compiler.tree.as.IExpressionNode; >> import org.apache.royale.compiler.tree.as.IIdentifierNode; >> +import org.apache.royale.compiler.tree.as.INumericLiteralNode; >> import org.apache.royale.compiler.utils.ASNodeUtils; >> >> public class BinaryOperatorEmitter extends JSSubEmitter implements >> @@ -444,32 +446,91 @@ public class BinaryOperatorEmitter extends >> JSSubEmitter implements >> } >> } >> } >> - String coercion = (leftIsNumber && !rightIsNumber && >> isAssignment) ? "Number(" : ""; >> - if (isAssignment && leftDef != null && >> leftDef.getQualifiedName().equals(IASLanguageConstants.String)) >> + String coercionStart = null; >> + String coercionEnd = null; >> + if (isAssignment) >> { >> - if (rNode.getNodeID() != ASTNodeID.LiteralStringID && >> - rNode.getNodeID() != >> ASTNodeID.LiteralNullID) >> - { >> - 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)))) >> - { >> - JSRoyaleDocEmitter docEmitter = >> (JSRoyaleDocEmitter)(getEmitter().getDocEmitter()); >> - if >> (docEmitter.emitStringConversions) >> - { >> - coercion = >> "org.apache.royale.utils.Language.string("; >> - } >> - } >> - } >> + if >> (getProject().getBuiltinType(BuiltinType.INT).equals(leftDef)) >> + { >> + boolean needsCoercion = false; >> + if (rNode instanceof >> INumericLiteralNode) >> + { >> + INumericLiteralNode >> rNumber = (INumericLiteralNode) rNode; >> + if >> (!BuiltinType.INT.equals(rNumber.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = >> true; >> + } >> + } >> + else >> if(!getProject().getBuiltinType(BuiltinType.INT).equals(rightDef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >> 0"; >> + } >> + } >> + else if >> (getProject().getBuiltinType(BuiltinType.UINT).equals(leftDef)) >> + { >> + boolean needsCoercion = false; >> + if (rNode instanceof >> INumericLiteralNode) >> + { >> + INumericLiteralNode >> rNumber = (INumericLiteralNode) rNode; >> + if >> (!BuiltinType.UINT.equals(rNumber.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = >> true; >> + } >> + } >> + else >> if(!getProject().getBuiltinType(BuiltinType.UINT).equals(rightDef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >>> 0"; >> + } >> + } >> + else if (leftIsNumber && !rightIsNumber) >> + { >> + coercionStart = "Number("; >> + } >> + else if >> (getProject().getBuiltinType(BuiltinType.STRING).equals(leftDef)) >> + { >> + if (rNode.getNodeID() != >> ASTNodeID.LiteralStringID && >> + rNode.getNodeID() >> != ASTNodeID.LiteralNullID) >> + { >> + 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)))) >> + { >> + JSRoyaleDocEmitter >> docEmitter = (JSRoyaleDocEmitter)(getEmitter().getDocEmitter()); >> + if >> (docEmitter.emitStringConversions) >> + { >> + >> coercionStart = "org.apache.royale.utils.Language.string("; >> + } >> + } >> + } >> + } >> } >> - super_emitBinaryOperator(node, coercion); >> - if (coercion.length() > 0) >> - write(")"); >> + super_emitBinaryOperator(node, coercionStart); >> + if (coercionStart != null) >> + { >> + if (coercionEnd != null) >> + { >> + write(coercionEnd); >> + } >> + else >> + { >> + write(")"); >> + } >> + } >> >> /* >> IExpressionNode leftSide = node.getLeftOperandNode(); >> @@ -550,7 +611,7 @@ public class BinaryOperatorEmitter extends >> JSSubEmitter implements >> return false; >> } >> >> - private void super_emitBinaryOperator(IBinaryOperatorNode node, >> String coercion) >> + private void super_emitBinaryOperator(IBinaryOperatorNode node, >> String coercionStart) >> { >> if (ASNodeUtils.hasParenOpen(node)) >> write(ASEmitterTokens.PAREN_OPEN); >> @@ -617,7 +678,10 @@ public class BinaryOperatorEmitter extends >> JSSubEmitter implements >> write(ASEmitterTokens.SPACE); >> endMapping(node); >> >> - write(coercion); >> + if (coercionStart != null) >> + { >> + write(coercionStart); >> + } >> /* >> IDefinition definition = >> node.getRightOperandNode().resolve(getProject()); >> if (definition instanceof FunctionDefinition && >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java >> index bca4c59..40b6302 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java >> @@ -21,10 +21,14 @@ package >> org.apache.royale.compiler.internal.codegen.js.jx; >> >> import org.apache.royale.compiler.codegen.ISubEmitter; >> import org.apache.royale.compiler.codegen.js.IJSEmitter; >> +import org.apache.royale.compiler.definitions.IDefinition; >> +import org.apache.royale.compiler.definitions.IFunctionDefinition; >> +import org.apache.royale.compiler.definitions.IParameterDefinition; >> import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; >> import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter; >> import org.apache.royale.compiler.tree.as.IContainerNode; >> import org.apache.royale.compiler.tree.as.IExpressionNode; >> +import org.apache.royale.compiler.tree.as.IFunctionCallNode; >> >> public class FunctionCallArgumentsEmitter extends JSSubEmitter implements >> ISubEmitter<IContainerNode> >> @@ -41,11 +45,34 @@ public class FunctionCallArgumentsEmitter extends >> JSSubEmitter implements >> write(ASEmitterTokens.PAREN_OPEN); >> endMapping(node); >> >> + IParameterDefinition[] paramDefs = null; >> + IFunctionCallNode functionCallNode = (IFunctionCallNode) >> node.getAncestorOfType(IFunctionCallNode.class); >> + if (functionCallNode != null) >> + { >> + IDefinition calledDef = >> functionCallNode.resolveCalledExpression(getProject()); >> + if (calledDef instanceof IFunctionDefinition) >> + { >> + IFunctionDefinition functionDef = (IFunctionDefinition) >> calledDef; >> + paramDefs = functionDef.getParameters(); >> + } >> + } >> + >> int len = node.getChildCount(); >> for (int i = 0; i < len; i++) >> { >> IExpressionNode argumentNode = (IExpressionNode) >> node.getChild(i); >> - getWalker().walk(argumentNode); >> + IParameterDefinition paramDef = null; >> + if (paramDefs != null && paramDefs.length > i) >> + { >> + paramDef = paramDefs[i]; >> + if (paramDef.isRest()) >> + { >> + paramDef = null; >> + } >> + } >> + >> + getEmitter().emitAssignmentCoercion(argumentNode, paramDef); >> + >> if (i < len - 1) >> { >> //we're mapping the comma to the container, but we use the >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java >> index a7f5d7e..0573110 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java >> @@ -21,10 +21,12 @@ package >> org.apache.royale.compiler.internal.codegen.js.jx; >> >> import org.apache.royale.compiler.codegen.ISubEmitter; >> import org.apache.royale.compiler.codegen.js.IJSEmitter; >> +import org.apache.royale.compiler.definitions.IDefinition; >> import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; >> import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter; >> import org.apache.royale.compiler.tree.ASTNodeID; >> import org.apache.royale.compiler.tree.as.IExpressionNode; >> +import org.apache.royale.compiler.tree.as.IFunctionNode; >> import org.apache.royale.compiler.tree.as.IReturnNode; >> >> public class ReturnEmitter extends JSSubEmitter implements >> @@ -51,7 +53,17 @@ public class ReturnEmitter extends JSSubEmitter >> implements >> >> if (hasReturnValue) >> { >> - getWalker().walk(rnode); >> + IDefinition returnDef = null; >> + IFunctionNode parentFn = (IFunctionNode) >> node.getAncestorOfType(IFunctionNode.class); >> + if (parentFn != null) >> + { >> + IExpressionNode returnTypeNode = >> parentFn.getReturnTypeNode(); >> + if (returnTypeNode != null) >> + { >> + returnDef = returnTypeNode.resolve(getProject()); >> + } >> + } >> + getEmitter().emitAssignmentCoercion(rnode, returnDef); >> } >> } >> } >> diff --git >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java >> index 90dbd7b..01c4a6f 100644 >> --- >> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java >> +++ >> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java >> @@ -23,6 +23,7 @@ import org.apache.royale.compiler.codegen.ISubEmitter; >> import org.apache.royale.compiler.codegen.js.IJSEmitter; >> import org.apache.royale.compiler.constants.IASKeywordConstants; >> import org.apache.royale.compiler.constants.IASLanguageConstants; >> +import >> org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType; >> import org.apache.royale.compiler.definitions.IDefinition; >> import org.apache.royale.compiler.definitions.metadata.IMetaTag; >> import org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute; >> @@ -40,6 +41,7 @@ import org.apache.royale.compiler.tree.ASTNodeID; >> import org.apache.royale.compiler.tree.as.IASNode; >> import org.apache.royale.compiler.tree.as.IEmbedNode; >> import org.apache.royale.compiler.tree.as.IExpressionNode; >> +import org.apache.royale.compiler.tree.as.INumericLiteralNode; >> import org.apache.royale.compiler.tree.as.IVariableNode; >> >> public class VarDeclarationEmitter extends JSSubEmitter implements >> @@ -65,9 +67,11 @@ public class VarDeclarationEmitter extends JSSubEmitter >> implements >> } >> >> IExpressionNode variableTypeNode = node.getVariableTypeNode(); >> + IDefinition variableDef = null; >> boolean hasVariableType = variableTypeNode.getLine() >= 0; >> if(hasVariableType) >> { >> + variableDef = variableTypeNode.resolve(getProject()); >> startMapping(variableTypeNode, >> variableTypeNode.getLine(), >> variableTypeNode.getColumn() - 1); //include the : >> @@ -173,20 +177,76 @@ public class VarDeclarationEmitter extends >> JSSubEmitter implements >> } >> } >> } >> - String coercion = ""; >> - if (varIsNumber && !valIsNumber) >> - coercion = "Number("; >> - //else if (varIsNumber && valIsNumber && varIsInt && >> !valIsInt) >> - // coercion = "Math.floor("; >> - if (variableTypeNode.getNodeID() == ASTNodeID.IdentifierID && >> - >> ((IdentifierNode)variableTypeNode).getName().equals(IASLanguageConstants.String) >> && >> - (avdef == null || >> (!avdef.getQualifiedName().equals(IASLanguageConstants.String) && >> - >> !avdef.getQualifiedName().equals(IASLanguageConstants.Null)))) >> - coercion = >> "org.apache.royale.utils.Language.string("; >> - write(coercion); >> + String coercionStart = null; >> + String coercionEnd = null; >> + if >> (getProject().getBuiltinType(BuiltinType.INT).equals(variableDef)) >> + { >> + boolean needsCoercion = false; >> + if (avnode instanceof INumericLiteralNode) >> + { >> + INumericLiteralNode numericLiteral = >> (INumericLiteralNode) avnode; >> + if >> (!BuiltinType.INT.equals(numericLiteral.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = true; >> + } >> + } >> + else >> if(!getProject().getBuiltinType(BuiltinType.INT).equals(avdef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >> 0"; >> + } >> + } >> + else if >> (getProject().getBuiltinType(BuiltinType.UINT).equals(variableDef)) >> + { >> + boolean needsCoercion = false; >> + if (avnode instanceof INumericLiteralNode) >> + { >> + INumericLiteralNode numericLiteral = >> (INumericLiteralNode) avnode; >> + if >> (!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType())) >> + { >> + needsCoercion = true; >> + } >> + } >> + else >> if(!getProject().getBuiltinType(BuiltinType.UINT).equals(avdef)) >> + { >> + needsCoercion = true; >> + } >> + if (needsCoercion) >> + { >> + coercionStart = "("; >> + coercionEnd = ") >>> 0"; >> + } >> + } >> + else if (varIsNumber && !valIsNumber) >> + { >> + coercionStart = "Number("; >> + } >> + else if >> (getProject().getBuiltinType(BuiltinType.STRING).equals(variableDef) && >> + >> !getProject().getBuiltinType(BuiltinType.STRING).equals(avdef) && >> + >> !getProject().getBuiltinType(BuiltinType.NULL).equals(avdef)) >> + { >> + coercionStart = >> "org.apache.royale.utils.Language.string("; >> + } >> + if (coercionStart != null) >> + { >> + write(coercionStart); >> + } >> fjs.emitAssignedValue(avnode); >> - if (coercion.length() > 0) >> - write(")"); >> + if (coercionStart != null) >> + { >> + if (coercionEnd != null) >> + { >> + write(coercionEnd); >> + } >> + else >> + { >> + write(")"); >> + } >> + } >> } >> if (avnode == null) >> { >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java >> index 3fd051d..69ae550 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java >> @@ -98,10 +98,10 @@ public class TestGoogAccessorMembers extends >> TestAccessorMembers >> @Test >> public void testSetAccessor_withBody() >> { >> - ISetterNode node = (ISetterNode) getAccessor("function set >> foo(value:int):void{trace('haai');}"); >> + ISetterNode node = (ISetterNode) getAccessor("function set >> foo(value:int):void{'haai';}"); >> asBlockWalker.visitSetter(node); >> assertOut("Object.defineProperty(\n\tRoyaleTest_A.prototype, >> \n\t'foo', " >> - + "\n\t{set:function(value) {\n\t\tvar self = >> this;\n\t\ttrace('haai');\n\t}, configurable:true}\n)"); >> + + "\n\t{set:function(value) {\n\t\tvar self = >> this;\n\t\t'haai';\n\t}, configurable:true}\n)"); >> } >> >> @Override >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java >> index 6fe906d..c40adb9 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java >> @@ -111,7 +111,7 @@ public class TestGoogEmitter extends ASTestBase >> @Test >> public void testDefaultParameter() >> { >> - IFunctionNode node = getMethodWithPackage("function >> method1(p1:int, p2:int, p3:int = 3, p4:int = 4):int{return p1 + p2 + p3 + >> p4;}"); >> + IFunctionNode node = getMethodWithPackage("function >> method1(p1:Number, p2:Number, p3:Number = 3, p4:Number = 4):Number{return >> p1 + p2 + p3 + p4;}"); >> asBlockWalker.visitFunction(node); >> assertOut("/**\n * @param {number} p1\n * @param {number} p2\n * >> @param {number=} p3\n * @param {number=} p4\n * @return {number}\n */\n" >> + "foo.bar.RoyaleTest_A.prototype.method1 = function(p1, >> p2, p3, p4) {\n" >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java >> index f496a4e..ecc034a 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java >> @@ -149,6 +149,42 @@ public class TestRoyaleClass extends TestGoogClass >> } >> >> @Test >> + public void testMethod_returnInt() >> + { >> + IClassNode node = getClassNode("public class B {public function >> B() {}; public function foo():int { var a:Number = 123.4; return a; };}"); >> + asBlockWalker.visitClass(node); >> + String expected = "/**\n * @constructor\n */\norg.apache.royale.B >> = function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for >> reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', >> org.apache.royale.B);\n\n\n/**\n * @export\n >> */\norg.apache.royale.B.prototype.foo = function() {\n var a /** @type >> {number} */ = 123.4;\n return (a) >> 0;\n};"; >> + assertOut(expected); >> + } >> + >> + @Test >> + public void testMethod_returnIntLiteral() >> + { >> + IClassNode node = getClassNode("public class B {public function >> B() {}; public function foo():int { return 123.4 };}"); >> + asBlockWalker.visitClass(node); >> + String expected = "/**\n * @constructor\n */\norg.apache.royale.B >> = function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for >> reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', >> org.apache.royale.B);\n\n\n/**\n * @export\n >> */\norg.apache.royale.B.prototype.foo = function() {\n return (123.4) >> >> 0;\n};"; >> + assertOut(expected); >> + } >> + >> + @Test >> + public void testMethod_returnUint() >> + { >> + IClassNode node = getClassNode("public class B {public function >> B() {}; public function foo():uint { var a:Number = 123.4; return a; };}"); >> + asBlockWalker.visitClass(node); >> + String expected = "/**\n * @constructor\n */\norg.apache.royale.B >> = function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for >> reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', >> org.apache.royale.B);\n\n\n/**\n * @export\n >> */\norg.apache.royale.B.prototype.foo = function() {\n var a /** @type >> {number} */ = 123.4;\n return (a) >>> 0;\n};"; >> + assertOut(expected); >> + } >> + >> + @Test >> + public void testMethod_returnUintLiteral() >> + { >> + IClassNode node = getClassNode("public class B {public function >> B() {}; public function foo():uint { return 123.4 };}"); >> + asBlockWalker.visitClass(node); >> + String expected = "/**\n * @constructor\n */\norg.apache.royale.B >> = function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for >> reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', >> org.apache.royale.B);\n\n\n/**\n * @export\n >> */\norg.apache.royale.B.prototype.foo = function() {\n return (123.4) >>> >> 0;\n};"; >> + assertOut(expected); >> + } >> + >> + @Test >> public void testMethod_override() >> { >> IClassNode node = getClassNode("public class B {public function >> B() {}; override public function foo():void {};}"); >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java >> index e8c40a8..25fccbb 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java >> @@ -330,7 +330,7 @@ public class TestRoyaleEmitter extends TestGoogEmitter >> @Test >> public void testDefaultParameter() >> { >> - IFunctionNode node = getMethodWithPackage("function >> method1(p1:int, p2:int, p3:int = 3, p4:int = 4):int{return p1 + p2 + p3 + >> p4;}"); >> + IFunctionNode node = getMethodWithPackage("function >> method1(p1:Number, p2:Number, p3:Number = 3, p4:Number = 4):Number{return >> p1 + p2 + p3 + p4;}"); >> asBlockWalker.visitFunction(node); >> assertOut("/**\n * @param {number} p1\n * @param {number} p2\n * >> @param {number=} p3\n * @param {number=} p4\n * @return {number}\n */\n" >> + "foo.bar.RoyaleTest_A.prototype.method1 = function(p1, >> p2, p3, p4) {\n" >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java >> index 713c26f..7aeb0f6 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java >> @@ -269,10 +269,82 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> } >> >> @Test >> + public void testVisitBinaryOperatorNode_AssignmentIntVarToInt() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var integer1:int;var >> integer2:int;integer1 = integer2"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("integer1 = integer2"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentNumberVarToInt() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var integer:int;var >> number:Number;integer = number"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("integer = (number) >> 0"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentUintVarToInt() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var integer:int;var >> unsigned_integer:uint;integer = unsigned_integer"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("integer = (unsigned_integer) >> 0"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentNumberLiteralToInt() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> numToInt:int;numToInt = 123.4"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("numToInt = (123.4) >> 0"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentIntLiteralToInt() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> numToInt:int;numToInt = 321"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("numToInt = 321"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentUintVarToUint() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> unsigned_integer1:uint;var unsigned_integer2:uint;unsigned_integer1 = >> unsigned_integer2"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("unsigned_integer1 = unsigned_integer2"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentNumberVarToUint() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> unsigned_integer:uint;var number:Number;unsigned_integer = number"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("unsigned_integer = (number) >>> 0"); >> + } >> + >> + @Test >> + public void testVisitBinaryOperatorNode_AssignmentIntVarToUint() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> unsigned_integer:uint;var integer:int;unsigned_integer = integer"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("unsigned_integer = (integer) >>> 0"); >> + } >> + >> + @Test >> + public void >> testVisitBinaryOperatorNode_AssignmentNumberLiteralToUint() >> + { >> + IBinaryOperatorNode node = getBinaryNode("var >> numToUint:uint;numToUint = 123.4"); >> + asBlockWalker.visitBinaryOperator(node); >> + assertOut("numToUint = (123.4) >>> 0"); >> + } >> + >> + @Test >> public void testVisitBinaryOperatorNode_setterAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c() { b = 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c() { b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -282,7 +354,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_setterAssignmentWithThis() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c() { this.b = 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c() { this.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -292,7 +364,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_setterAssignmentPrivate() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function get b():int { return 0; >> } private function set b(value:int):void {}; public function test() { >> this.b = 1; }}", >> + "public class B {public function get b():Number { return >> 0; } private function set b(value:Number):void {}; public function test() { >> this.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -302,7 +374,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_setterAssignmentPrivateWithNamespace() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function get b():int { return 0; >> } private function set b(value:int):void {}; public function test() { >> this.private::b = 1; }}", >> + "public class B {public function get b():Number { return >> 0; } private function set b(value:Number):void {}; public function test() { >> this.private::b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -316,7 +388,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> // disconnect fileNode from parent >> // set thisclass on emitter to class def >> IFileNode node = (IFileNode) getNode( >> - "public class B { public function c() { this.b = 1; }; >> public function set b(value:int):void {}}", >> + "public class B { public function c() { this.b = 1; }; >> public function set b(value:Number):void {}}", >> IFileNode.class, WRAP_LEVEL_PACKAGE, true); >> IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType( >> node, IFunctionNode.class); >> @@ -340,7 +412,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> // disconnect fileNode from parent >> // set thisclass on emitter to class def >> IFileNode node = (IFileNode) getNode( >> - "public class B { public function c() { b = 1; }; public >> function set b(value:int):void {}}", >> + "public class B { public function c() { b = 1; }; public >> function set b(value:Number):void {}}", >> IFileNode.class, WRAP_LEVEL_PACKAGE, true); >> IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType( >> node, IFunctionNode.class); >> @@ -360,7 +432,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_setterAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c(other:B) { other.b = 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c(other:B) { other.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.b = 1"); >> @@ -370,7 +442,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_nestedSetterAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function get d():B {}; public function c(other:B) { d.d.b = 1; >> }}", >> + "public class B {public function set b(value:Number):void >> {}; public function get d():B {}; public function c(other:B) { d.d.b = 1; >> }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.d.d.b = 1"); >> @@ -380,7 +452,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_nestedSetterAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function get d():B {}; public function c(other:B) { other.d.b = >> 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function get d():B {}; public function c(other:B) { other.d.b = >> 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.d.b = 1"); >> @@ -390,7 +462,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_setterAssignmentFromGetter() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c() { b = b + 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c() { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = this.b + 1"); >> @@ -400,7 +472,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_setterAssignmentFromGetterMaskedByLocal() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c() { var b:int; b = b + 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c() { var b:Number; b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -410,7 +482,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_setterAssignmentFromGetterMaskedByParam() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public function set b(value:int):void >> {}; public function c(b:int) { b = b + 1; }}", >> + "public class B {public function set b(value:Number):void >> {}; public function c(b:Number) { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -420,7 +492,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_setterAssignmentFromInternalVar() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {var b:int; public function c() { b = b + >> 1; }}", >> + "public class B {var b:Number; public function c() { b = >> b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = this.b + 1"); >> @@ -430,7 +502,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentFromInternalVar() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {static var b:int; public function c() { >> b = b + 1; }}", >> + "public class B {static var b:Number; public function c() >> { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("B.b = B.b + 1"); >> @@ -440,7 +512,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_bindableAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c() { b = 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c() { b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -450,7 +522,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_bindableAssignmentWithThis() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c() { this.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c() { this.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -460,7 +532,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_bindableAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c(other:B) { other.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c(other:B) { other.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.b = 1"); >> @@ -470,7 +542,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_bindableSetterAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; [Bindable] >> public var d:B; public function c(other:B) { d.d.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; >> [Bindable] public var d:B; public function c(other:B) { d.d.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.d.d.b = 1"); >> @@ -480,7 +552,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_bindableSetterAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; [Bindable] >> public var d:B; public function c(other:B) { other.d.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; >> [Bindable] public var d:B; public function c(other:B) { other.d.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.d.b = 1"); >> @@ -490,7 +562,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_bindableAssignmentFromGetter() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c() { b = b + 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c() { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = this.b + 1"); >> @@ -500,7 +572,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_bindableAssignmentFromGetterMaskedByLocal() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c() { var b:int; b = b + 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c() { var b:Number; b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -510,7 +582,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_bindableAssignmentFromGetterMaskedByParam() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public >> function c(b:int) { b = b + 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> function c(b:Number) { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -520,7 +592,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function c() { >> b = 1; }}", >> + "public class B {public var b:Number; public function c() >> { b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -530,7 +602,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varAssignmentWithThis() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function c() { >> this.b = 1; }}", >> + "public class B {public var b:Number; public function c() >> { this.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = 1"); >> @@ -540,7 +612,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function >> c(other:B) { other.b = 1; }}", >> + "public class B {public var b:Number; public function >> c(other:B) { other.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.b = 1"); >> @@ -550,7 +622,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varSetterAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public var >> d:B; public function c(other:B) { d.d.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> var d:B; public function c(other:B) { d.d.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.d.d.b = 1"); >> @@ -560,7 +632,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varVarAssignment() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public var d:B; public >> function c(other:B) { d.d.b = 1; }}", >> + "public class B {public var b:Number; public var d:B; >> public function c(other:B) { d.d.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.d.d.b = 1"); >> @@ -570,7 +642,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_varSetterAssignmentOtherInstance() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {[Bindable] public var b:int; public var >> d:B; public function c(other:B) { other.d.b = 1; }}", >> + "public class B {[Bindable] public var b:Number; public >> var d:B; public function c(other:B) { other.d.b = 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("other.d.b = 1"); >> @@ -580,7 +652,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_varAssignmentFromVar() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function c() { >> b = b + 1; }}", >> + "public class B {public var b:Number; public function c() >> { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("this.b = this.b + 1"); >> @@ -590,7 +662,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_varAssignmentFromVarMaskedByLocal() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function c() { >> var b:int; b = b + 1; }}", >> + "public class B {public var b:Number; public function c() >> { var b:Number; b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -600,7 +672,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_varAssignmentFromVarMaskedByParam() >> { >> IBinaryOperatorNode node = (IBinaryOperatorNode) getNode( >> - "public class B {public var b:int; public function >> c(b:int) { b = b + 1; }}", >> + "public class B {public var b:Number; public function >> c(b:Number) { b = b + 1; }}", >> IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE); >> asBlockWalker.visitBinaryOperator(node); >> assertOut("b = b + 1"); >> @@ -610,7 +682,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testVisitBinaryOperatorNode_staticSetterAssignment() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c() { b = 1; }; public >> static function set b(value:int):void {}}", >> + "public class B {public function c() { b = 1; }; public >> static function set b(value:Number):void {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -622,7 +694,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentWithPath() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c() { foo.bar.B.b = 1; >> }; public static function set b(value:int):void {}}", >> + "public class B {public function c() { foo.bar.B.b = 1; >> }; public static function set b(value:Number):void {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -634,7 +706,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentOtherInstance() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c() { d.b = 1; }; public >> function set b(value:int):void {}; public static function get d():B {}}", >> + "public class B {public function c() { d.b = 1; }; public >> function set b(value:Number):void {}; public static function get d():B {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -650,7 +722,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> // disconnect fileNode from parent >> // set thisclass on emitter to class def >> IFileNode node = (IFileNode) getNode( >> - "public class B {public function c() { d.b = 1; }; public >> function set b(value:int):void {}; public static function get d():B {}}", >> + "public class B {public function c() { d.b = 1; }; public >> function set b(value:Number):void {}; public static function get d():B {}}", >> IFileNode.class, WRAP_LEVEL_PACKAGE, true); >> IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType( >> node, IFunctionNode.class); >> @@ -670,7 +742,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentFromGetter() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c() { b = b + 1; }; >> public static function set b(value:int):void {}; public static function get >> b():int {}}", >> + "public class B {public function c() { b = b + 1; }; >> public static function set b(value:Number):void {}; public static function >> get b():Number {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -682,7 +754,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentFromGetterMaskedByLocal() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c() { var b:int; b = b + >> 1; }; public static function set b(value:int):void {}; public static >> function get b():int {}}", >> + "public class B {public function c() { var b:Number; b = >> b + 1; }; public static function set b(value:Number):void {}; public static >> function get b():Number {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -694,7 +766,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void >> testVisitBinaryOperatorNode_staticSetterAssignmentFromGetterMaskedByParam() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function c(b:int) { b = b + 1; }; >> public static function set b(value:int):void {}; public static function get >> b():int {}}", >> + "public class B {public function c(b:Number) { b = b + 1; >> }; public static function set b(value:Number):void {}; public static >> function get b():Number {}}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> IBinaryOperatorNode bnode = (IBinaryOperatorNode) >> findFirstDescendantOfType( >> node, IBinaryOperatorNode.class); >> @@ -1036,7 +1108,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testNativeGetter() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function b():int { var s:String; >> return s.length; }}", >> + "public class B {public function b():Number { var >> s:String; return s.length; }}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> asBlockWalker.visitFunction(node); >> // String.length is a getter but is a property in JS, so don't >> generate set_length() call. >> @@ -1047,7 +1119,7 @@ public class TestRoyaleExpressions extends >> TestGoogExpressions >> public void testNativeVectorGetter() >> { >> IFunctionNode node = (IFunctionNode) getNode( >> - "public class B {public function b():int { var >> a:Vector.<String>; return a.length; }}", >> + "public class B {public function b():Number { var >> a:Vector.<String>; return a.length; }}", >> IFunctionNode.class, WRAP_LEVEL_PACKAGE, true); >> asBlockWalker.visitFunction(node); >> // String.length is a getter but is a property in JS, so don't >> generate set_length() call. >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java >> index 77d148c..f823df8 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java >> @@ -675,7 +675,7 @@ public class TestRoyaleGlobalClasses extends >> TestGoogGlobalClasses >> IASNode parentNode = node.getParent(); >> node = (IVariableNode) parentNode.getChild(1); >> asBlockWalker.visitVariable(node); >> - assertOut("var /** @type {number} */ b = >> a.child('child').length()"); >> + assertOut("var /** @type {number} */ b = >> (a.child('child').length()) >> 0"); >> } >> >> @Test >> @@ -939,7 +939,7 @@ public class TestRoyaleGlobalClasses extends >> TestGoogGlobalClasses >> { >> IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top >> attr1='cat'><child attr2='dog'><grandchild >> attr3='fish'>text</grandchild></child></top>\");for each (var p:XMLList in >> a) var i:int = p.length();"); >> asBlockWalker.visitForLoop(node); >> - assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in >> foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> p.length();}\n"); >> + assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in >> foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> (p.length()) >> 0;}\n"); >> } >> >> @Test >> @@ -947,7 +947,7 @@ public class TestRoyaleGlobalClasses extends >> TestGoogGlobalClasses >> { >> IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in >> (a as XMLList)) var i:int = p.length();"); >> asBlockWalker.visitForLoop(node); >> - assertOut("var foreachiter0_target = >> org.apache.royale.utils.Language.as(a, XMLList);\nfor (var foreachiter0 >> in foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> p.length();}\n"); >> + assertOut("var foreachiter0_target = >> org.apache.royale.utils.Language.as(a, XMLList);\nfor (var foreachiter0 >> in foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> (p.length()) >> 0;}\n"); >> } >> >> @Test >> @@ -955,7 +955,7 @@ public class TestRoyaleGlobalClasses extends >> TestGoogGlobalClasses >> { >> IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in >> XMLList(a)) var i:int = p.length();"); >> asBlockWalker.visitForLoop(node); >> - assertOut("var foreachiter0_target = XMLList(a);\nfor (var >> foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> p.length();}\n"); >> + assertOut("var foreachiter0_target = XMLList(a);\nfor (var >> foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = >> foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = >> (p.length()) >> 0;}\n"); >> } >> >> @Test >> @@ -1074,7 +1074,7 @@ public class TestRoyaleGlobalClasses extends >> TestGoogGlobalClasses >> "import custom.TestProxy; public class B {public function >> b() { var a:TestProxy = new TestProxy();for each (var p:String in a) var >> i:int = p.length; }}", >> IForLoopNode.class, WRAP_LEVEL_PACKAGE, true); >> asBlockWalker.visitForLoop(node); >> - assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in >> foreachiter0_target.propertyNames()) \n{\nvar p = >> foreachiter0_target.getProperty(foreachiter0);\n\n var /** @type {number} >> */ i = p.length;}\n"); >> + assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in >> foreachiter0_target.propertyNames()) \n{\nvar p = >> foreachiter0_target.getProperty(foreachiter0);\n\n var /** @type {number} >> */ i = (p.length) >> 0;}\n"); >> } >> >> @Test >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java >> index 2c6eaf7..8f2f9d1 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java >> @@ -104,7 +104,7 @@ public class TestRoyaleGlobalFunctions extends >> TestGoogGlobalFunctions >> @Test >> public void testParseInt() >> { >> - IVariableNode node = getVariable("var a:int = parseInt('1.8');"); >> + IVariableNode node = getVariable("var a:Number = >> parseInt('1.8');"); >> asBlockWalker.visitVariable(node); >> assertOut("var /** @type {number} */ a = parseInt('1.8', >> undefined)"); >> } >> @@ -112,7 +112,7 @@ public class TestRoyaleGlobalFunctions extends >> TestGoogGlobalFunctions >> @Test >> public void testParseIntTwoArgs() >> { >> - IVariableNode node = getVariable("var a:int = parseInt('1.8', >> 16);"); >> + IVariableNode node = getVariable("var a:Number = parseInt('1.8', >> 16);"); >> asBlockWalker.visitVariable(node); >> assertOut("var /** @type {number} */ a = parseInt('1.8', 16)"); >> } >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java >> index dc251a3..78cdcaf 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java >> @@ -147,7 +147,7 @@ public class TestRoyaleMethodMembers extends >> TestGoogMethodMembers >> { >> IClassNode node = (IClassNode) getNode("public function >> RoyaleTest_A(){}; private function foo(value:int):String{return value;}; >> private function bar():String{if(true){while(i){return this.foo(42);}}};", >> IClassNode.class, WRAP_LEVEL_CLASS); >> asBlockWalker.visitClass(node); >> - assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() >> {\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n >> */\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * >> @private\n * @param {number} value\n * @return {string}\n >> */\nRoyaleTest_A.prototype.foo = function(value) {\n return >> value;\n};\n\n\n/**\n * @private\n * @return {string}\n >> */\nRoyaleTest_A.prototype.bar = function() {\n if (true) {\n while (i) >> {\n return this.foo(42);\n [...] >> + assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() >> {\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n >> */\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * >> @private\n * @param {number} value\n * @return {string}\n >> */\nRoyaleTest_A.prototype.foo = function(value) {\n return >> org.apache.royale.utils.Language.string(value);\n};\n\n\n/**\n * @private\n >> * @return {string}\n */\nRoyaleTest_A.prototype.bar = function() {\n if >> (true) {\n w [...] >> } >> >> @Test >> @@ -155,7 +155,7 @@ public class TestRoyaleMethodMembers extends >> TestGoogMethodMembers >> { >> IClassNode node = (IClassNode) getNode("public function >> RoyaleTest_A(){}; private function foo(value:int):String{return value;}; >> private function bar():void{if(true){while(i){foo(42);}}};", >> IClassNode.class, WRAP_LEVEL_CLASS); >> asBlockWalker.visitClass(node); >> - assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() >> {\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n >> */\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * >> @private\n * @param {number} value\n * @return {string}\n >> */\nRoyaleTest_A.prototype.foo = function(value) {\n return >> value;\n};\n\n\n/**\n * @private\n */\nRoyaleTest_A.prototype.bar = >> function() {\n if (true) {\n while (i) {\n this.foo(42);\n }\n >> }\n};"); >> + assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() >> {\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n >> */\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * >> @private\n * @param {number} value\n * @return {string}\n >> */\nRoyaleTest_A.prototype.foo = function(value) {\n return >> org.apache.royale.utils.Language.string(value);\n};\n\n\n/**\n * @private\n >> */\nRoyaleTest_A.prototype.bar = function() {\n if (true) {\n while (i) >> {\n thi [...] >> } >> >> @Override >> diff --git >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java >> index 9de87f5..2f82899 100644 >> --- >> a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java >> +++ >> b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java >> @@ -96,6 +96,24 @@ public class TestRoyaleStatements extends >> TestGoogStatements >> assertOut("var /** @type {number} */ a = 0"); >> } >> >> + @Test >> + public void testVarDeclaration_withTypeIntAndAssignedNumber() >> + { >> + IVariableNode node = (IVariableNode) getNode("var a:int = 123.4;", >> + IVariableNode.class); >> + asBlockWalker.visitVariable(node); >> + assertOut("var /** @type {number} */ a = (123.4) >> 0"); >> + } >> + >> + @Test >> + public void testVarDeclaration_withTypeUintAndAssignedNumber() >> + { >> + IVariableNode node = (IVariableNode) getNode("var a:uint = >> 123.4;", >> + IVariableNode.class); >> + asBlockWalker.visitVariable(node); >> + assertOut("var /** @type {number} */ a = (123.4) >>> 0"); >> + } >> + >> //---------------------------------- >> // const declaration >> //---------------------------------- >> >> > > -- > > Piotr Zarzycki > > Patreon: *https://www.patreon.com/piotrzarzycki > <https://www.patreon.com/piotrzarzycki>*