Ejemplo n.º 1
0
		public override void visit(named_type_reference_list _named_type_reference_list)
		{
			DefaultVisit(_named_type_reference_list);
			pre_do_visit(_named_type_reference_list);
			for (int i = 0; i < types.Count; i++)
				visit(named_type_reference_list.types[i]);
			post_do_visit(_named_type_reference_list);
		}
Ejemplo n.º 2
0
 public virtual void visit(named_type_reference_list _named_type_reference_list)
 {
     DefaultVisit(_named_type_reference_list);
 }
Ejemplo n.º 3
0
		public virtual void post_do_visit(named_type_reference_list _named_type_reference_list)
		{
		}
Ejemplo n.º 4
0
        public class_definition NewObjectType(class_attribute class_attributes, token_info class_or_interface_keyword, named_type_reference_list opt_base_classes, where_definition_list opt_where_section, class_body_list opt_not_component_list_seq_end, LexLocation loc)
        {
            var    nnof = new class_definition(opt_base_classes, opt_not_component_list_seq_end, class_keyword.Class, null, opt_where_section, class_attribute.None, false, loc);
            string kw   = class_or_interface_keyword.text.ToLower();

            nnof.attribute = class_attributes;
            if (kw == "record")
            {
                nnof.keyword = class_keyword.Record;
            }
            else
            if (kw == "interface")
            {
                nnof.keyword = class_keyword.Interface;
            }
            else
            if (kw == "i")
            {
                nnof.keyword = class_keyword.TemplateInterface;
            }
            else
            if (kw == "r")
            {
                nnof.keyword = class_keyword.TemplateRecord;
            }
            else
            if (kw == "c")
            {
                nnof.keyword = class_keyword.TemplateClass;
            }
            if (nnof.body != null && ((class_definition)nnof).body.class_def_blocks != null &&
                ((class_definition)nnof).body.class_def_blocks.Count > 0 && ((class_definition)nnof).body.class_def_blocks[0].access_mod == null)
            {
                if (nnof.keyword == class_keyword.Class)
                {
                    nnof.body.class_def_blocks[0].access_mod = new access_modifer_node(access_modifer.internal_modifer);
                }
                else
                {
                    nnof.body.class_def_blocks[0].access_mod = new access_modifer_node(access_modifer.none);
                }
            }
            return(nnof);
        }
Ejemplo n.º 5
0
        type_declarations GenClassesForYield(procedure_definition pd, IEnumerable <var_def_statement> fields)
        {
            var fh = (pd.proc_header as function_header);

            if (fh == null)
            {
                throw new SyntaxError("Only functions can contain yields", "", pd.proc_header.source_context, pd.proc_header);
            }
            var seqt = fh.return_type as sequence_type;

            if (seqt == null)
            {
                throw new SyntaxError("Functions with yields must return sequences", "", fh.return_type.source_context, fh.return_type);
            }

            // Теперь на месте функции генерируем класс

            // Захваченные переменные
            var cm = class_members.Public;

            foreach (var m in fields)
            {
                cm.Add(m);
            }

            // Параметры функции
            List <ident> lid  = new List <ident>();
            var          pars = fh.parameters;

            if (pars != null)
            {
                foreach (var ps in pars.params_list)
                {
                    if (ps.param_kind != parametr_kind.none)
                    {
                        throw new SyntaxError("Parameters of functions with yields must not have 'var', 'const' or 'params' modifier", "", pars.source_context, pars);
                    }
                    if (ps.inital_value != null)
                    {
                        throw new SyntaxError("Parameters of functions with yields must not have initial values", "", pars.source_context, pars);
                    }
                    var_def_statement vds = new var_def_statement(ps.idents, ps.vars_type);
                    cm.Add(vds); // все параметры функции делаем полями класса
                    lid.AddRange(vds.vars.idents);
                }
            }

            var stels = seqt.elements_type;

            // Системные поля и методы для реализации интерфейса IEnumerable
            cm.Add(new var_def_statement(Consts.State, "integer"),
                   new var_def_statement(Consts.Current, stels),
                   procedure_definition.EmptyDefaultConstructor,
                   new procedure_definition("Reset"),
                   new procedure_definition("MoveNext", "boolean", pd.proc_body),
                   new procedure_definition("get_Current", "object", new assign("Result", Consts.Current)),
                   new procedure_definition("GetEnumerator", "System.Collections.IEnumerator", new assign("Result", "Self"))
                   );

            var className       = newClassName();
            var classNameHelper = className + "Helper";

            var interfaces = new named_type_reference_list("System.Collections.IEnumerator", "System.Collections.IEnumerable");
            var td         = new type_declaration(classNameHelper, SyntaxTreeBuilder.BuildClassDefinition(interfaces, cm));

            // Изменение тела процедуры

            var stl = new statement_list(new var_statement("res", new new_expr(className)));

            stl.AddMany(lid.Select(id => new assign(new dot_node("res", id), id)));
            stl.Add(new assign("Result", "res"));
            pd.proc_body = new block(stl);

            // Второй класс

            var tpl = new template_param_list(stels);

            var IEnumeratorT = new template_type_reference("System.Collections.Generic.IEnumerator", tpl);

            var cm1 = class_members.Public.Add(
                procedure_definition.EmptyDefaultConstructor,
                new procedure_definition(new function_header("get_Current", stels), new assign("Result", Consts.Current)),
                new procedure_definition(new function_header("GetEnumerator", IEnumeratorT), new assign("Result", "Self")),
                new procedure_definition("Dispose")
                );

            var interfaces1  = new named_type_reference_list(classNameHelper);
            var IEnumerableT = new template_type_reference("System.Collections.Generic.IEnumerable", tpl);

            interfaces1.Add(IEnumerableT).Add(IEnumeratorT);

            var td1 = new type_declaration(className, SyntaxTreeBuilder.BuildClassDefinition(interfaces1, cm1));

            var cct = new type_declarations(td);

            cct.Add(td1);

            return(cct);
        }
		public virtual void visit(named_type_reference_list _named_type_reference_list)
		{
			DefaultVisit(_named_type_reference_list);
		}
Ejemplo n.º 7
0
 public override void visit(named_type_reference_list _named_type_reference_list)
 {
     prepare_collection(_named_type_reference_list.types, "types");
 }
Ejemplo n.º 8
0
 public override void visit(named_type_reference_list _named_type_reference_list)
 {
     get_count(_named_type_reference_list.types);
 }
Ejemplo n.º 9
0
		public override void visit(named_type_reference_list _named_type_reference_list)
		{
			executer.visit(_named_type_reference_list);
			if (_named_type_reference_list.types != null)
			foreach (dynamic x in _named_type_reference_list.types)
				if(x != null)
					this.visit(x);
		}
Ejemplo n.º 10
0
 public virtual void visit(named_type_reference_list _named_type_reference_list)
 {
 }