Ejemplo n.º 1
0
        public static CodeTypeDeclaration CreateUnmarshalHelperType(CodeNamespace ns, string name, bool type_decode)
        {
            var type = ns.AddType(name);

            type.TypeAttributes = TypeAttributes.NestedAssembly;
            type.BaseTypes.Add(typeof(NdrUnmarshalBuffer).ToRef());
            var con = type.AddConstructor(MemberAttributes.Public);

            con.AddParam(typeof(RpcClientResponse).ToRef(), "r");
            var param_var = CodeGenUtils.GetVariable("r");

            con.BaseConstructorArgs.Add(new CodePropertyReferenceExpression(param_var, "NdrBuffer"));
            con.BaseConstructorArgs.Add(new CodePropertyReferenceExpression(param_var, "Handles"));
            con.BaseConstructorArgs.Add(new CodePropertyReferenceExpression(param_var, "DataRepresentation"));

            con = type.AddConstructor(MemberAttributes.Public);
            con.AddParam(typeof(byte[]).ToRef(), "ba");
            con.BaseConstructorArgs.Add(CodeGenUtils.GetVariable("ba"));

            if (type_decode)
            {
                con = type.AddConstructor(MemberAttributes.Public);
                con.AddParam(typeof(NdrPickledType).ToRef(), "pickled_type");
                con.BaseConstructorArgs.Add(CodeGenUtils.GetVariable("pickled_type"));
            }

            return(type);
        }
Ejemplo n.º 2
0
        public static CodeTypeDeclaration CreateMarshalHelperType(CodeNamespace ns, string name)
        {
            var marshal_type = new CodeTypeReference(typeof(NdrMarshalBuffer));
            var type         = ns.AddType(name);

            type.TypeAttributes = TypeAttributes.NestedAssembly;
            type.BaseTypes.Add(marshal_type);
            return(type);
        }
Ejemplo n.º 3
0
        public static void Main(string[] args)
        {
            string directory   = "../../NRefactory/Project/Src/Ast/";
            string visitorsDir = "../../NRefactory/Project/Src/Visitors/";

            Console.WriteLine("AST Generator running...");
            if (!File.Exists(directory + "INode.cs"))
            {
                Console.WriteLine("did not find output directory " + Path.GetFullPath(Path.GetDirectoryName(directory)));
                return;
            }
            if (!File.Exists(visitorsDir + "AbstractAstTransformer.cs"))
            {
                Console.WriteLine("did not find visitor output directory");
                return;
            }

            List <Type> nodeTypes = new List <Type>();

            foreach (Type type in typeof(MainClass).Assembly.GetTypes())
            {
                if (type.IsClass && typeof(INode).IsAssignableFrom(type))
                {
                    nodeTypes.Add(type);
                }
            }
            nodeTypes.Sort(delegate(Type a, Type b) { return(a.Name.CompareTo(b.Name)); });

            CodeCompileUnit ccu = new CodeCompileUnit();
            CodeNamespace   cns = ccu.AddNamespace("ICSharpCode.NRefactory.Ast");

            cns.AddImport("System");
            cns.AddImport("System.Collections.Generic");
            cns.AddImport("AgentRalph.Visitors");
            foreach (Type type in nodeTypes)
            {
                if (type.GetCustomAttributes(typeof(CustomImplementationAttribute), false).Length == 0)
                {
                    CodeTypeDeclaration ctd = cns.AddType(type.Name);
                    if (type.IsAbstract)
                    {
                        ctd.TypeAttributes |= TypeAttributes.Abstract;
                    }
                    ctd.IsPartial = true;
                    ctd.BaseTypes.Add(new CodeTypeReference(type.BaseType.Name));

                    ProcessType(type, ctd);

                    foreach (object o in type.GetCustomAttributes(false))
                    {
                        if (o is TypeImplementationModifierAttribute)
                        {
                            (o as TypeImplementationModifierAttribute).ModifyImplementation(cns, ctd, type);
                        }
                    }

                    if (!type.IsAbstract)
                    {
                        AddAnAcceptVisitorMethod(type, ctd, "IAstVisitor", typeof(object));

                        // Create an overload
                        AddAnAcceptVisitorMethod(type, ctd, "AstComparisonVisitor", typeof(bool));

                        AddAChillunsGetter(type, ctd);

                        var method = new CodeMemberMethod();
                        method.Name       = "ToString";
                        method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
                        method.ReturnType = new CodeTypeReference(typeof(string));
                        method.Statements.Add(new CodeMethodReturnStatement(CreateToString(type)));
                        ctd.Members.Add(method);
                    }
                }
            }

            System.CodeDom.Compiler.CodeGeneratorOptions settings = new System.CodeDom.Compiler.CodeGeneratorOptions();
            settings.IndentString  = "\t";
            settings.VerbatimOrder = true;

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(directory + "Generated.cs", writer.ToString());
            }

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateAstVisitorInterface(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "../IAstVisitor.cs", writer.ToString());
            }

            // My modifications to the generation process are not preserving the creation of these particular files.
            // So I just don't regenerate them for the time being.
