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); }
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); }
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)); }