Example #1
0
        protected override Data.OverloadSetting GetOverload(Type neosType)
        {
            NodeOverload typeOverload = neosType.GetCustomAttribute <NodeOverload>();

            if (Overloads.TryGetValue(neosType.FullName, out Data.OverloadSetting overloadSetting))
            {
                return(overloadSetting);
            }
            if (typeOverload != null)
            {
                if (Overloads.TryGetValue(typeOverload.FunctionName, out overloadSetting))
                {
                    return(overloadSetting);
                }
                Type foundTypeOverload = LogixHelper.GetMatchingOverload(typeOverload.FunctionName, null, new Func <Type, int>(GetTypeRank));
                if (foundTypeOverload != null)
                {
                    OverloadCache.Add(typeOverload.FunctionName);
                    return(new Data.OverloadSetting {
                        OverloadType = foundTypeOverload?.FullName
                    });
                }
            }
            return(new Data.OverloadSetting {
                OverloadType = neosType.FullName
            });
        }
Example #2
0
            public SmokeTest ToSmokeTestOrNull()
            {
                // We just need to fill in the arguments...
                var candidate = new SmokeTest {
                    Client = Client, Method = Method
                };

                // Parameterless RPCs are very rare, but are good candidates for smoke tests.
                // Admittedly this has some false positives, e.g. in Vision, ProductSearchClient.PurgeProducts.
                if (Overloads.Any(o => o.RequiredParameters.Count == 0))
                {
                    // No arguments required
                    return(candidate);
                }
                // If there's a method that accepts just a ProjectName, find its equivalent accepting a string. (There should be exactly one.)
                if (Overloads.Any(o => o.HasSingleParameterOfType("Google.Api.Gax.ResourceNames.ProjectName")))
                {
                    var stringParameter = Overloads.Single(o => o.HasSingleParameterOfType(typeof(string))).RequiredParameters[0];
                    candidate.Arguments[stringParameter.Name] = "projects/${PROJECT_ID}";
                    return(candidate);
                }

                // If there's a method that accepts just a LocationName, find its equivalent accepting a string. (There should be exactly one.)
                if (Overloads.Any(o => o.HasSingleParameterOfType("Google.Api.Gax.ResourceNames.LocationName")))
                {
                    var stringParameter = Overloads.Single(o => o.HasSingleParameterOfType(typeof(string))).RequiredParameters[0];
                    candidate.Arguments[stringParameter.Name] = "projects/${PROJECT_ID}/locations/us-east1";
                    return(candidate);
                }
                return(null);
            }
Example #3
0
        public override bool AltMem <EqA>(A a)
        {
            Fun <A, List <A> > wrap = delegate(A e) { return(new Cons <A>(e, new Nil <A>())); };

            return(Overloads.Eq <EqA, A>(a, h) || t.Map(wrap).Mem <EqList <EqA, A> >(wrap(a)));
            //return Eq(a,h) || t.Map(wrap).Mem(wrap(a));
        }
        public IEnumerable <string> GetExtensions()
        {
            var nativeExtensions   = NativeSignatures.Select(f => f.Extension);
            var overloadExtensions = Overloads.Select(f => f.Extension);

            return(nativeExtensions.Concat(overloadExtensions).Distinct());
        }
Example #5
0
 public DrawStrings()
 {
     graphics = new GraphicsDeviceManager(this);
     
     Content.RootDirectory = "Content";
     _overload = Overloads.Overload3;
 }
        public IEnumerable <string> GetCategories()
        {
            var nativeCategories   = NativeSignatures.SelectMany(f => f.Categories);
            var overloadCategories = Overloads.SelectMany(f => f.Categories);

            return(nativeCategories.Concat(overloadCategories).Distinct());
        }
