Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        // 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);
        }
Exemple #4
0
        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);
            }
        }
Exemple #10
0
        // 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);
 }
Exemple #12
0
 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");
 }
Exemple #14
0
        // 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));
            }
        }