Пример #1
0
        public bool TryGetParameterVariant(Parameter parameter, out Parameter variant, Project core)
        {
            if (parameter.Type.ToString() == "char*" || parameter.Type.ToString() == "byte*" ||
                parameter.Type.ToString() == "GLchar*" || parameter.Type.ToString() == "GLbyte*" ||
                parameter.Type.ToString() == "GLubyte*")
            {
                var variantBuilder = new ParameterSignatureBuilder(parameter)
                                     .WithType
                                     (
                    new Type
                {
                    Name  = "string", IndirectionLevels = 0,
                    IsOut = parameter.Flow == FlowDirection.Out &&
                            ((parameter.Count?.IsStatic ?? false) || (parameter.Count?.IsReference ?? false))
                }
                                     );

                if (!(parameter.Flow == FlowDirection.Out &&
                      ((parameter.Count?.IsStatic ?? false) || (parameter.Count?.IsReference ?? false))))
                {
                    variantBuilder = variantBuilder.WithCount(null);
                }

                variant = variantBuilder.Build();

                return(true);
            }

            variant = null;
            return(false);
        }
Пример #2
0
        public bool TryGetParameterVariant(Parameter parameter, out Parameter variant, Project core)
        {
            if (parameter.Type.ToString() == "char*" || parameter.Type.ToString() == "byte*" ||
                parameter.Type.ToString() == "GLchar*" || parameter.Type.ToString() == "GLbyte*" ||
                parameter.Type.ToString() == "GLubyte*")
            {
                var variantBuilder = new ParameterSignatureBuilder(parameter)
                                     .WithType
                                     (
                    new Type
                {
                    Name  = "string", IndirectionLevels = 0,
                    IsOut = parameter.Flow == FlowDirection.Out &&
                            ((parameter.Count?.IsStatic ?? false) || (parameter.Count?.IsReference ?? false)),
                    OriginalName = parameter.Type.OriginalName
                }
                                     );

                if (!(parameter.Flow == FlowDirection.Out &&
                      ((parameter.Count?.IsStatic ?? false) || (parameter.Count?.IsReference ?? false))))
                {
                    variantBuilder = variantBuilder.WithCount(null);
                }

                variant = variantBuilder.Build();
                variant.Attributes.Add
                (
                    new()
                {
                    Name      = "UnmanagedType",
                    Arguments = new() { variant.Type.MapUnmanagedType() }
                }
                );

                return(true);
            }

            variant = null;
            return(false);
        }
Пример #3
0
        public IEnumerable <Overload> CreateOverloads(Function function)
        {
            if (!function.Parameters.Any(x => x.Type.IsPointer && !x.Type.IsVoidPointer()))
            {
                yield break;
            }

            var sb            = new StringBuilder();
            var parameters    = new List <string>();
            var ind           = string.Empty;
            var sig           = new FunctionSignatureBuilder(function);
            var newParameters = new Parameter[function.Parameters.Count];

            sb.AppendLine("// FlowPointerOverloader");

            for (var i = 0; i < function.Parameters.Count; i++)
            {
                var param = function.Parameters[i];
                if (param.Type.IsPointer && !param.Type.IsVoidPointer())
                {
                    var newParameterType = new TypeSignatureBuilder(param.Type)
                                           .WithIndirectionLevel(param.Type.IndirectionLevels - 1);
                    switch (param.Flow)
                    {
                    case FlowDirection.Undefined:
                        newParameterType = newParameterType.WithByRef(true);
                        break;

                    case FlowDirection.In:
                        newParameterType = newParameterType.WithIsIn(true);
                        break;

                    case FlowDirection.Out:
                        newParameterType = newParameterType.WithIsOut(true);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    var newParameter = new ParameterSignatureBuilder(param).WithType(newParameterType.Build());
                    var ptrName      = (param.Name + "Ptr").Replace("@", "");

                    parameters.Add(ptrName);
                    sb.AppendLine(ind + $"fixed ({param.Type} {ptrName} = &{param.Name})");
                    sb.AppendLine(ind + "{");

                    ind += "    ";
                    newParameters[i] = newParameter.Build();
                }
                else
                {
                    parameters.Add((Utilities.CSharpKeywords.Contains(param.Name) ? "@" : string.Empty) + param.Name);
                    newParameters[i] = param;
                }
            }

            sb.Append(ind);
            if (function.ReturnType.ToString() != "void")
            {
                sb.Append("return ");
            }

            sb.AppendLine(function.Name + "(" + string.Join(", ", parameters) + ");");

            while (!string.IsNullOrEmpty(ind))
            {
                ind = ind.Remove(ind.Length - 4, 4);
                sb.AppendLine(ind + "}");
            }

            yield return(new Overload(sig.WithParameters(newParameters).Build(), sb, true));
        }