Example #7
0
        /// <summary>
        /// Executes this command with specified context.
        /// </summary>
        /// <param name="ctx">Context to execute the command in.</param>
        /// <returns>Command's execution results.</returns>
        public virtual async Task <CommandResult> ExecuteAsync(CommandContext ctx)
        {
            CommandResult res = default;

            try
            {
                var executed = false;
                foreach (var ovl in Overloads.OrderByDescending(x => x.Priority))
                {
                    ctx.Overload = ovl;
                    var args = await CommandsNextUtilities.BindArguments(ctx, ctx.Config.IgnoreExtraArguments).ConfigureAwait(false);

                    if (!args.IsSuccessful)
                    {
                        continue;
                    }

                    ctx.RawArguments = args.Raw;

                    var mdl = ovl.InvocationTarget ?? Module?.GetInstance(ctx.Services);
                    if (mdl is BaseCommandModule bcmBefore)
                    {
                        await bcmBefore.BeforeExecutionAsync(ctx).ConfigureAwait(false);
                    }

                    args.Converted[0] = mdl;
                    var ret = (Task)ovl.Callable.DynamicInvoke(args.Converted);
                    await ret.ConfigureAwait(false);

                    executed = true;
                    res      = new CommandResult
                    {
                        IsSuccessful = true,
                        Context      = ctx
                    };

                    if (mdl is BaseCommandModule bcmAfter)
                    {
                        await bcmAfter.AfterExecutionAsync(ctx).ConfigureAwait(false);
                    }
                    break;
                }

                if (!executed)
                {
                    throw new ArgumentException("Could not find a suitable overload for the command.");
                }
            }
            catch (Exception ex)
            {
                res = new CommandResult
                {
                    IsSuccessful = false,
                    Exception    = ex,
                    Context      = ctx
                };
            }

            return(res);
        }
Example #8
0
        internal override Command Build(CommandGroup parent)
        {
            var cmd = new CommandGroup
            {
                Name             = Name,
                Description      = Description,
                Aliases          = Aliases,
                ExecutionChecks  = ExecutionChecks,
                IsHidden         = IsHidden,
                Parent           = parent,
                Overloads        = new ReadOnlyCollection <CommandOverload>(Overloads.Select(xo => xo.Build()).ToList()),
                Module           = Module,
                CustomAttributes = CustomAttributes
            };

            var cs = new List <Command>();

            foreach (var xc in Children)
            {
                cs.Add(xc.Build(cmd));
            }

            cmd.Children = new ReadOnlyCollection <Command>(cs);
            return(cmd);
        }
        public override void AddOverload(ICompletionData n)
        {
            if (Overloads == null)
            {
                Overloads = new List <ICompletionData>();
                Overloads.Add(this);
            }

            Overloads.Add(n);
        }
        public FunctionSignature FindFunctionWithEntrypoint([NotNull] string entrypoint)
        {
            var nativeSignature = NativeSignatures.FirstOrDefault(f => f.NativeEntrypoint == entrypoint);

            if (nativeSignature is null)
            {
                return(Overloads.FirstOrDefault(f => f.NativeEntrypoint == entrypoint));
            }

            return(nativeSignature);
        }
Example #11
0
        public FunctionSymbol(string name, IEnumerable <FunctionOverload> overloads)
            : base(name)
        {
            Overloads     = overloads.ToImmutableArray();
            FunctionFlags = Overloads.First().Flags;

            if (Overloads.Skip(1).Any(fo => fo.Flags != FunctionFlags))
            {
                // we should catch this as early as possible
                throw new ArgumentException("Inconsistent function flags found on overloads");
            }
        }
Example #12
0
 private bool VerifyReadLineParseOverloads(Overloads overloads)
 {
     if (overloads.Name != "ReadLine")
     {
         return(false);
     }
     if (overloads.ReturnType != "string")
     {
         return(false);
     }
     if (overloads.Count() != 1)
     {
         return(false);
     }
     return(true);
 }