//			ccu = new CodeCompileUnit();
//			cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
//			cns.AddImport("System");
//			cns.AddImport("System.Collections.Generic");
//			cns.AddImport("System.Diagnostics");
//			cns.AddImport("ICSharpCode.NRefactory.Ast");
//			cns.Types.Add(CreateAstVisitorClass(nodeTypes, false));
//
//			using (StringWriter writer = new StringWriter()) {
//				new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
//				File.WriteAllText(visitorsDir + "AbstractAstVisitor.cs", writer.ToString());
//			}
//
//			ccu = new CodeCompileUnit();
//			cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
//			cns.AddImport("System");
//			cns.AddImport("System.Collections.Generic");
//			cns.AddImport("System.Diagnostics");
//			cns.AddImport("ICSharpCode.NRefactory.Ast");
//			cns.Types.Add(CreateAstVisitorClass(nodeTypes, true));
//
//			using (StringWriter writer = new StringWriter()) {
//				new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
//				File.WriteAllText(visitorsDir + "AbstractAstTransformer.cs", writer.ToString());
//			}

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateNodeTrackingAstVisitorClass(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                // CodeDom cannot output "sealed", so we need to use this hack:
                File.WriteAllText(visitorsDir + "NodeTrackingAstVisitor.cs",
                                  writer.ToString().Replace("public override object", "public sealed override object"));
            }

            //NotImplementedAstVisitor
            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateNotImplementedAstVisitorClass(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "NotImplementedAstVisitor.cs", writer.ToString());
            }


            // TwoTreeAbstractAstVisitor
            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("AgentRalph.Visitors");
            cns.AddImport("System");
            cns.AddImport("System.Collections.Generic");
            cns.AddImport("System.Diagnostics");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.AddImport("ICSharpCode.NRefactory");
            cns.Types.Add(CreateAstComparisonVisitorClass(nodeTypes));

            using (StringWriter writer = new StringWriter())
            {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                // Put it in the NRefactor project
                var path = visitorsDir + "AstComparisonVisitor.Generated.cs";
                File.WriteAllText(path, writer.ToString());
                Console.WriteLine("Created file " + path);
            }



            Console.WriteLine("AST Generator done!");
        }
