extensions rework pt1
.NET Test / .NET tests (push) Successful in 2m0s

This commit is contained in:
2026-07-13 22:20:47 +04:00
parent 46487a4794
commit 0e7986996f
30 changed files with 1476 additions and 160 deletions
@@ -2,11 +2,11 @@ using System.Collections.Generic;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors;
public sealed class EnsureExtensionsExecutor : IGeneratorExecutor
{
public void Execute(SourceProductionContext context, Compilation source)
public void Execute(IncrementalGeneratorPostInitializationContext context)
{
var methods = GenerateMethods();
var code = $$"""
@@ -3,11 +3,13 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultAppendExecutor : ResultExtensionsExecutor
internal class ResultAppendExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Append";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateHelperMethods(StringBuilder sb)
{
@@ -89,19 +91,17 @@ internal sealed class ResultAppendExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
if (argCount < Constants.MaxResultTupleSize)
{
GenerateExpandedMethods(sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateExpandedAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateExpandedAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
}
sb.AppendLine("#endregion");
}
private void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
string methodTemplateDecl = GenerateTemplateDecl(templateArgNames);
@@ -192,7 +192,7 @@ internal sealed class ResultAppendExecutor : ResultExtensionsExecutor
""");
}
private void GenerateExpandedAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateExpandedAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
var expandedTemplateArgNames = templateArgNames.Add("TNext");
string resultExpandedTypeDef = GenerateResultTypeDef(expandedTemplateArgNames);
@@ -3,11 +3,13 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultBindExecutor : ResultExtensionsExecutor
internal class ResultBindExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Bind";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
@@ -37,12 +39,11 @@ internal sealed class ResultBindExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
string methodTemplateDecl = GenerateTemplateDecl(templateArgNames.Add("R"));
string bindTemplateDecl = GenerateTemplateDecl(templateArgNames.Add("Result<R>"));
@@ -5,11 +5,11 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultCombineExecutor : IGeneratorExecutor
{
public void Execute(SourceProductionContext context, Compilation source)
public void Execute(IncrementalGeneratorPostInitializationContext context)
{
var methods = GenerateCombineMethods();
var code = $$"""
@@ -3,11 +3,13 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultExtendExecutor : ResultExtensionsExecutor
internal class ResultExtendExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Extend";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
@@ -58,12 +60,11 @@ internal sealed class ResultExtendExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
var expandedTemplateArgNames = templateArgNames.Add("R");
string resultExpandedTypeDef = GenerateResultTypeDef(expandedTemplateArgNames);
@@ -1,13 +1,17 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors;
internal sealed class ResultMapExecutor : ResultExtensionsExecutor
internal class ResultMapExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Map";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
@@ -35,12 +39,11 @@ internal sealed class ResultMapExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
var methodTemplateArgNames = templateArgNames.Add("R");
string methodTemplateDecl = GenerateTemplateDecl(methodTemplateArgNames);
@@ -3,11 +3,13 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultMatchExecutor : ResultExtensionsExecutor
internal class ResultMatchExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Match";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
@@ -36,12 +38,11 @@ internal sealed class ResultMatchExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
var methodTemplateArgNames = templateArgNames.Add("R");
string methodTemplateDecl = GenerateTemplateDecl(methodTemplateArgNames);
@@ -3,11 +3,13 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultTapExecutor : ResultExtensionsExecutor
internal class ResultTapExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "Tap";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
@@ -24,7 +26,7 @@ internal sealed class ResultTapExecutor : ResultExtensionsExecutor
sb.AppendLine($$"""
[PureAttribute]
[GeneratedCodeAttribute("{{nameof(ResultTapExecutor)}}", "1.0.0.0")]
public static ref readonly {{resultTypeDef}} Tap{{methodTemplateDecl}}(this in {{resultTypeDef}} result, Action{{methodTemplateDecl}}? onSuccess = null, Action<Error>? onFailure = null)
public static {{resultTypeDef}} Tap{{methodTemplateDecl}}(this in {{resultTypeDef}} result, Action{{methodTemplateDecl}}? onSuccess = null, Action<Error>? onFailure = null)
{
switch (result.State)
{
@@ -37,17 +39,16 @@ internal sealed class ResultTapExecutor : ResultExtensionsExecutor
default: throw new ResultNotInitializedException(nameof(result));
}
return ref result;
return result;
}
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, resultValueExpansion);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string resultValueExpansion)
{
string methodTemplateDecl = GenerateTemplateDecl(templateArgNames);
string asyncActionTemplateDecl = GenerateTemplateDecl(templateArgNames.Add(taskType));
@@ -2,15 +2,18 @@ using System.Collections.Immutable;
using System.Linq;
using System.Text;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
internal sealed class ResultTryRecoverExecutor : ResultExtensionsExecutor
internal class ResultTryRecoverExecutor : ResultExtensionsExecutor
{
protected override string ExtensionType => "TryRecover";
protected override string NamespaceName => "Just.Railway";
protected override string PartialClassName => "ResultExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
if (argCount > 1) return;
var templateArgNames = Enumerable.Repeat("T", argCount)
.ToImmutableArray();
@@ -34,11 +37,11 @@ internal sealed class ResultTryRecoverExecutor : ResultExtensionsExecutor
""");
GenerateAsyncMethods("Task", string.Empty, sb, templateArgNames, resultTypeDef, methodTemplateDecl);
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, methodTemplateDecl);
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string methodTemplateDecl)
protected static void GenerateAsyncMethods(string taskType, string methodSuffix, StringBuilder sb, ImmutableArray<string> templateArgNames, string resultTypeDef, string methodTemplateDecl)
{
sb.AppendLine($$"""
[PureAttribute]
@@ -2,11 +2,11 @@ using System.Collections.Immutable;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors.ResultExtensions;
internal abstract class ResultExtensionsExecutor : IGeneratorExecutor
{
public void Execute(SourceProductionContext context, Compilation source)
public void Execute(IncrementalGeneratorPostInitializationContext context)
{
var methods = GenerateMethods();
var code = $$"""
@@ -16,15 +16,15 @@ internal abstract class ResultExtensionsExecutor : IGeneratorExecutor
using System.Diagnostics.Contracts;
using System.CodeDom.Compiler;
namespace Just.Railway;
namespace {{NamespaceName}};
public static partial class ResultExtensions
public static partial class {{PartialClassName}}
{
{{methods}}
}
""";
context.AddSource($"ResultExtensions.{ExtensionType}.g.cs", code);
context.AddSource($"{PartialClassName}.{ExtensionType}.g.cs", code);
}
private string GenerateMethods()
@@ -87,6 +87,8 @@ internal abstract class ResultExtensionsExecutor : IGeneratorExecutor
}
protected abstract string ExtensionType { get; }
protected abstract string NamespaceName { get; }
protected abstract string PartialClassName { get; }
protected abstract void GenerateMethodsForArgCount(StringBuilder sb, int argCount);
protected virtual void GenerateHelperMethods(StringBuilder sb) {}
}
@@ -0,0 +1,47 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal class ResultValueTaskAppendExecutor : ResultAppendExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateHelperMethods(StringBuilder sb)
{
sb.AppendLine("""
private static IEnumerable<string> GetBottom(ResultState r1, ResultState r2, string firstArg = "result", string secondArg = "next")
{
if (r1 == ResultState.Bottom)
yield return firstArg;
if (r2 == ResultState.Bottom)
yield return secondArg;
}
""");
}
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
if (argCount < Constants.MaxResultTupleSize)
{
GenerateExpandedAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
}
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,29 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal class ResultValueTaskBindExecutor : ResultBindExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,35 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal sealed class ResultValueTaskExtendExecutor : ResultExtendExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
if (argCount == 0 || argCount == Constants.MaxResultTupleSize)
{
return;
}
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
var expandedTemplateArgNames = templateArgNames.Add("R");
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,28 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal sealed class ResultValueTaskMapExecutor : ResultMapExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,29 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal class ResultValueTaskMatchExecutor : ResultMatchExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,29 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal class ResultValueTaskTapExecutor : ResultTapExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
var templateArgNames = Enumerable.Range(1, argCount)
.Select(i => $"T{i}")
.ToImmutableArray();
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
string resultValueExpansion = GenerateResultValueExpansion(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion);
sb.AppendLine("#endregion");
}
}
@@ -0,0 +1,30 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
internal class ResultValueTaskTryRecoverExecutor : ResultTryRecoverExecutor
{
protected override string NamespaceName => "Just.Railway.ValueTaskExtensions";
protected override string PartialClassName => "ResultValueTaskExtensions";
protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount)
{
if (argCount > 1) return;
var templateArgNames = Enumerable.Repeat("T", argCount)
.ToImmutableArray();
string methodTemplateDecl = GenerateTemplateDecl(templateArgNames);
string resultTypeDef = GenerateResultTypeDef(templateArgNames);
sb.AppendLine($"#region {resultTypeDef}");
GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, methodTemplateDecl);
sb.AppendLine("#endregion");
}
}
@@ -3,11 +3,11 @@ using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
namespace Just.Railway.SourceGen.Executors;
public sealed class TryExtensionsExecutor : IGeneratorExecutor
{
public void Execute(SourceProductionContext context, Compilation source)
public void Execute(IncrementalGeneratorPostInitializationContext context)
{
var methods = GenerateMethods();
var code = $$"""
@@ -123,13 +123,13 @@ public sealed class TryExtensionsExecutor : IGeneratorExecutor
}
""");
GenerateAsyncMethods(sb, templateArgNames, actionTemplateDecl, funcTemplateDecl, argumentsDeclExpansion, argumentsExpansion, "Task");
GenerateAsyncMethods(sb, templateArgNames, actionTemplateDecl, funcTemplateDecl, argumentsDeclExpansion, argumentsExpansion, "ValueTask");
GenerateAsyncMethods(sb, templateArgNames, actionTemplateDecl, funcTemplateDecl, argumentsDeclExpansion, argumentsExpansion, "Task", string.Empty);
GenerateAsyncMethods(sb, templateArgNames, actionTemplateDecl, funcTemplateDecl, argumentsDeclExpansion, argumentsExpansion, "ValueTask", "ValueTask");
sb.AppendLine("#endregion");
}
private static void GenerateAsyncMethods(StringBuilder sb, ImmutableArray<string> templateArgNames, string actionTemplateDecl, string funcTemplateDecl, string argumentsDeclExpansion, string argumentsExpansion, string taskType)
private static void GenerateAsyncMethods(StringBuilder sb, ImmutableArray<string> templateArgNames, string actionTemplateDecl, string funcTemplateDecl, string argumentsDeclExpansion, string argumentsExpansion, string taskType, string methodSuffix)
{
string actionTaskTemplateDecl = GenerateTemplateDecl(templateArgNames.Add(taskType));
string resultActionTaskTemplateDecl = GenerateTemplateDecl(templateArgNames.Add($"{taskType}<Result>"));
@@ -138,7 +138,7 @@ public sealed class TryExtensionsExecutor : IGeneratorExecutor
sb.AppendLine($$"""
[PureAttribute]
[GeneratedCodeAttribute("{{nameof(TryExtensionsExecutor)}}", "1.0.0.0")]
public static async {{taskType}}<Result> Run{{actionTemplateDecl}}(Func{{actionTaskTemplateDecl}} action{{TrailingArguments(argumentsDeclExpansion)}})
public static async {{taskType}}<Result> Run{{methodSuffix}}{{actionTemplateDecl}}(Func{{actionTaskTemplateDecl}} action{{TrailingArguments(argumentsDeclExpansion)}})
{
try
{
@@ -155,7 +155,7 @@ public sealed class TryExtensionsExecutor : IGeneratorExecutor
sb.AppendLine($$"""
[PureAttribute]
[GeneratedCodeAttribute("{{nameof(TryExtensionsExecutor)}}", "1.0.0.0")]
public static async {{taskType}}<Result> Run{{actionTemplateDecl}}(Func{{resultActionTaskTemplateDecl}} action{{TrailingArguments(argumentsDeclExpansion)}})
public static async {{taskType}}<Result> Run{{methodSuffix}}{{actionTemplateDecl}}(Func{{resultActionTaskTemplateDecl}} action{{TrailingArguments(argumentsDeclExpansion)}})
{
try
{
@@ -171,7 +171,7 @@ public sealed class TryExtensionsExecutor : IGeneratorExecutor
sb.AppendLine($$"""
[PureAttribute]
[GeneratedCodeAttribute("{{nameof(TryExtensionsExecutor)}}", "1.0.0.0")]
public static async {{taskType}}<Result<TResult>> Run{{funcTemplateDecl}}(Func{{funcTaskTemplateDecl}} func{{TrailingArguments(argumentsDeclExpansion)}})
public static async {{taskType}}<Result<TResult>> Run{{methodSuffix}}{{funcTemplateDecl}}(Func{{funcTaskTemplateDecl}} func{{TrailingArguments(argumentsDeclExpansion)}})
{
try
{
@@ -187,7 +187,7 @@ public sealed class TryExtensionsExecutor : IGeneratorExecutor
sb.AppendLine($$"""
[PureAttribute]
[GeneratedCodeAttribute("{{nameof(TryExtensionsExecutor)}}", "1.0.0.0")]
public static async {{taskType}}<Result<TResult>> Run{{funcTemplateDecl}}(Func{{resultFuncTaskTemplateDecl}} func{{TrailingArguments(argumentsDeclExpansion)}})
public static async {{taskType}}<Result<TResult>> Run{{methodSuffix}}{{funcTemplateDecl}}(Func{{resultFuncTaskTemplateDecl}} func{{TrailingArguments(argumentsDeclExpansion)}})
{
try
{
@@ -1,4 +1,7 @@
using System.Collections.Generic;
using Just.Railway.SourceGen.Executors;
using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions;
using Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions;
using Microsoft.CodeAnalysis;
namespace Just.Railway.SourceGen;
@@ -6,9 +9,10 @@ namespace Just.Railway.SourceGen;
[Generator]
public class ExtensionsMethodGenerator : IIncrementalGenerator
{
private readonly IEnumerable<IGeneratorExecutor> _executors = new IGeneratorExecutor[]
{
private readonly IEnumerable<IGeneratorExecutor> _executors =
[
new ResultCombineExecutor(),
new ResultMatchExecutor(),
new ResultMapExecutor(),
new ResultBindExecutor(),
@@ -16,15 +20,24 @@ public class ExtensionsMethodGenerator : IIncrementalGenerator
new ResultExtendExecutor(),
new ResultTryRecoverExecutor(),
new ResultAppendExecutor(),
new ResultValueTaskMatchExecutor(),
new ResultValueTaskMapExecutor(),
new ResultValueTaskBindExecutor(),
new ResultValueTaskTapExecutor(),
new ResultValueTaskExtendExecutor(),
new ResultValueTaskTryRecoverExecutor(),
new ResultValueTaskAppendExecutor(),
new TryExtensionsExecutor(),
new EnsureExtensionsExecutor(),
};
];
public void Initialize(IncrementalGeneratorInitializationContext context)
{
foreach (var executor in _executors)
{
context.RegisterSourceOutput(context.CompilationProvider, executor.Execute);
context.RegisterPostInitializationOutput(executor.Execute);
}
}
}
@@ -4,5 +4,5 @@ namespace Just.Railway.SourceGen;
internal interface IGeneratorExecutor
{
public abstract void Execute(SourceProductionContext context, Compilation source);
public abstract void Execute(IncrementalGeneratorPostInitializationContext context);
}