Babel.Compiler.TypeCheckingVisitor.VisitAssign C# (CSharp) Method

VisitAssign() public method

public VisitAssign ( AssignStatement assign ) : void
assign AssignStatement
return void
        public override void VisitAssign(AssignStatement assign)
        {
            TypeData lhsType;
            Argument arg = currentRoutine.GetArgument(assign.Name);
            if (arg != null) {
                if (arg.NodeType.IsByRef)
                    lhsType = arg.NodeType.ElementType;
                else
                    lhsType = arg.NodeType;
            }
            else {
                LocalVariable local = localVariableStack.GetLocal(assign.Name);
                if (local != null) {
                    if (local.IsTypecaseVariable) {
                        report.Error(assign.Location,
                                     "it is illegal " +
                                     "to assign to the typecase variable");
                        return;
                    }
                    lhsType = local.LocalType;
                }
                else {
                    Expression self = new SelfExpression(assign.Location);
                    ModalExpression arg1 =
                        new ModalExpression(ArgumentMode.In, assign.Value,
                                            assign.Value.Location);
                    TypedNodeList args = new TypedNodeList(arg1);
                    assign.Call = new CallExpression(self, assign.Name, args,
                                                     assign.Location);
                    assign.Call.HasValue = false;
                    assign.Call.Accept(this);
                    if (assign.Call.NodeType == null)
                        return;
                    ParameterInfo[] parameters =
                        typeManager.GetParameters(assign.Call.Method);
                    lhsType =
                        typeManager.GetTypeData(parameters[0].ParameterType);
                }
            }
            if (assign.Value is VoidExpression) {
                assign.Value.NodeType = lhsType;
            }
            else {
                // NodeType may be already set by DeclarationStatement
                if (assign.Value.NodeType == null)
                    assign.Value.Accept(this);
                if (assign.Value.NodeType == null)
                    return;
                if (!assign.Value.NodeType.IsSubtypeOf(lhsType)) {
                    report.Error(assign.Location,
                                 "{0} is not a subtype of {1}",
                                 assign.Value.NodeType.FullName,
                                 lhsType.FullName);
                    return;
                }
            }
        }