Ejemplo n.º 4
0
        public static void Main(string[] args)
        {
            string directory   = "../../../Project/Src/Ast/";
            string visitorsDir = "../../../Project/Src/Visitors/";

            Debug.WriteLine("AST Generator running...");
            if (!File.Exists(directory + "INode.cs"))
            {
                Debug.WriteLine("did not find output directory");
                return;
            }
            if (!File.Exists(visitorsDir + "AbstractAstTransformer.cs"))
            {
                Debug.WriteLine("did not find visitor output directory");
                return;
            }

            List <Type> nodeTypes = new List <Type>();

            foreach (Type type in typeof(MainClass).Assembly.GetTypes())
            {
                if (type.IsClass && typeof(INode).IsAssignableFrom(type))
                {
                    nodeTypes.Add(type);
                }
            }
            nodeTypes.Sort(delegate(Type a, Type b) { return(a.Name.CompareTo(b.Name)); });

            CodeCompileUnit ccu = new CodeCompileUnit();
            CodeNamespace   cns = ccu.AddNamespace("ICSharpCode.NRefactory.Ast");

            cns.AddImport("System");
            cns.AddImport("System.Collections.Generic");
            foreach (Type type in nodeTypes)
            {
                if (type.GetCustomAttributes(typeof(CustomImplementationAttribute), false).Length == 0)
                {
                    CodeTypeDeclaration ctd = cns.AddType(type.Name);
                    if (type.IsAbstract)
                    {
                        ctd.TypeAttributes |= TypeAttributes.Abstract;
                    }
                    ctd.BaseTypes.Add(new CodeTypeReference(type.BaseType.Name));

                    ProcessType(type, ctd);

                    foreach (object o in type.GetCustomAttributes(false))
                    {
                        if (o is TypeImplementationModifierAttribute)
                        {
                            (o as TypeImplementationModifierAttribute).ModifyImplementation(cns, ctd, type);
                        }
                    }

                    if (!type.IsAbstract)
                    {
                        CodeMemberMethod method = new CodeMemberMethod();
                        method.Name       = "AcceptVisitor";
                        method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
                        method.Parameters.Add(new CodeParameterDeclarationExpression("IAstVisitor", "visitor"));
                        method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "data"));
                        method.ReturnType = new CodeTypeReference(typeof(object));
                        CodeExpression ex = new CodeVariableReferenceExpression("visitor");
                        ex = new CodeMethodInvokeExpression(ex, VisitPrefix + ctd.Name,
                                                            new CodeThisReferenceExpression(),
                                                            new CodeVariableReferenceExpression("data"));
                        method.Statements.Add(new CodeMethodReturnStatement(ex));
                        ctd.Members.Add(method);

                        method            = new CodeMemberMethod();
                        method.Name       = "ToString";
                        method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
                        method.ReturnType = new CodeTypeReference(typeof(string));
                        method.Statements.Add(new CodeMethodReturnStatement(CreateToString(type)));
                        ctd.Members.Add(method);
                    }
                }
            }

            System.CodeDom.Compiler.CodeGeneratorOptions settings = new System.CodeDom.Compiler.CodeGeneratorOptions();
            settings.IndentString  = "\t";
            settings.VerbatimOrder = true;

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(directory + "Generated.cs", writer.ToString());
            }

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateAstVisitorInterface(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "../IAstVisitor.cs", writer.ToString());
            }

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("System.Collections.Generic");
            cns.AddImport("System.Diagnostics");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateAstVisitorClass(nodeTypes, false));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "AbstractAstVisitor.cs", writer.ToString());
            }

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("System.Collections.Generic");
            cns.AddImport("System.Diagnostics");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateAstVisitorClass(nodeTypes, true));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "AbstractAstTransformer.cs", writer.ToString());
            }

            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateNodeTrackingAstVisitorClass(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                // CodeDom cannot output "sealed", so we need to use this hack:
                File.WriteAllText(visitorsDir + "NodeTrackingAstVisitor.cs",
                                  writer.ToString().Replace("public override object", "public sealed override object"));
            }

            //NotImplementedAstVisitor
            ccu = new CodeCompileUnit();
            cns = ccu.AddNamespace("ICSharpCode.NRefactory.Visitors");
            cns.AddImport("System");
            cns.AddImport("ICSharpCode.NRefactory.Ast");
            cns.Types.Add(CreateNotImplementedAstVisitorClass(nodeTypes));

            using (StringWriter writer = new StringWriter()) {
                new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(ccu, writer, settings);
                File.WriteAllText(visitorsDir + "NotImplementedAstVisitor.cs", writer.ToString());
            }
            Debug.WriteLine("AST Generator done!");
        }
Ejemplo n.º 5
0
 public static CodeTypeDeclaration AddClass(this CodeNamespace ns, string className) => ns.AddType(Declare.Class(className));
