+2
-2
@@ -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 = $$"""
|
||||
+6
-6
@@ -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);
|
||||
+5
-4
@@ -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>"));
|
||||
+2
-2
@@ -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 = $$"""
|
||||
+5
-4
@@ -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);
|
||||
+7
-4
@@ -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);
|
||||
+5
-4
@@ -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);
|
||||
+7
-6
@@ -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));
|
||||
+8
-5
@@ -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]
|
||||
+7
-5
@@ -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) {}
|
||||
}
|
||||
+47
@@ -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");
|
||||
}
|
||||
}
|
||||
+29
@@ -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");
|
||||
}
|
||||
}
|
||||
+35
@@ -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");
|
||||
}
|
||||
}
|
||||
+28
@@ -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");
|
||||
}
|
||||
}
|
||||
+29
@@ -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");
|
||||
}
|
||||
}
|
||||
+29
@@ -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");
|
||||
}
|
||||
}
|
||||
+30
@@ -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");
|
||||
}
|
||||
}
|
||||
+9
-9
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user