public override void visit(assign _assign)
        {
            var loc = _visitor.get_location(_assign);

            _visitor.internal_is_assign = true;
            var to = _visitor.convert_address_strong(_assign.to);

            _visitor.internal_is_assign = false;
            if (to == null)
            {
                _visitor.AddError(_visitor.get_location(_assign.to), "CAN_NOT_ASSIGN_TO_LEFT_PART");
            }

            bool flag;
            var  node_type = general_node_type.constant_definition;

            if (convertion_data_and_alghoritms.check_for_constant_or_readonly(to, out flag, out node_type))
            {
                if (flag)
                {
                    _visitor.AddError(to.location, "CAN_NOT_ASSIGN_TO_CONSTANT_OBJECT");
                }
                else
                {
                    _visitor.AddError(new CanNotAssignToReadOnlyElement(to.location, node_type));
                }
            }

            if (to is class_field_reference)
            {
                if ((to as class_field_reference).obj.type.type_special_kind == type_special_kind.record &&
                    (to as class_field_reference).obj is base_function_call)
                {
                    //исключим ситуацию обращения к массиву
                    if (!(((to as class_field_reference).obj is common_method_call) &&
                          ((to as class_field_reference).obj as common_method_call).obj.type.type_special_kind == type_special_kind.array_wrapper))
                    {
                        _visitor.AddError(loc, "LEFT_SIDE_CANNOT_BE_ASSIGNED_TO");
                    }
                }
            }
            else if (_visitor.context.is_in_cycle() && !SemanticRules.AllowChangeLoopVariable && to.semantic_node_type == semantic_node_type.namespace_variable_reference)
            {
                if (_visitor.context.is_loop_variable((to as namespace_variable_reference).var))
                {
                    _visitor.AddError(to.location, "CANNOT_ASSIGN_TO_LOOP_VARIABLE");
                }
            }
            else if (_visitor.context.is_in_cycle() && !SemanticRules.AllowChangeLoopVariable && to.semantic_node_type == semantic_node_type.local_variable_reference)
            {
                if (_visitor.context.is_loop_variable((to as local_variable_reference).var))
                {
                    _visitor.AddError(to.location, "CANNOT_ASSIGN_TO_LOOP_VARIABLE");
                }
            }
            else if (_visitor.context.is_in_cycle() && !SemanticRules.AllowChangeLoopVariable && to.semantic_node_type == semantic_node_type.local_block_variable_reference)
            {
                if (_visitor.context.is_loop_variable((to as local_block_variable_reference).var))
                {
                    _visitor.AddError(to.location, "CANNOT_ASSIGN_TO_LOOP_VARIABLE");
                }
            }
            else if (to is simple_array_indexing)
            {
                if ((to as simple_array_indexing).simple_arr_expr is class_field_reference && ((to as simple_array_indexing).simple_arr_expr as class_field_reference).obj != null &&
                    ((to as simple_array_indexing).simple_arr_expr as class_field_reference).obj is constant_node)
                {
                    _visitor.AddError(loc, "LEFT_SIDE_CANNOT_BE_ASSIGNED_TO");
                }
            }

            ProcessNode(_assign.to);
            ProcessNode(_assign.from);
        }