コード例 #1
0
ファイル: generics.cs プロジェクト: CSRedRat/pascalabcnet
 //(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;
 }