Example #13
0
        public async Task RequestParameters(string code, int cursorPosition, int tokenStart)
        {
            await DoCancellableAction(async (token) =>
            {
                var paramsRaw = await ideServices.GetOverloadsAndParametersAsync(code, cursorPosition, token);

                // If cancelled, then don't bother sending details back to the client
                token.ThrowIfCancellationRequested();

                if (paramsRaw != null) // Don't bother calling back if there is no parameter list to show
                {
                    var overloads = new Overloads(paramsRaw);
                    Clients.Caller.ParamsCallback(overloads, tokenStart);
                }
            }, Context.ConnectionId, inProgressParams);
        }
Example #14
0
        internal virtual Command Build(CommandGroup parent)
        {
            var cmd = new Command
            {
                Name             = Name,
                Description      = Description,
                Aliases          = Aliases,
                ExecutionChecks  = ExecutionChecks,
                IsHidden         = IsHidden,
                Parent           = parent,
                Overloads        = new ReadOnlyCollection <CommandOverload>(Overloads.Select(xo => xo.Build()).ToList()),
                Module           = Module,
                CustomAttributes = CustomAttributes
            };

            return(cmd);
        }
Example #15
0
        private bool VerifyDateTimeParseOverloads(Overloads overloads)
        {
            if (overloads.Name != "Parse")
            {
                return(false);
            }
            if (overloads.ReturnType != "DateTime")
            {
                return(false);
            }

            if (overloads.Count() != 3)
            {
                return(false);
            }
            var threeParams = overloads.Single(method => method.Parameters.Count == 3).Parameters.ToArray();

            if (threeParams[0].Name != "s")
            {
                return(false);
            }
            if (threeParams[0].Type != "string")
            {
                return(false);
            }
            if (threeParams[1].Name != "provider")
            {
                return(false);
            }
            if (threeParams[1].Type != "IFormatProvider")
            {
                return(false);
            }
            if (threeParams[2].Name != "styles")
            {
                return(false);
            }
            if (threeParams[2].Type != "DateTimeStyles")
            {
                return(false);
            }

            return(true);
        }
Example #16
0
        public static void Run()
        {
            List <int> l1 = FromArray(1, 2, 3, 4);
            List <int> l2 = FromArray(5, 6, 7, 8);

            Console.WriteLine("Lists: Eq(null,null)={0}", Overloads.Eq <EqList <EqInt, int>, List <int> >(null, null));
            Console.WriteLine("Lists: Eq(null,l1)={0}", Overloads.Eq <EqList <EqInt, int>, List <int> >(null, l1));
            Console.WriteLine("Lists: Eq(l1,null)={0}", Overloads.Eq <EqList <EqInt, int>, List <int> >(l1, null));
            Console.WriteLine("Lists: Eq(l1,l1)={0}", Overloads.Eq <EqList <EqInt, int>, List <int> >(l1, l1));
            Console.WriteLine("Lists: Eq(l1,l2)={0}", Overloads.Eq <EqList <EqInt, int>, List <int> >(l1, l2));
            List <List <int> > ll1 = FromArray(l1, l2);
            List <List <int> > ll2 = FromArray(l2, l1);

            Console.WriteLine("Lists: Eq(null,null)={0}", Overloads.Eq <EqList <EqList <EqInt, int>, List <int> >, List <List <int> > >(null, null));
            Console.WriteLine("Lists: Eq(null,ll1)={0}", Overloads.Eq <EqList <EqList <EqInt, int>, List <int> >, List <List <int> > >(null, ll1));
            Console.WriteLine("Lists: Eq(ll1,null)={0}", Overloads.Eq <EqList <EqList <EqInt, int>, List <int> >, List <List <int> > >(ll1, null));
            Console.WriteLine("Lists: Eq(ll1,ll1)={0}", Overloads.Eq <EqList <EqList <EqInt, int>, List <int> >, List <List <int> > >(ll1, ll1));
            Console.WriteLine("Lists: Eq(ll1,ll2)={0}", Overloads.Eq <EqList <EqList <EqInt, int>, List <int> >, List <List <int> > >(ll1, ll2));
        }
