private class_body_list get_class_body(ICSharpCode.NRefactory.Ast.TypeDeclaration td) { class_body_list body = new class_body_list(); body.source_context = get_source_context(td); foreach (ICSharpCode.NRefactory.Ast.INode node in td.Children) { body.class_def_blocks.Add(get_class_member(node)); } return(body); }
public static class_definition BuildClassDefinition(named_type_reference_list parents, params class_members[] cms) { var cb = new class_body_list(); foreach (var cm in cms) { cb.Add(cm); } var cd = new class_definition(parents, cb); return(cd); }
// frninja 23/04/16 - для шаблонных классов в yield public static class_definition BuildClassDefinition(named_type_reference_list parents, ident_list template_args, params class_members[] cms) { var cb = new class_body_list(); foreach (var cm in cms) { cb.Add(cm); } var cd = new class_definition(parents, cb, class_keyword.Class, template_args, null, class_attribute.None, false, null); return(cd); }
public static class_definition BuildClassOrRecordDefinition(bool is_class, params class_members[] cms) { var cb = new class_body_list(); foreach (var cm in cms) { cb.Add(cm); } var cd = new class_definition(cb); if (!is_class) { cd.keyword = class_keyword.Record; } return(cd); }
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); }
public override void visit(class_body_list _class_body) { get_count(_class_body.class_def_blocks); }
public class_definition NewRecordType(named_type_reference_list opt_base_classes, where_definition_list opt_where_section, class_body_list component_list_seq, LexLocation loc) { var nnrt = new class_definition(opt_base_classes, component_list_seq, class_keyword.Record, null, opt_where_section, class_attribute.None, false, loc); if (nnrt.body != null && nnrt.body.class_def_blocks != null && nnrt.body.class_def_blocks.Count > 0 && nnrt.body.class_def_blocks[0].access_mod == null) { nnrt.body.class_def_blocks[0].access_mod = new access_modifer_node(access_modifer.public_modifer); } return(nnrt); }
public virtual void visit(class_body_list _class_body_list) { DefaultVisit(_class_body_list); }
public override void visit(simple_property _simple_property) { var property_parent_node = _simple_property.Parent; while (property_parent_node != null && property_parent_node.GetType() != typeof(class_members)) { property_parent_node = property_parent_node.Parent; } class_members property_class_members = property_parent_node as class_members; while (property_parent_node != null && property_parent_node.GetType() != typeof(class_body_list)) { property_parent_node = property_parent_node.Parent; } class_body_list class_body = property_parent_node as class_body_list; while (property_parent_node != null && property_parent_node.GetType() != typeof(class_definition)) { property_parent_node = property_parent_node.Parent; } class_definition class_def = property_parent_node as class_definition; var property_type = _simple_property.property_type; var read_accessor = _simple_property.accessors?.read_accessor; var write_accessor = _simple_property.accessors?.write_accessor; var new_class_members = new class_members(access_modifer.private_modifer); if (class_def.keyword == class_keyword.Interface && _simple_property.is_auto) { throw new SyntaxVisitorError( "INVALID_INTERFACE_MEMBER", _simple_property.source_context); } if (class_def.keyword == class_keyword.Interface && read_accessor != null && (read_accessor.pr != null || read_accessor.accessor_name != null)) { throw new SyntaxVisitorError( "INVALID_INTERFACE_MEMBER", read_accessor.source_context); } if (class_def.keyword == class_keyword.Interface && write_accessor != null && (write_accessor.pr != null || write_accessor.accessor_name != null)) { throw new SyntaxVisitorError( "INVALID_INTERFACE_MEMBER", write_accessor.source_context); } if (_simple_property.is_auto) { if (_simple_property.parameter_list != null) { throw new SyntaxVisitorError( "INDEXED_AUTO_PROPERTY", _simple_property.source_context); } AutoPropertyDesugaring(_simple_property, new_class_members); } // pr != null => extended read accessor if (read_accessor != null && read_accessor.pr != null) { ExtendedReadAccessorDesugaring(read_accessor, _simple_property, new_class_members); } // pr != null => extended write accessor if (write_accessor != null && write_accessor.pr != null) { ExtendedWriteAccessorDesugaring(write_accessor, _simple_property, new_class_members); } if (new_class_members.Count > 0) { class_body.InsertBefore(property_class_members, new_class_members); } }
// end frninja // names и types передаю во внешний мир на предмет анализа того, что они не указатели. Снаружи они инициализируются пустыми списками public static void AddMembersForAutoClass(class_definition cd, ref List <ident> names, ref List <type_definition> types) // SSM 24.03.14 { //var types = new List<type_definition>(); class_body_list cb = cd.body; bool HasToString = false; bool HasConstructor = false; bool HasDeconstruct = false; foreach (var l in cb.class_def_blocks) { foreach (var m in l.members) { var mm = m as var_def_statement; if (mm != null) { if (mm.var_attr != definition_attribute.Static) { foreach (var v in mm.vars.idents) { names.Add(v); if (mm.vars_type != null) { types.Add(mm.vars_type); // во внешний мир для определения pointerов } else { types.Add(BuildSameType(mm.inital_value)); // почему-то только так хочет работать с рекурсивным типом Node<T> } } } } else { var ts = m as procedure_definition; if (!HasConstructor) { if (ts != null && ts.proc_header is constructor) { HasConstructor = true; } } if (!HasDeconstruct) { if (ts != null && ts.proc_header.name != null && ts.proc_header.name.meth_name.name != null) { HasDeconstruct = ts.proc_header.name.meth_name.name.ToLower().Equals("deconstruct"); } } if (!HasToString) { if (ts != null && ts.proc_header.name != null && ts.proc_header.name.meth_name.name != null) { HasToString = ts.proc_header.name.meth_name.name.ToUpper().Equals("TOSTRING"); } } } } } if (!HasConstructor) { var fnames = names.Select(x => new ident("f" + x.name)).ToList(); var cm = BuildSimpleConstructorSection(names, fnames, types); cb.Insert(0, cm); //cb.class_def_blocks.Insert(0, cm); } if (!HasDeconstruct) { var fnames = names.Select(x => new ident("f" + x.name)).ToList(); var cm = BuildSimpleDeconstructSection(names, fnames, types); cb.Add(cm); } if (!HasToString) { var tostr = BuildToStringFuncForAutoClass(names); cb.Add(BuildOneMemberSection(tostr)); //cb.class_def_blocks.Insert(0, BuildOneMemberSection(tostr)); } }
public override void visit(class_body_list _class_body) { visit_collection(_class_body.class_def_blocks); }
public override void visit(class_body_list _class_body) { throw new NotImplementedException(); }
public override void visit(class_body_list _class_body) { prepare_collection(_class_body.class_def_blocks, "class definitions"); }
// end frninja // names и types передаю во внешний мир на предмет анализа того, что они не указатели. Снаружи они инициализируются пустыми списками public static void AddMembersForAutoClass(class_definition cd, ref List <ident> names, ref List <type_definition> types) // SSM 24.03.14 { //var types = new List<type_definition>(); class_body_list cb = cd.body; bool HasToString = false; bool HasConstructor = false; bool HasDeconstruct = false; foreach (var l in cb.class_def_blocks) { foreach (var m in l.members) { var mm = m as var_def_statement; if (mm != null) { if (mm.var_attr != definition_attribute.Static) { foreach (var v in mm.vars.idents) { names.Add(v); if (mm.vars_type != null) { types.Add(mm.vars_type); // во внешний мир для определения pointerов } else { types.Add(BuildSameType(mm.inital_value)); // почему-то только так хочет работать с рекурсивным типом Node<T> } } } } else { var ts = m as procedure_definition; if (!HasConstructor) { if (ts != null && ts.proc_header is constructor && (ts.proc_header.parameters?.params_list.SelectMany(tp => tp.idents.idents).Count() ?? 0) == names.Count ) { HasConstructor = true; // на самом деле это означает, что есть конструктор с точно таким же количеством параметров } } if (!HasDeconstruct) { if (ts != null && ts.proc_header.name != null && ts.proc_header.name.meth_name.name != null) { HasDeconstruct = ts.proc_header.name.meth_name.name.ToLower().Equals("deconstruct"); } } if (!HasToString) { if (ts != null && ts.proc_header.name != null && ts.proc_header.name.meth_name.name != null) { HasToString = ts.proc_header.name.meth_name.name.ToUpper().Equals("TOSTRING"); } } } } } // добавление свойств - временно убрал т.к. свойства нельзя передавать как var-параметры // По идее если это делать, то поля переименовывать везде в классе!!! /*for (var i=0; i<names.Count; i++) * { * if (names[i].name.StartsWith("#")) * continue; * var propName = names[i].TypedClone(); * names[i].name = "!" + names[i].name; * var simpleProp = BuildSimpleReadWriteProperty(propName, names[i].name, types[i]); * var cm = BuildOneMemberSection(simpleProp); * cb.Add(cm); * }*/ if (!HasConstructor) { var fnames = names.Select(x => new ident("f" + x.name.ToLower(), x.source_context)).ToList(); if (fnames.Select(x => x.name).Distinct().Count() != names.Count) // SSM 20/05/2020 #2126 { return; // хак - мы не генерируем конструктор, потому что ошибка одинаковых имен выведется позже } var cm = BuildSimpleConstructorSection(names, fnames, types); cb.Insert(0, cm); //cb.class_def_blocks.Insert(0, cm); } if (!HasDeconstruct) { var fnames = names.Select(x => new ident("f" + x.name, x.source_context)).ToList(); var cm = BuildSimpleDeconstructSection(names, fnames, types); cb.Add(cm); } if (!HasToString) { var tostr = BuildToStringFuncForAutoClass(names); var cm = BuildOneMemberSection(tostr); cb.Add(cm); //cb.class_def_blocks.Insert(0, BuildOneMemberSection(tostr)); } }