Ejemplo n.º 6
0
        private void GenerateClient(string name, CodeNamespace ns, int complex_type_count)
        {
            CodeTypeDeclaration type = ns.AddType(name);

            type.IsClass        = true;
            type.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
            type.BaseTypes.Add(typeof(RpcAlpcClientBase));

            CodeConstructor constructor = type.AddConstructor(MemberAttributes.Public | MemberAttributes.Final);

            constructor.BaseConstructorArgs.Add(CodeGenUtils.GetPrimitive(_server.InterfaceId.ToString()));
            constructor.BaseConstructorArgs.Add(CodeGenUtils.GetPrimitive(_server.InterfaceVersion.Major));
            constructor.BaseConstructorArgs.Add(CodeGenUtils.GetPrimitive(_server.InterfaceVersion.Minor));

            foreach (var proc in _server.Procedures)
            {
                string proc_name = proc.Name;
                if (!_proc_names.Add(proc_name))
                {
                    proc_name = $"{proc_name}_{proc.ProcNum}";
                    if (!_proc_names.Add(proc_name))
                    {
                        throw new ArgumentException($"Duplicate name {proc.Name}");
                    }
                }

                var method = type.AddMethod(proc_name, MemberAttributes.Public | MemberAttributes.Final);
                RpcTypeDescriptor return_type = GetTypeDescriptor(proc.ReturnValue.Type);
                if (return_type == null)
                {
                    method.ThrowNotImplemented("Return type unsupported.");
                    continue;
                }

                var offset_to_name =
                    proc.Params.Select(p => Tuple.Create(p.Offset, p.Name)).ToList();

                method.ReturnType = return_type.CodeType;
                method.CreateMarshalObject(MARSHAL_NAME);
                foreach (var p in proc.Params)
                {
                    if (p == proc.Handle)
                    {
                        continue;
                    }
                    RpcTypeDescriptor p_type = GetTypeDescriptor(p.Type);

                    List <RpcMarshalArgument> extra_marshal_args = new List <RpcMarshalArgument>();
                    if (p_type.VarianceDescriptor.IsValid)
                    {
                        extra_marshal_args.Add(p_type.VarianceDescriptor.CalculateCorrelationArgument(p.Offset, offset_to_name));
                    }

                    var p_obj = method.AddParam(p_type.GetParameterType(), p.Name);
                    p_obj.Direction = p.GetDirection();
                    if (!p.IsIn)
                    {
                        continue;
                    }
                    if (p_type.Pointer)
                    {
                        if (p_type.PointerType == RpcPointerType.Reference)
                        {
                            method.AddNullCheck(MARSHAL_NAME, p.Name);
                        }
                        else
                        {
                            method.AddWriteReferent(MARSHAL_NAME, p.Name);
                        }
                    }
                    else if (!p_type.ValueType)
                    {
                        method.AddNullCheck(MARSHAL_NAME, p.Name);
                    }
                    method.AddMarshalCall(p_type, MARSHAL_NAME, p.Name, extra_marshal_args.ToArray());
                    // If it's a constructed type then ensure any deferred writes are flushed.
                    if (p_type.Constructed)
                    {
                        method.AddFlushDeferredWrites(MARSHAL_NAME);
                    }
                }

                method.SendReceive(MARSHAL_NAME, UNMARSHAL_NAME, proc.ProcNum);

                foreach (var p in proc.Params.Where(x => x.IsOut))
                {
                    if (p == proc.Handle)
                    {
                        continue;
                    }

                    RpcTypeDescriptor p_type = GetTypeDescriptor(p.Type);
                    if (p_type.Pointer)
                    {
                        method.AddPointerUnmarshalCall(p_type, UNMARSHAL_NAME, p.Name);
                    }
                    else
                    {
                        method.AddUnmarshalCall(p_type, UNMARSHAL_NAME, p.Name);
                    }
                    if (p_type.Constructed)
                    {
                        method.AddPopluateDeferredPointers(UNMARSHAL_NAME);
                    }
                }

                method.AddUnmarshalReturn(return_type, UNMARSHAL_NAME);
            }

            if (complex_type_count > 0 && HasFlag(RpcClientBuilderFlags.GenerateConstructorProperties))
            {
                var constructor_type = new CodeTypeReference(CodeGenUtils.MakeIdentifier(CONSTRUCTOR_STRUCT_NAME));
                var prop             = type.AddProperty("New", constructor_type, MemberAttributes.Public | MemberAttributes.Final,
                                                        new CodeMethodReturnStatement(new CodeObjectCreateExpression(constructor_type)));
                constructor_type = new CodeTypeReference(CodeGenUtils.MakeIdentifier(ARRAY_CONSTRUCTOR_STRUCT_NAME));
                type.AddProperty("NewArray", constructor_type, MemberAttributes.Public | MemberAttributes.Final,
                                 new CodeMethodReturnStatement(new CodeObjectCreateExpression(constructor_type)));
            }
        }
