コード例 #1
0
        public void GenerateClassHeaderMembers(AST.Object type, bool fullIntellisense = false)
        {
            if (type.Origin != TypeOrigin.MappedIntermediary)
            {
                Line("#pragma region Gluon Maintained");
                Line("// clang-format off");
            }

            Region(() =>
            {
                Indent++;

                var localTranslations = GenerateLocalTranslations(type);

                Indent--;
                Spacer();

                LocalTranslationsBlock(localTranslations, () =>
                {
                    Line("public:");
                    Indent++;

                    // ABI type declaration
                    Line("typedef {0} ABIType;", TypeRef(type, true));
                    Spacer();

                    AST.Access currentAccess       = AST.Access.Public;
                    AST.Construct currentConstruct = AST.Construct.Void;

                    foreach (var member in type.Members.OrderBy(m => m.Access))
                    {
                        var access = member.Access;

                        if (access == AST.Access.Internal)
                        {
                            access = AST.Access.Public;
                        }

                        if (access != currentAccess)
                        {
                            currentAccess = access;
                            Indent--;
                            Spacer();

                            Line(access.ToString().ToLower() + ":");
                            Indent++;
                        }

                        var construct = member.ConstructType;

                        if (construct != currentConstruct)
                        {
                            Spacer();
                            currentConstruct = construct;
                        }

                        switch (construct)
                        {
                        case AST.Construct.Constructor:
                            {
                                var constructor = (AST.Constructor)member;

                                Line("{0}({1});", type.Name, DeclParameters(true, constructor.Parameters));
                            }
                            break;

                        case AST.Construct.Event:
                            {
                                var ev = (AST.Event)member;
                                if (ev.IsAbstract || ev.IsVirtual)
                                {
                                    Line("VirtualEvent<{0}, {1}> {2}", Signature(ev), type.Name, ev.Name);
                                    Line("    {{ this, &{0}::Add{1}Handler, &{0}::Remove{1}Handler }};", type.Name, ev.Name);
                                }
                                else
                                {
                                    Line("Event<{0}> {1} {{_{1}}};", Signature(ev), ev.Name);
                                }
                            }
                            break;

                        case AST.Construct.Property:
                            {
                                var prop = (AST.Property)member;


                                Spacer();
                                Line("PROPERTY{0}({1}, {2});", prop.IsReadOnly ? "_READONLY" : "",
                                     VariableType(prop, (prop.Type.IsStruct || prop.Type.IsDelegate || (prop.Type.IsObject && prop.IsFactory)) ?
                                                  AST.VariableContext.Return : AST.VariableContext.In), prop.Name);

                                GenerateMethodDeclaration(type, prop.CreateGetter());

                                if (!prop.IsReadOnly)
                                {
                                    GenerateMethodDeclaration(type, prop.CreateSetter());
                                }
                            }
                            break;

                        case AST.Construct.Method:
                            {
                                var method = (AST.Method)member;
                                GenerateMethodDeclaration(type, method);
                            }
                            break;

                        default:
                            throw new Exception("Oops, unhandled member type: " + construct.ToString());
                        }
                    }

                    Spacer();
                    if (currentAccess != AST.Access.Public)
                    {
                        Indent--;
                        Line("public:");
                        Indent++;
                        currentAccess = AST.Access.Public;
                    }

                    // Wrapped Interface Implementation
                    foreach (var iface in type.Interfaces)
                    {
                        if (iface.Origin == TypeOrigin.Native)
                        {
                            continue;
                        }

                        BlockComment(() => Code(iface.Name));

                        foreach (var method in iface.Methods)
                        {
                            GenerateMethodDeclaration(type, method);
                        }
                        Spacer();
                    }


                    Spacer();
                    foreach (var ev in type.Events)
                    {
                        if (currentAccess != AST.Access.Private)
                        {
                            Indent--;
                            Line("private:");
                            Indent++;
                            currentAccess = AST.Access.Private;
                        }

                        if (ev.IsAbstract || ev.IsVirtual)
                        {
                            Line("virtual void Add{0}Handler(const Delegate<{1}>& handler){2};", ev.Name, Signature(ev), ev.IsAbstract ? " = 0" : "");
                            Line("virtual void Remove{0}Handler(const Delegate<{1}>& handler){2};", ev.Name, Signature(ev), ev.IsAbstract ? " = 0" : "");
                        }
                        else
                        {
                            Line("EventTrigger<{0}> _{1};", Signature(ev), ev.Name);
                        }
                    }
                    Spacer();

                    Strata = ApiStrata.ABI;

                    if (currentAccess != AST.Access.Private)
                    {
                        Indent--;
                        Line("private:");
                        Indent++;
                        currentAccess = AST.Access.Private;
                    }

                    // ABI interface members
                    GenerateInterfaceMembers(type, false, fullIntellisense);
                    Spacer();

                    foreach (var iface in type.Interfaces)
                    {
                        if (iface.Origin == TypeOrigin.Native)
                        {
                            continue;
                        }

                        GenerateInterfaceMembers(iface, false, fullIntellisense);
                        Spacer();
                    }

                    Strata = ApiStrata.Normal;
                });
            });

            Indent--;

            if (type.Origin != TypeOrigin.MappedIntermediary)
            {
                Line("// clang-format on");
                Line("#pragma endregion");
            }
        }
