You’re right.

I just committed a work-around.

> On Jan 29, 2019, at 2:00 PM, Carlos Rovira <carlosrov...@apache.org> wrote:
> 
> Hi Harbs,
> 
> I rebuild all with the latest change but seems the problem is still there.
> Now I get this:
> 
> RangeError: Maximum call stack size exceeded
> Language.js:115
> at String.toString (<anonymous>)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:80)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> at Function.org.apache.royale.utils.Language.string
> (/Users/carlosrovira/Dev/Codeoscopic/Source/sgc/webapp/src/main/webapp/javascript/bin/js-debug/org/apache/royale/utils/Language.js:115:44)
> 
> and the code is running is
> 
> /**
> * string()
> * @royaleignorecoercion String
> * @asparam value The value to be cast.
> * @asreturn {string}
> * @export
> * @param {*} value
> * @return {string}
> */
> org.apache.royale.utils.Language.string = function(value) {
> return org.apache.royale.utils.Language.string(value == null ? null : value.
> toString()); <--filing here
> };
> 
> Can you take a look?
> 
> thanks
> 
> Carlos
> 
> 
> 
> El mar., 29 ene. 2019 a las 12:11, Harbs (<harbs.li...@gmail.com>) escribió:
> 
>> 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>*
>> 
>> 
> 
> -- 
> Carlos Rovira
> http://about.me/carlosrovira

Reply via email to