Ejemplo n.º 7
0
        private int GenerateComplexTypes(CodeNamespace ns)
        {
            int type_count = 0;

            // First populate the type cache.
            foreach (var complex_type in _server.ComplexTypes)
            {
                if (complex_type is NdrBaseStructureTypeReference struct_type)
                {
                    _type_descriptors[complex_type] = new RpcTypeDescriptor(complex_type.Name, true,
                                                                            "ReadStruct", true, "WriteStruct", complex_type, null, null);
                    type_count++;
                }
            }

            if (type_count == 0)
            {
                return(0);
            }

            bool create_constructor_properties         = HasFlag(RpcClientBuilderFlags.GenerateConstructorProperties);
            CodeTypeDeclaration constructor_type       = null;
            CodeTypeDeclaration array_constructor_type = null;

            if (create_constructor_properties)
            {
                constructor_type                = ns.AddType(CONSTRUCTOR_STRUCT_NAME);
                constructor_type.IsStruct       = true;
                array_constructor_type          = ns.AddType(ARRAY_CONSTRUCTOR_STRUCT_NAME);
                array_constructor_type.IsStruct = true;
            }

            // Now generate the complex types.
            foreach (var complex_type in _server.ComplexTypes)
            {
                if (!(complex_type is NdrBaseStructureTypeReference struct_type))
                {
                    ns.Comments.Add(new CodeCommentStatement($"Unsupported type {complex_type.GetType()} {complex_type.Name}"));
                    continue;
                }

                var s_type = ns.AddType(complex_type.Name);
                s_type.IsStruct = true;
                s_type.BaseTypes.Add(new CodeTypeReference(typeof(INdrStructure)));

                var marshal_method = s_type.AddMarshalMethod(MARSHAL_NAME);
                marshal_method.AddAlign(MARSHAL_NAME, struct_type.Alignment + 1);
                var unmarshal_method = s_type.AddUnmarshalMethod(UNMARSHAL_NAME);
                unmarshal_method.AddAlign(UNMARSHAL_NAME, struct_type.Alignment + 1);

                var offset_to_name =
                    struct_type.Members.Select(m => Tuple.Create(m.Offset, m.Name)).ToList();
                var default_initialize_expr = new Dictionary <string, CodeExpression>();
                var member_parameters       = new List <Tuple <CodeTypeReference, string> >();

                foreach (var member in struct_type.Members)
                {
                    var f_type = GetTypeDescriptor(member.MemberType);
                    s_type.AddField(f_type.GetStructureType(), member.Name, MemberAttributes.Public);
                    member_parameters.Add(Tuple.Create(f_type.GetParameterType(), member.Name));

                    List <RpcMarshalArgument> extra_marshal_args = new List <RpcMarshalArgument>();
                    if (f_type.VarianceDescriptor.IsValid)
                    {
                        extra_marshal_args.Add(f_type.VarianceDescriptor.CalculateCorrelationArgument(member.Offset, offset_to_name));
                    }

                    if (f_type.Pointer)
                    {
                        marshal_method.AddDeferredMarshalCall(f_type, MARSHAL_NAME, member.Name, extra_marshal_args.ToArray());
                        unmarshal_method.AddDeferredEmbeddedUnmarshalCall(f_type, UNMARSHAL_NAME, member.Name);
                    }
                    else
                    {
                        if (!f_type.ValueType)
                        {
                            marshal_method.AddNullCheck(MARSHAL_NAME, member.Name);
                        }

                        marshal_method.AddMarshalCall(f_type, MARSHAL_NAME, member.Name, extra_marshal_args.ToArray());
                        unmarshal_method.AddUnmarshalCall(f_type, UNMARSHAL_NAME, member.Name);
                    }

                    if (!f_type.Pointer || f_type.PointerType == RpcPointerType.Reference)
                    {
                        if (f_type.CodeType.ArrayRank > 0)
                        {
                            default_initialize_expr.Add(member.Name, new CodeArrayCreateExpression(f_type.CodeType, CodeGenUtils.GetPrimitive(f_type.FixedCount)));
                        }
                        else if (f_type.BuiltinType == typeof(string) && f_type.FixedCount > 0)
                        {
                            default_initialize_expr.Add(member.Name, new CodeObjectCreateExpression(f_type.CodeType, CodeGenUtils.GetPrimitive('\0'),
                                                                                                    CodeGenUtils.GetPrimitive(f_type.FixedCount)));
                        }
                    }
                }

                var p_type = _type_descriptors[complex_type];

                if (!create_constructor_properties)
                {
                    s_type.AddDefaultConstructorMethod("CreateDefault", MemberAttributes.Public | MemberAttributes.Static, p_type, default_initialize_expr);
                    s_type.AddConstructorMethod(p_type, member_parameters);
                }
                else
                {
                    constructor_type.AddDefaultConstructorMethod(complex_type.Name, MemberAttributes.Public | MemberAttributes.Final, p_type, default_initialize_expr);
                    constructor_type.AddConstructorMethod(complex_type.Name, p_type, member_parameters);
                    array_constructor_type.AddArrayConstructorMethod(complex_type.Name, p_type);
                }
            }

            return(type_count);
        }