/// <inheritdoc/> public IEnumerable <Overload> CreateOverloads(Function function) { if (!IsApplicable(function)) { yield break; } var arrayParameter = function.Parameters.Last(); var arrayParameterType = arrayParameter.Type; var newName = function.Name.Singularize(false); var newParameters = SkipLastExtension.SkipLast(new List <Parameter>(function.Parameters), 2).ToList(); var newArrayParameterType = new TypeSignatureBuilder(arrayParameterType) .WithArrayDimensions(0) .WithIndirectionLevel(0) .Build(); var newArrayParameter = new ParameterSignatureBuilder(arrayParameter) .WithType(newArrayParameterType) .Build(); newParameters.Add(newArrayParameter); var sb = new StringBuilder(); sb.AppendLine("// ArrayParameterOverloader"); sb.AppendLine(function.Name + "(1, &" + newArrayParameter.Name + ");"); yield return(new Overload(new FunctionSignatureBuilder(function) .WithName(newName) .WithParameters(newParameters) .Build(), sb, true)); }
/// <inheritdoc/> public IEnumerable <(FunctionSignature, StringBuilder)> CreateOverloads(FunctionSignature function) { if (!IsApplicable(function)) { yield break; } var lastParameterType = function.Parameters.Last().Type; var newReturnType = new TypeSignatureBuilder(lastParameterType) .WithIndirectionLevel(lastParameterType.IndirectionLevel - 1) .WithArrayDimensions(0) .Build(); var newParameters = SkipLastExtension.SkipLast(function.Parameters, 1).ToList(); var newName = function.Name.Singularize(false); var functionBuilder = new FunctionSignatureBuilder(function) .WithName(newName) .WithReturnType(newReturnType); var sb = new StringBuilder(); var strParams = newParameters.Select(x => Utilities.CSharpKeywords.Contains(x.Name) ? "@" + x.Name : x.Name) .Concat(new[] { "ret" }); sb.AppendLine(lastParameterType + " ret = null;"); sb.Append(function.Name + "("); sb.Append(string.Join(", ", strParams)); sb.AppendLine(");"); sb.AppendLine("return *ret;"); if (!newParameters.Any()) { yield return(functionBuilder .WithParameters(newParameters) .Build(), sb); yield break; } // TODO: check if this has anything to do with CLS compliance var sizeParameterType = newParameters.Last().Type; if (!sizeParameterType.Name.StartsWith("int", StringComparison.OrdinalIgnoreCase) || sizeParameterType.IsPointer) { yield return(functionBuilder .WithParameters(newParameters) .Build(), sb); yield break; } newParameters = SkipLastExtension.SkipLast(newParameters, 1).ToList(); yield return ( functionBuilder .WithParameters(newParameters) .Build(), sb ); }
/// <inheritdoc/> public IEnumerable <FunctionSignature> CreateOverloads(FunctionSignature function) { var lastParameterType = function.Parameters.Last().Type; var newReturnType = new TypeSignatureBuilder(lastParameterType) .WithIndirectionLevel(lastParameterType.IndirectionLevel - 1) .WithArrayDimensions(0) .Build(); var newParameters = SkipLastExtension.SkipLast(function.Parameters, 1).ToList(); var newName = function.Name.Singularize(false); var functionBuilder = new FunctionSignatureBuilder(function) .WithName(newName) .WithReturnType(newReturnType); if (!newParameters.Any()) { yield return(functionBuilder .WithParameters(newParameters) .Build()); yield break; } // TODO: check if this has anything to do with CLS compliance var sizeParameterType = newParameters.Last().Type; if (!sizeParameterType.Name.StartsWith("int", StringComparison.OrdinalIgnoreCase) || sizeParameterType.IsPointer) { yield return(functionBuilder .WithParameters(newParameters) .Build()); yield break; } newParameters = SkipLastExtension.SkipLast(newParameters, 1).ToList(); yield return(functionBuilder .WithParameters(newParameters) .Build()); }
/// <inheritdoc/> public bool TryGetFunctionVariant(Function function, out ImplementedFunction overload, Project core) { if (!IsApplicable(function)) { overload = null; return(false); } var arrayParameter = function.Parameters.Last(); var arrayParameterType = arrayParameter.Type; var newName = function.Name.Singularize(false); var newParameters = SkipLastExtension.SkipLast(new List <Parameter>(function.Parameters), 2).ToList(); var newArrayParameterType = new TypeSignatureBuilder(arrayParameterType) .WithArrayDimensions(0) .WithIndirectionLevel(0) .Build(); var newArrayParameter = new ParameterSignatureBuilder(arrayParameter) .WithType(newArrayParameterType) .Build(); newParameters.Add(newArrayParameter); var sb = new StringBuilder(); sb.AppendLine("// ArrayParameterOverloader"); sb.AppendLine($"{function.Name}(1, &{newArrayParameter.Name});"); overload = new ImplementedFunction(new FunctionSignatureBuilder(function) .WithName(newName) .WithParameters(newParameters) .Build(), sb, function, true); return(true); }
/// <inheritdoc/> public IEnumerable <FunctionSignature> CreateOverloads(FunctionSignature function) { var arrayParameter = function.Parameters.Last(); var arrayParameterType = arrayParameter.Type; var newName = function.Name.Singularize(false); var newParameters = SkipLastExtension.SkipLast(new List <ParameterSignature>(function.Parameters), 2).ToList(); var newArrayParameterType = new TypeSignatureBuilder(arrayParameterType) .WithArrayDimensions(0) .WithIndirectionLevel(0) .Build(); var newArrayParameter = new ParameterSignatureBuilder(arrayParameter) .WithType(newArrayParameterType) .Build(); newParameters.Add(newArrayParameter); yield return(new FunctionSignatureBuilder(function) .WithName(newName) .WithParameters(newParameters) .Build()); }
/// <inheritdoc/> public IEnumerable <ImplementedFunction> CreateOverloads(Function function) { if (!IsApplicable(function)) { yield break; } var lastParameterType = function.Parameters.Last().Type; var newReturnType = new TypeSignatureBuilder(lastParameterType) .WithIndirectionLevel(lastParameterType.IndirectionLevels - 1) .WithArrayDimensions(0) .Build(); var newParameters = SkipLastExtension.SkipLast(function.Parameters, 1).ToList(); var newName = function.Name.Singularize(false); var functionBuilder = new FunctionSignatureBuilder(function) .WithName(newName) .WithReturnType(newReturnType); var sb = new StringBuilder(); var strParams = newParameters.Select(Convert).Concat(new[] { "&ret" }); sb.AppendLine("// ReturnTypeOverloader"); sb.AppendLine($"{newReturnType} ret = default;"); sb.Append($"{function.Name}("); sb.Append(string.Join(", ", strParams)); sb.AppendLine(");"); sb.AppendLine("return ret;"); if (!newParameters.Any()) { yield return(new ImplementedFunction(functionBuilder .WithParameters(newParameters) .Build(), sb, true)); yield break; } var sizeParameterType = newParameters.Last().Type; if ((sizeParameterType.Name != "int" && sizeParameterType.Name != "uint") || sizeParameterType.IsPointer) { yield return(new ImplementedFunction(functionBuilder .WithParameters(newParameters) .Build(), sb, true)); yield break; } var n = newParameters.Last().Name; sb.Insert(0, $"const {(sizeParameterType.Name == "uint" ? "uint " : "int ")}{(Utilities.CSharpKeywords.Contains(n) ? "@" : "")}{n} = 1;\n" ); newParameters = SkipLastExtension.SkipLast(newParameters, 1).ToList(); yield return(new ImplementedFunction ( functionBuilder .WithParameters(newParameters) .Build(), sb, true )); string Convert(Parameter x) { var pre = x.Type.IsOut ? "out " : string.Empty; return(pre + (Utilities.CSharpKeywords.Contains(x.Name) ? $"@{x.Name}" : x.Name)); } }
/// <inheritdoc/> public IEnumerable <Overload> CreateOverloads(Function function) { if (!IsApplicable(function)) { yield break; } var lastParameterType = function.Parameters.Last().Type; var newReturnType = new TypeSignatureBuilder(lastParameterType) .WithIndirectionLevel(lastParameterType.IndirectionLevels - 1) .WithArrayDimensions(0) .Build(); var newParameters = SkipLastExtension.SkipLast(function.Parameters, 1).ToList(); var newName = function.Name.Singularize(false); var functionBuilder = new FunctionSignatureBuilder(function) .WithName(newName) .WithReturnType(newReturnType); var sb = new StringBuilder(); var strParams = newParameters.Select(x => Utilities.CSharpKeywords.Contains(x.Name) ? "@" + x.Name : x.Name) .Concat(new[] { "&ret" }); sb.AppendLine("// ReturnTypeOverloader"); sb.AppendLine(newReturnType + " ret = default;"); sb.Append(function.Name + "("); sb.Append(string.Join(", ", strParams)); sb.AppendLine(");"); sb.AppendLine("return ret;"); if (!newParameters.Any()) { yield return(new Overload(functionBuilder .WithParameters(newParameters) .Build(), sb, true)); yield break; } var sizeParameterType = newParameters.Last().Type; if ((sizeParameterType.Name != "int" && sizeParameterType.Name != "uint") || sizeParameterType.IsPointer) { yield return(new Overload(functionBuilder .WithParameters(newParameters) .Build(), sb, true)); yield break; } var n = newParameters.Last().Name; sb.Insert(0, "const " + (sizeParameterType.Name == "uint" ? "uint " : "int ") + (Utilities.CSharpKeywords.Contains(n) ? "@" : "") + n + " = 1;\n"); newParameters = SkipLastExtension.SkipLast(newParameters, 1).ToList(); yield return(new Overload ( functionBuilder .WithParameters(newParameters) .Build(), sb, true )); }