コード例 #2
0
        public void GenerateWrapperHeaderMembers(AST.Object type)
        {
            Line("#pragma region Gluon Maintained");
            Line("// clang-format off");
            Line($"    typedef {(type.BaseType == null ? "ABI::Wrapper" : TypeRef(type.BaseType))} Base;");
            Line($"    WRAPPER_CORE({type.Name}, ::ABI::{type.FullName("::")})");

            AST.Construct currentConstruct = AST.Construct.Constructor;

            Indent++;
            Region(() =>
            {
                var localTranslations = GenerateLocalTranslations(type);
                UseLocalTranslations  = true;

                LocalTranslationsBlock(localTranslations, () =>
                {
                    //Spacer();
                    //Line($"{type.Name}();");
                    //Line($"{type.Name}(std::nullptr_t);");
                    //Line($"{type.Name}(const {type.Name}& copy);");
                    //Line($"{type.Name}({type.Name}&& move);");
                    var currentAccess = AST.Access.Private;

                    foreach (var member in type.Members /*.Where(m => m.Access == AST.Access.Public)*/.OrderBy(m => m.ConstructType).OrderBy(m => m.Access))
                    {
                        if (member is AST.Constructor)
                        {
                            continue;
                        }

                        if (member.ConstructType != currentConstruct)
                        {
                            Spacer();
                            currentConstruct = member.ConstructType;
                        }

                        if (member.Access != currentAccess)
                        {
                            Spacer();
                            Indent--;
                            Line($"{member.Access.ToString().ToLower()}:");
                            Indent++;
                            currentAccess = member.Access;
                        }

                        WriteXmlDocumentation(member.XmlDoc);

                        switch (member)
                        {
                        case AST.Constructor constructor:
                            //Line("{0}({1});", type.Name, DeclParameters(true, constructor.Parameters));
                            break;

                        case AST.Event ev:
                            Line($"VirtualEvent<{Signature(ev)}, {type.Name}> {ev.Name}");
                            Line("    {{ this, &{0}::Add{1}Handler, &{0}::Remove{1}Handler }};", type.Name, ev.Name);
                            break;

                        case AST.Property prop:
                            Line("PROPERTY{0}({1}, {2});", prop.IsReadOnly ? "_READONLY" : "",
                                 VariableType(prop, (prop.Type.IsStruct || prop.Type.IsDelegate || (prop.Type.IsObject && prop.IsFactory)) ?
                                              AST.VariableContext.Return : AST.VariableContext.In), prop.Name);

                            GenerateMethodDeclaration(type, prop.CreateGetter().AsConst());

                            if (!prop.IsReadOnly)
                            {
                                GenerateMethodDeclaration(type, prop.CreateSetter().AsConst());
                            }
                            break;

                        case AST.Method method:
                            GenerateMethodDeclaration(type, method.AsConst());
                            break;

                        default:
                            throw new Exception("Oops, unhandled member type: " + member.ConstructType.ToString());
                        }
                    }

                    var allEvents = type.Members.Where(m => m.Access == AST.Access.Public).OfType <AST.Event>().ToArray();

                    if (allEvents != null && allEvents.Length > 0)
                    {
                        Spacer();
                        Indent--;
                        Line("private:");
                        Indent++;
                        Spacer();

                        foreach (var ev in allEvents)
                        {
                            GenerateMethodDeclaration(type, ev.CreateAdder().AsConst());
                            GenerateMethodDeclaration(type, ev.CreateRemover().AsConst());
                        }
                    }
                });
            });
            Indent--;
            Spacer();

            Line("// clang-format on");
            Line("#pragma endregion");
        }