Example #17
0
        bool Eq <List <A> > .Equals(List <A> a, List <A> b)
        {
            Nil <A> an = a as Nil <A>;

            if (an != null)
            {
                Nil <A> ab = b as Nil <A>;
                return(b != null);
            }
            ;
            Cons <A> ac = a as Cons <A>;

            if (ac != null)
            {
                Cons <A> bc = b as Cons <A>;
                return(bc != null && Overloads.Eq <EqA, A>(ac.h, bc.h) && Overloads.Eq <EqList <EqA, A>, List <A> >(ac.t, bc.t));
            }
            return(b == null);
        }
Example #18
0
        protected override void Update(GameTime gameTime)
        {
            KeyboardState currentState = Keyboard.GetState();

            if (currentState.IsKeyDown(Keys.Escape) && _lastState.IsKeyUp(Keys.Escape))
                this.Exit();

            if (_overload == Overloads.Overload6)
                _overload = Overloads.Overload3;
            else
            {
                if (currentState.IsKeyDown(Keys.O) && _lastState.IsKeyUp(Keys.O))
                    _overload++;
            }

            _lastState = currentState;

            base.Update(gameTime);
        }
Example #19
0
        internal override IEnumerable <NameExpression> Walk()
        {
            List <NameExpression> freeVars = new List <NameExpression>();

            foreach (Definition definition in Definitions)
            {
                freeVars.AddRange(definition.Walk());
            }

            DeclaredVariables = new List <Variable>();
            foreach (Definition definition in Definitions)
            {
                if (!(definition is FunctionDefinition))
                {
                    DeclaredVariables.Add(definition.DeclaredVariable);
                }
            }

            List <FunctionDefinition> functions = Definitions
                                                  .Where(statement => statement is FunctionDefinition)
                                                  .Select(statement => statement as FunctionDefinition)
                                                  .ToList();

            Overloads = Compiler.GenerateOverloads(functions);
            DeclaredVariables.AddRange(Overloads.Select(o => o.variable));

            foreach (Variable variable in DeclaredVariables)
            {
                variable.Global = true;
            }

            Compiler.MatchVariables(freeVars, DeclaredVariables);
            return(freeVars);

            // TODO: Walk the imports that refer to actual Redwood modules?
        }
Example #20
0
 public Overloads(Overloads overloads)
   : this(overloads.members, overloads.scope, overloads.positionOfSelectedMember, overloads.helper, overloads.OverloadKind) {
 }
Example #21
0
 public override bool Mem <EqA>(A a)
 {
     return(Overloads.Eq <EqA, A>(a, h) || t.Mem <EqA>(a));
     //return Eq(a, h) || t.Mem(a);
 }
Example #22
0
        public override bool Eq <EqA>(List <A> a)
        {
            Cons <A> ca = a as Cons <A>;

            return((a != null) && ca != null && Overloads.Eq <EqA, A>(h, ca.h) && this.t.Eq <EqA>(ca.t));
        }
