//\ssyy

        //ssyy
        public void generate_inherited_from_base_and_interface_function(common_type_node ctype, function_node func)
        {
            common_method_node gen_func = context.create_function(func.name, null) as common_method_node;
            gen_func.polymorphic_state = SemanticTree.polymorphic_state.ps_common;
            gen_func.newslot_awaited = true;
            gen_func.is_final = true;
            gen_func.is_overload = true;
            gen_func.field_access_level = SemanticTree.field_access_level.fal_public;
            gen_func.return_value_type = func.return_value_type;
            //gen_func.return_variable = func.retu

            foreach (parameter par in func.parameters)
            {
                concrete_parameter_type cpt =
                    (par.parameter_type == SemanticTree.parameter_type.value) ?
                    concrete_parameter_type.cpt_const :
                    concrete_parameter_type.cpt_var;
                common_parameter c_p = new common_parameter(par.name,
                    par.parameter_type, gen_func, cpt, null);
                c_p.type = par.type;
                c_p.set_param_is_params(par.is_params);
                c_p.inital_value = par.inital_value;
                gen_func.parameters.AddElement(c_p);
            }

            local_variable lv = new local_variable(compiler_string_consts.self_word, gen_func.cont_type, gen_func, null);
            gen_func.scope.AddSymbol(compiler_string_consts.self_word, new SymbolInfo(lv));
            gen_func.self_variable = lv;

            base_function_call bfc;
            this_node tn = null;

            common_method_node commn = func as common_method_node;
            if (commn != null)
            {
                tn = new this_node(commn.comperehensive_type as type_node, null);
                bfc = new common_method_call(commn, tn, null);
            }
            else
            {
                compiled_function_node compn = func as compiled_function_node;
                tn = new this_node(compn.comperehensive_type as type_node, null);
                bfc = new compiled_function_call(compn, tn, null);
            }

            foreach (parameter p in gen_func.parameters)
            {
                bfc.parameters.AddElement(
                    create_variable_reference(p, null));
            }

            //Это запретит чистку стека
            bfc.last_result_function_call = true;

            statements_list snlist = new statements_list(null);
            snlist.statements.AddElement(bfc);
            snlist.statements.AddElement(new empty_statement(null));
            gen_func.function_code = snlist;
            context.pop_top_function();
            //context.leave_block();
        }
        //ssyy
        public void generate_inherit_constructors()
        {
            common_type_node _ctn = context.converted_type;
            if (_ctn == null)
            {
                throw new CompilerInternalError("Can generate inherited constructors only in class.");
            }
            if (_ctn.has_user_defined_constructor)
            {
                //Пользователь определил хотя бы один конструктор, никакие конструкторы не наследуем.
                return;
            }
            //Получили список процедур предка, имеющих имя Create
            SymbolInfo si = _ctn.base_type.find_in_type(compiler_string_consts.default_constructor_name, _ctn.base_type.Scope);
            delete_inherited_constructors(ref si, _ctn.base_type);
            while (si != null)
            {
                function_node fn = si.sym_info as function_node;
                compiled_constructor_node pconstr = fn as compiled_constructor_node;
                common_method_node mconstr = fn as common_method_node;
                //Если это конструктор...
                if (pconstr != null ||
                    mconstr != null && mconstr.is_constructor)
                {
                    //Генерируем унаследованный конструктор
                    location loc = null;
                    SemanticTree.polymorphic_state ps;
                    if (mconstr != null)
                    {
                        loc = mconstr.loc;
                        ps = mconstr.polymorphic_state;
                    }
                    else //значит (pconstr != null)
                    {
                        ps = pconstr.polymorphic_state;
                    }
                    if (pconstr != null)
                        context.set_field_access_level(pconstr.field_access_level);
                    else
                        context.set_field_access_level(mconstr.field_access_level);
                    common_method_node gen_constr = context.create_function(compiler_string_consts.default_constructor_name, loc) as common_method_node;
                    gen_constr.polymorphic_state = ps;
                    gen_constr.is_overload = true;
                    gen_constr.is_constructor = true;
                    gen_constr.field_access_level = fn.field_access_level;
                    gen_constr.return_value_type = _ctn;

                    foreach (parameter par in fn.parameters)
                    {
                        //(ssyy) Интересно, зачем это.
                        concrete_parameter_type cpt =
                            (par.parameter_type == SemanticTree.parameter_type.var) ?
                            concrete_parameter_type.cpt_var :
                            concrete_parameter_type.cpt_none;
                        common_parameter c_p = new common_parameter(par.name,
                            par.parameter_type, gen_constr, cpt, null);
                        c_p.type = par.type;
                        c_p.set_param_is_params(par.is_params);
                        c_p.inital_value = par.inital_value;
                        gen_constr.parameters.AddElement(c_p);
                        c_p.default_value = par.default_value;
                    }

                    base_function_call bfc;

                    if (mconstr != null)
                    {
                        common_constructor_call c1 = new common_constructor_call(mconstr, null);
                        c1._new_obj_awaited = false;
                        bfc = c1;
                    }
                    else
                    {
                        compiled_constructor_call c2 = new compiled_constructor_call(pconstr, null);
                        c2._new_obj_awaited = false;
                        bfc = c2;
                    }
                    foreach (parameter p in gen_constr.parameters)
                    {
                        bfc.parameters.AddElement(
                            create_variable_reference(p, null));
                    }
                    statements_list snlist = new statements_list(null);
                    snlist.statements.AddElement(bfc);
                    snlist.statements.AddElement(new empty_statement(null));
                    gen_constr.function_code = snlist;
                    context.leave_block();
                    if (fn.parameters.Count == 0 || fn.parameters[0].default_value != null)
                    {
                        _ctn.has_default_constructor = true;
                    }
                }
                si = si.Next;
            }
        }