//(ssyy) Создаёт метод псевдо-инстанции generic-типа. protected common_method_node make_method(function_node orig_fn, location loc) { if (orig_fn == null) { return null; } List<type_node> meth_inst_pars = null; SemanticTree.IClassMemberNode orig_member = orig_fn as SemanticTree.IClassMemberNode; common_method_node cmn = new common_method_node( orig_fn.name, //generic_convertions.determine_type(orig_fn.return_value_type, _instance_params, false), null, loc, this, orig_member.polymorphic_state, orig_member.field_access_level, null); if (orig_fn.is_generic_function) { List<type_node> orig_tpars = orig_fn.get_generic_params_list(); int type_count = orig_tpars.Count; cmn.generic_params = new List<PascalABCCompiler.SemanticTree.ICommonTypeNode>(orig_tpars.Count); foreach (type_node t in orig_tpars) { common_type_node par = new common_type_node(t.name, PascalABCCompiler.SemanticTree.type_access_level.tal_public, null, SystemLibrary.SystemLibrary.syn_visitor.convertion_data_and_alghoritms.symbol_table.CreateInterfaceScope(null, SystemLibrary.SystemLibrary.object_type.Scope, null), null); SystemLibrary.SystemLibrary.init_reference_type(par); par.SetBaseType(SystemLibrary.SystemLibrary.object_type); cmn.generic_params.Add(par); par.generic_function_container = cmn; } meth_inst_pars = cmn.get_generic_params_list(); List<generic_parameter_eliminations> gpes = orig_fn.parameters_eliminations; for (int i = 0; i < type_count; ++i) { common_type_node p = (common_type_node)(meth_inst_pars[i]); generic_parameter_eliminations gpe = gpes[i]; p.SetBaseType(generic_convertions.determine_type( generic_convertions.determine_type(gpe.base_class, _instance_params, false), meth_inst_pars, true)); p.is_class = gpe.is_class; p.internal_is_value = gpe.is_value; foreach (type_node interf in gpe.implementing_interfaces) { type_table.AddInterface(p, generic_convertions.determine_type( generic_convertions.determine_type(interf, _instance_params, false), meth_inst_pars, true), null); } if (gpe.has_default_ctor) { generic_parameter_eliminations.add_default_ctor(p); } } } cmn.parameters.AddRange(make_parameters(orig_fn.parameters, cmn)); if (orig_fn.is_generic_function) { foreach (common_parameter cp in cmn.parameters) { cp.type = generic_convertions.determine_type(cp.type, meth_inst_pars, true); } } common_method_node common_orig = orig_fn as common_method_node; if (common_orig != null) { cmn.num_of_default_variables = common_orig.num_of_default_variables; } compiled_constructor_node compiled_orig = orig_fn as compiled_constructor_node; cmn.is_constructor = (compiled_orig != null || (common_orig != null && common_orig.is_constructor)); cmn.return_value_type = generic_convertions.determine_type(orig_fn.return_value_type, _instance_params, false); if (orig_fn.is_generic_function) { cmn.return_value_type = generic_convertions.determine_type(cmn.return_value_type, meth_inst_pars, true); } return cmn; }