Example #23
0
        internal override IEnumerable <NameExpression> Walk()
        {
            Type = RedwoodType.Make(this);
            base.Walk();
            DeclaredVariable.KnownType       = RedwoodType.GetForCSharpType(typeof(RedwoodType));
            DeclaredVariable.DefinedConstant = true;
            DeclaredVariable.ConstantValue   = Type;
            List <NameExpression> freeVars     = new List <NameExpression>();
            List <Variable>       declaredVars = new List <Variable>();

            InterfaceImplicitConversionVars = new List <Variable>();
            int maxConstructorArgs = 0;

            This = new Variable
            {
                Name      = "this",
                KnownType = Type
            };
            declaredVars.Add(This);

            if (ParameterFields != null)
            {
                maxConstructorArgs = ParameterFields.Length;
                foreach (ParameterDefinition param in ParameterFields)
                {
                    freeVars.AddRange(param.Walk());
                    declaredVars.Add(param.DeclaredVariable);
                }
            }

            foreach (TypeSyntax interfaceType in Interfaces)
            {
                freeVars.AddRange(interfaceType.Walk());
                // TODO: What if we inherit an implicit, or if we
                // a function that is meant to represent this, or
                // an implicit declared function?
                InterfaceImplicitConversionVars.Add(
                    new Variable
                {
                    Name            = RuntimeUtil.GetNameOfConversionToType(interfaceType.TypeName.Name),
                    Closured        = true,
                    DefinedConstant = true
                }
                    );
            }

            foreach (LetDefinition field in InstanceFields)
            {
                freeVars.AddRange(field.Walk());
                declaredVars.Add(field.DeclaredVariable);
            }

            foreach (FunctionDefinition constructor in Constructors)
            {
                freeVars.AddRange(constructor.Walk());
                maxConstructorArgs = Math.Max(maxConstructorArgs, constructor.Parameters.Length);
            }

            TempArgumentVariables = new List <Variable>();
            for (int i = 0; i < maxConstructorArgs; i++)
            {
                TempArgumentVariables.Add(new Variable
                {
                    Temporary = true
                });
            }

            foreach (FunctionDefinition method in Methods)
            {
                freeVars.AddRange(method.Walk());
                // Closure these variables even though they aren't in the
                // object's map so that they can be directly accessed
                method.DeclaredVariable.Closured = true;
            }
            Overloads = Compiler.GenerateOverloads(Methods.ToList());
            declaredVars.AddRange(Overloads.Select(o => o.variable));

            declaredVars.AddRange(InterfaceImplicitConversionVars);
            MemberVariables = declaredVars;
            // Make sure that all of our variables end up in the closure that
            // makes up our RedwoodObject
            foreach (Variable member in declaredVars)
            {
                member.Closured = true;
            }

            // Treat the class as a closure that can be populated and then
            // updated by all methods.
            Compiler.MatchVariables(freeVars, declaredVars);

            // When it comes to static methods, we don't want to match to
            // our own instance variables.
            foreach (FunctionDefinition method in StaticMethods)
            {
                freeVars.AddRange(method.Walk());
            }
            StaticOverloads = Compiler.GenerateOverloads(StaticMethods.ToList());

            return(freeVars);
        }
