public ImGuiInstanceMethodDefinition(string name, string linkName, List <object> argsT, string parentType, string returnType, bool isGeneric, Dictionary <string, object> defaults) : base(name, linkName, argsT, parentType, isGeneric, defaults)
        {
            ReturnType = ImGui.FixType(returnType);

            var pOuts = Args.Where(a => a.Name == "pOut");

            if (pOuts.Count() == 1)
            {
                ReturnType = pOuts.Single().Type.Trim('*');
            }

            if (IsGeneric)
            {
                var originalArgs = Args.Where(a => a.Type.Replace("*", "") == ParentType);
                var newArgs      = new Dictionary <int, ImGuiMethodParameter>();

                foreach (var originalArg in originalArgs)
                {
                    var originalArgType = originalArg.Type.Replace("*", "");
                    var newArg          = new ImGuiMethodParameter(originalArg.Name, originalArg.Type.Replace(originalArgType, $"{originalArgType}<T>"));
                    var index           = Args.IndexOf(originalArg);
                    newArgs[index] = newArg;
                }

                foreach (var newArg in newArgs)
                {
                    Args.RemoveAt(newArg.Key);
                    Args.Insert(newArg.Key, newArg.Value);
                }
            }
        }
Example #2
0
        public static string FixType(string type)
        {
            if (type.Contains("_") && !IsFunctionPointer(type) && !type.EndsWith("_t") && !type.EndsWith("_t*"))
            {
                return(FixTemplate(type));
            }

            var fixedType = type;

            fixedType = fixedType.Replace("const ", "");
            fixedType = fixedType.Replace(" const", "");
            fixedType = fixedType.Replace("unsigned ", "u");
            fixedType = fixedType.Replace("signed ", "");
            fixedType = fixedType.Replace("_t", "");
            fixedType = RemovePrefix(fixedType);

            if (fixedType.EndsWith("int"))
            {
                fixedType += "32";
            }
            else if (fixedType.EndsWith("int*"))
            {
                fixedType = $"{fixedType.Remove(fixedType.Length - 4, 4)}int32*";
            }

            if (IsFunctionPointer(fixedType))
            {
                var returnType = fixedType.Substring(0, fixedType.IndexOf('('));
                var args       = ImGuiMethodParameter.From(fixedType.Substring(fixedType.IndexOf(')') + 1));
                fixedType = $"function {returnType}({args.ToLinkableDefinitionArg()})";
            }

            return(fixedType);
        }
        private static int DefaultValueComparison(ImGuiMethodParameter left, ImGuiMethodParameter right)
        {
            if (left.DefaultValue == "" && right.DefaultValue == "" ||
                left.DefaultValue != "" && right.DefaultValue != "")
            {
                return(0);
            }

            if (left.DefaultValue != "")
            {
                return(1);
            }

            if (right.DefaultValue != "")
            {
                return(-1);
            }

            return(0);
        }
Example #4
0
        public ImGuiConstructorDefinition(string linkName, List <object> argsT, string structType, bool isGeneric, Dictionary <string, object> defaults) : base("this", linkName, argsT, structType, isGeneric, defaults)
        {
            if (IsGeneric)
            {
                var originalArgs = Args.Where(a => a.Type.Replace("*", "") == ParentType);
                var newArgs      = new Dictionary <int, ImGuiMethodParameter>();

                foreach (var originalArg in originalArgs)
                {
                    var originalArgType = originalArg.Type.Replace("*", "");
                    var newArg          = new ImGuiMethodParameter(originalArg.Name, originalArg.Type.Replace(originalArgType, $"{originalArgType}<T>"));
                    var index           = Args.IndexOf(originalArg);
                    newArgs[index] = newArg;
                }

                foreach (var newArg in newArgs)
                {
                    Args.RemoveAt(newArg.Key);
                    Args.Insert(newArg.Key, newArg.Value);
                }
            }
        }
 public ImGuiMethodDefinition(string name, string linkName, List <object> argsT, Dictionary <string, object> defaults)
 {
     Name     = name.ToPascalCase();
     LinkName = linkName;
     Args     = ImGuiMethodParameter.From(argsT.ConvertAll(a => (Dictionary <string, object>)a), defaults);
 }
