Exemplo n.º 1
0
        public virtual void GenerateClass(ApiClass api, CodeWriter s)
        {
            GenerateUsings(s);
            s.AppendLine($"namespace {NameSpace}");
            s.Block(() =>
            {
                var names          = new ArraySlice <string>(api.ClassName.Split('.'));
                var static_classes = names.GetSlice(new Slice(0, names.Length - 1));
                var class_name     = names.Last();
                int levels         = names.Length - 1;
                if (levels > 0)
                {
                    foreach (var name in static_classes)
                    {
                        s.Out($"public static partial class {EscapeName(name)} {{");
                        s.Indent();
                    }
                }
                GenerateDocString(api, s);
                s.Out($"public partial class {EscapeName(class_name)} : {EscapeName(api.BaseClass)}");
                s.Block(() =>
                {
                    s.Out($"// auto-generated class");
                    s.Break();
                    s.Out($"public {EscapeName(class_name)}(PyObject pyobj) : base(pyobj) {{ }}");
                    s.Break();
                    s.Out($"public {EscapeName(class_name)}({EscapeName(api.BaseClass)} other) : base(other.PyObject as PyObject) {{ }}");
                    s.Break();

                    // additional constructors
                    foreach (var func in api.Constructors)
                    {
                        try
                        {
                            if (func.ManualOverride || func.Ignore)
                            {
                                continue;
                            }
                            func.Sanitize();
                            func.IsConstructor = true;
                            func.ClassName     = string.Join(".", static_classes);
                            func.Name          = class_name;
                            var arguments      = GenerateArguments(func);
                            //var passed_args = GeneratePassedArgs(func);
                            s.Out($"public {EscapeName(class_name)}({arguments})");
                            s.Block(() =>
                            {
                                GenerateFunctionBody(func, s);
                            });
                        }
                        catch (Exception e)
                        {
                            s.Out("// Error generating constructor");
                            s.Out("// Message: " + e.Message);
                            s.Out("/*");
                            s.Out(e.StackTrace);
                            s.Out("----------------------------");
                            s.Out("Declaration JSON:");
                            s.Out(JObject.FromObject(func).ToString(Formatting.Indented));
                            s.Out("*/");
                        }
                    }
                    // functions
                    s.Break();
                    foreach (var decl in api.Declarations)
                    {
                        try
                        {
                            if (decl.ManualOverride || decl.Ignore)
                            {
                                continue;
                            }
                            GenerateApiFunction(decl, s);
                        }
                        catch (Exception e)
                        {
                            s.Out("// Error generating delaration: " + decl.Name);
                            s.Out("// Message: " + e.Message);
                            s.Out("/*");
                            s.Out(e.StackTrace);
                            s.Out("----------------------------");
                            s.Out("Declaration JSON:");
                            s.Out(JObject.FromObject(decl).ToString(Formatting.Indented));
                            s.Out("*/");
                        }
                    }
                });
                if (levels > 0)
                {
                    foreach (var name in static_classes)
                    {
                        s.Outdent();
                        s.Out("}");
                    }
                }
                //if (decl.CommentOut)
                //    s.Out("*/");
                s.Break();
            });
        }