Example #24
0
        private static void Write(
            string outputPath,
            string className,
            string enumType,
            List <EnumData> enums,
            List <FunctionData> functions,
            bool includeLoadAssemblyFunction,
            string initFunctionName = "")
        {
            string[] license = File.ReadAllLines(Path.Combine(AssemblyDirectory, "License.txt"));

            StringBuilder sb = new StringBuilder(1024);

            foreach (var line in license)
            {
                sb.Append("// ");
                sb.AppendLine(line);
            }

            sb.AppendLine();
            sb.AppendLine("#nullable disable");
            sb.AppendLine();

            sb.AppendLine("using System;");
            sb.AppendLine("using System.Runtime.InteropServices;");
            sb.AppendLine("using System.Security;");
            sb.AppendLine("using System.Text;");
            sb.AppendLine();
            sb.AppendLine("namespace GLESDotNet");
            sb.AppendLine("{");
            sb.AppendLine($"\tpublic static unsafe partial class {className}");
            sb.AppendLine("\t{");

            foreach (var @enum in enums.OrderBy(x => x.Name))
            {
                string type  = enumType;
                string name  = @enum.Name;
                string value = @enum.Value;

                if (value == "0xFFFFFFFFFFFFFFFFull")
                {
                    value = "0xFFFFFFFFFFFFFFFF";
                }

                if (value.EndsWith("ull") || value == "0xFFFFFFFFFFFFFFFF")
                {
                    type = "ulong";
                }
                else if (value.EndsWith("u") || value == "0xFFFFFFFF")
                {
                    type = "uint";
                }

                if (value.StartsWith("EGL_CAST("))
                {
                    int index = value.LastIndexOf(',') + 1;
                    value = value.Substring(index, value.Length - index - 1);
                }

                sb.AppendLine($"\t\tpublic const {type} {name} = {value};");
            }

            sb.AppendLine();

            var orderedFunctions = functions.OrderBy(x => x.Name);

            sb.AppendLine("\t\tprivate static class Delegates");
            sb.AppendLine("\t\t{");

            foreach (var function in orderedFunctions)
            {
                string returnType = GetReturnType(function.ReturnType);
                string parameters = string.Join(", ", function.Params.Select(x => GetParamType(x) + " " + GetParamName(x.Name)));

                sb.AppendLine($"\t\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]");
                sb.AppendLine($"\t\t\tpublic delegate {returnType} {function.Name}({parameters});");
                sb.AppendLine();
            }

            sb.AppendLine("\t\t}");
            sb.AppendLine();

            foreach (var function in orderedFunctions)
            {
                sb.AppendLine($"\t\tprivate static Delegates.{function.Name} _{function.Name};");
                sb.AppendLine();
            }

            if (includeLoadAssemblyFunction)
            {
                sb.AppendLine($"\t\tstatic {className}()");
                sb.AppendLine("\t\t{");
                sb.AppendLine("\t\t\tLoadFunctions(LoadAssembly());");
            }
            else
            {
                sb.AppendLine($"\t\tpublic static void {initFunctionName}(Func<string, IntPtr> getProcAddress)");
                sb.AppendLine("\t\t{");
                sb.AppendLine("\t\t\tLoadFunctions(getProcAddress);");
            }

            sb.AppendLine("\t\t}");
            sb.AppendLine();

            sb.AppendLine($"\t\tprivate static void LoadFunctions(Func<string, IntPtr> getProcAddress)");
            sb.AppendLine("\t\t{");

            sb.AppendLine("\t\t\tT getProc<T>(string name) => Marshal.GetDelegateForFunctionPointer<T>(getProcAddress(name));");
            sb.AppendLine();

            foreach (var function in orderedFunctions)
            {
                sb.AppendLine($"\t\t\t_{function.Name} = getProc<Delegates.{function.Name}>(\"{function.Name}\");");
            }

            sb.AppendLine("\t\t}");
            sb.AppendLine();

            foreach (var function in orderedFunctions)
            {
                string returnType     = GetReturnType(function.ReturnType);
                string parameters     = string.Join(", ", function.Params.Select(x => GetParamType(x) + " " + GetParamName(x.Name)));
                string parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name)));

                sb.AppendLine($"\t\tpublic static {returnType} {function.Name}({parameters})");
                sb.AppendLine("\t\t{");

                sb.Append("\t\t\t");

                if (returnType != "void")
                {
                    sb.Append("return ");
                }

                sb.AppendLine($"_{function.Name}({parameterNames});");

                sb.AppendLine("\t\t}");
                sb.AppendLine();

                if (function.GenerateIntPtrOverload)
                {
                    parameters     = string.Join(", ", function.Params.Select(x => (GetParamType(x) == "void*" ? "IntPtr" : GetParamType(x)) + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => (GetParamType(x) == "void*" ? "(void*)" : "") + GetParamName(x.Name)));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}({parameters})");
                    sb.AppendLine("\t\t{");

                    sb.Append("\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t}");
                    sb.AppendLine();
                }

                if (function.GenerateArrayOverload)
                {
                    parameters     = string.Join(", ", function.Params.Select(x => GetParamType(x).Replace("*", "[]") + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name) + (x.UseForArrayOverload ? "Ptr" : "")));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}({parameters})");
                    sb.AppendLine("\t\t{");

                    foreach (var param in function.Params.Where(x => x.UseForArrayOverload))
                    {
                        sb.AppendLine($"\t\t\tfixed ({GetParamType(param)} {GetParamName(param.Name)}Ptr = {GetParamName(param.Name)})");
                    }

                    sb.AppendLine("\t\t\t{");
                    sb.Append("\t\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");
                    sb.AppendLine();
                }

                if (function.GenerateGenericOverload)
                {
                    // T[]
                    parameters     = string.Join(", ", function.Params.Select(x => (x.UseForGenericOverload ? "T[]" : GetParamType(x)) + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name) + (x.UseForGenericOverload ? "Ptr" : "")));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}<T>({parameters})");
                    sb.AppendLine("\t\t\twhere T: unmanaged");
                    sb.AppendLine("\t\t{");

                    foreach (var param in function.Params.Where(x => x.UseForGenericOverload))
                    {
                        sb.AppendLine($"\t\t\tfixed ({GetParamType(param)} {GetParamName(param.Name)}Ptr = {GetParamName(param.Name)})");
                    }

                    sb.AppendLine("\t\t\t{");
                    sb.Append("\t\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");

                    sb.AppendLine();

                    // ref T
                    parameters     = string.Join(", ", function.Params.Select(x => (x.UseForGenericOverload ? "ref T" : GetParamType(x)) + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name) + (x.UseForGenericOverload ? "Ptr" : "")));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}<T>({parameters})");
                    sb.AppendLine("\t\t\twhere T: unmanaged");
                    sb.AppendLine("\t\t{");

                    foreach (var param in function.Params.Where(x => x.UseForGenericOverload))
                    {
                        sb.AppendLine($"\t\t\tfixed ({GetParamType(param)} {GetParamName(param.Name)}Ptr = &{GetParamName(param.Name)})");
                    }

                    sb.AppendLine("\t\t\t{");
                    sb.Append("\t\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");

                    sb.AppendLine();
                }

                if (function.GenerateRefOverload)
                {
                    parameters     = string.Join(", ", function.Params.Select(x => (x.UseForRefOverload ? "ref " : "") + GetParamType(x, isRefOrOutOverload: x.UseForRefOverload) + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name) + (x.UseForRefOverload ? "Ptr" : "")));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}({parameters})");
                    sb.AppendLine("\t\t{");

                    foreach (var param in function.Params.Where(x => x.UseForRefOverload))
                    {
                        sb.AppendLine($"\t\t\tfixed ({GetParamType(param)} {GetParamName(param.Name)}Ptr = &{GetParamName(param.Name)})");
                    }

                    sb.AppendLine("\t\t\t{");
                    sb.Append("\t\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t\t}");

                    sb.AppendLine("\t\t}");

                    sb.AppendLine();
                }

                if (function.GenerateOutOverload)
                {
                    parameters     = string.Join(", ", function.Params.Select(x => (x.UseForOutOverload ? "out " : "") + GetParamType(x, isRefOrOutOverload: x.UseForOutOverload) + " " + GetParamName(x.Name)));
                    parameterNames = string.Join(", ", function.Params.Select(x => GetParamName(x.Name) + (x.UseForOutOverload ? "Ptr" : "")));

                    sb.AppendLine($"\t\tpublic static {returnType} {function.Name}({parameters})");
                    sb.AppendLine("\t\t{");

                    foreach (var param in function.Params.Where(x => x.UseForOutOverload))
                    {
                        sb.AppendLine($"\t\t\tfixed ({GetParamType(param)} {GetParamName(param.Name)}Ptr = &{GetParamName(param.Name)})");
                    }

                    sb.AppendLine("\t\t\t{");
                    sb.Append("\t\t\t\t");

                    if (returnType != "void")
                    {
                        sb.Append("return ");
                    }

                    sb.AppendLine($"_{function.Name}({parameterNames});");

                    sb.AppendLine("\t\t\t}");

                    sb.AppendLine("\t\t}");

                    sb.AppendLine();
                }

                if (Overloads.ContainsKey(function.Name))
                {
                    sb.AppendLine(Overloads[function.Name].Trim('\r', '\n'));
                    sb.AppendLine();
                }
            }

            sb.AppendLine("\t}");
            sb.AppendLine("}");

            File.WriteAllText(Path.GetFullPath(outputPath), sb.ToString());
        }
 public override int GetHashCode() => base.GetHashCode() ^ Overloads.GetHashCode();
 public static IEnumerable <object[]> GetOverloads() => Overloads.Select(o => new[] { (object)o });
 public OptionOverloadOption(Overloads p)
 {
     Value = p;
 }