Example #6
0
        public static List <ImGuiStruct> From(Dictionary <string, object> structs, ref List <ImGuiMethodDefinition> methods)
        {
            var structList = new List <ImGuiStruct>();

            var constructors    = methods.Where(m => m is ImGuiConstructorDefinition).ToList().ConvertAll(m => m as ImGuiConstructorDefinition);
            var destructors     = methods.Where(m => m is ImGuiDestructorDefinition).ToList().ConvertAll(m => m as ImGuiDestructorDefinition);
            var instanceMethods = methods.Where(m => m is ImGuiInstanceMethodDefinition).ToList().ConvertAll(m => m as ImGuiInstanceMethodDefinition);

            var vectorProps = new List <dynamic>();

            var prop1 = new Dictionary <string, object>();

            prop1["name"] = "Size";
            prop1["type"] = "int";
            vectorProps.Add(prop1);

            var prop2 = new Dictionary <string, object>();

            prop2["name"] = "Capacity";
            prop2["type"] = "int";
            vectorProps.Add(prop2);

            var prop3 = new Dictionary <string, object>();

            prop3["name"] = "Data";
            prop3["type"] = "T*";
            vectorProps.Add(prop3);

            structs["ImVector"] = vectorProps;

            foreach (var name in structs.Keys)
            {
                var fixedName     = ImGui.RemovePrefix(name);
                var structMethods = new List <ImGuiStructMethodDefinition>();
                structMethods.AddRange(constructors.Where(m => m.ParentType == fixedName));
                structMethods.AddRange(destructors.Where(m => m.ParentType == fixedName));
                structMethods.AddRange(instanceMethods.Where(m => m.ParentType == fixedName));

                bool isGeneric = false;
                foreach (var structMethod in structMethods)
                {
                    methods.Remove(structMethod);
                    if (structMethod is ImGuiInstanceMethodDefinition i)
                    {
                        instanceMethods.Remove(i);
                        if (i.IsGeneric)
                        {
                            isGeneric = true;
                        }
                    }
                }

                var properties = new List <ImGuiStructProperty>();
                var unions     = new List <ImGuiStructUnion>();

                foreach (var property in (List <dynamic>)structs[name])
                {
                    if (ImGui.IsUnion((string)property["type"]))
                    {
                        var unionName       = $"{ImGui.RemovePrefix(name)}Union{unions.Count}";
                        var unionProperties = ImGui.GetUnionProperties((string)property["type"]);

                        var unionPropertyName        = $"Union{unions.Count}";
                        var structPropertyForwarders = new List <ImGuiStructProperty>();
                        foreach (var unionProperty in unionProperties)
                        {
                            structPropertyForwarders.Add(new ImGuiStructProperty(
                                                             unionProperty.Name,
                                                             unionProperty.Type,
                                                             $"{{ get {{ return {unionPropertyName}.{unionProperty.Name}; }} set mut {{ {unionPropertyName}.{unionProperty.Name} = value; }} }}"));
                        }

                        properties.Add(new ImGuiStructProperty(unionPropertyName, unionName, "= .()", "private"));
                        properties.AddRange(structPropertyForwarders);
                        unions.Add(new ImGuiStructUnion(unionName, unionProperties, new List <ImGuiStructMethodDefinition>(), new List <ImGuiStructUnion>()));
                    }
                    else
                    {
                        var size = -1;
                        if (property.ContainsKey("size"))
                        {
                            size = (int)property["size"];
                        }

                        var type = (string)property["type"];
                        if (property.ContainsKey("template_type"))
                        {
                            var templateType       = (string)property["template_type"];
                            var underscoreTemplate = templateType.Replace(' ', '_');
                            type = type.Replace(underscoreTemplate, templateType);
                        }

                        properties.Add(new ImGuiStructProperty((string)property["name"], type, size: size));
                    }
                }

                structList.Add(new ImGuiStruct(name, properties, structMethods, unions, isGeneric));
            }

            // Leftover methods without a valid parent
            foreach (var method in instanceMethods)
            {
                ImGuiStruct parent = null;
                if (!structList.Any(s => s.Name == ImGui.RemovePrefix(method.ParentType)))
                {
                    parent = new ImGuiStruct(method.ParentType, new List <ImGuiStructProperty>(), new List <ImGuiStructMethodDefinition>(), new List <ImGuiStructUnion>(), method.IsGeneric);
                    structList.Add(parent);
                }
                else
                {
                    parent = structList.Single(s => s.Name == ImGui.RemovePrefix(method.ParentType));
                }

                parent.Methods.Add(method);

                var originalArgs = method.Args.Where(a => a.Type.Replace("*", "") == parent.Name);
                var newArgs      = new Dictionary <int, ImGuiMethodParameter>();

                foreach (var originalArg in originalArgs)
                {
                    var originalArgType = originalArg.Type.Replace("*", "");
                    var newArg          = new ImGuiMethodParameter(originalArg.Name, originalArg.Type.Replace(originalArgType, $"{originalArgType}<T>"));
                    var index           = method.Args.IndexOf(originalArg);
                    newArgs[index] = newArg;
                }

                foreach (var newArg in newArgs)
                {
                    method.Args.RemoveAt(newArg.Key);
                    method.Args.Insert(newArg.Key, newArg.Value);
                }
            }

            methods.RemoveAll(m => m is ImGuiConstructorDefinition);
            methods.RemoveAll(m => m is ImGuiDestructorDefinition);
            methods.RemoveAll(m => m is ImGuiInstanceMethodDefinition);

            return(structList);
        }