NodePipeline/NodePipeline.Engine.DependencyInjection.CodeGeneration/NodePipelineCoreClassesGenerator.cs
2026-01-02 20:55:25 +03:00

34 lines
1.3 KiB
C#

using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using NodePipeline.Engine.CodeGeneration.Abstractions;
namespace NodePipeline.Engine.DependencyInjection.CodeGeneration;
[Generator]
public class DiNodeProviderGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var nodeSymbols = NodeGeneratorHelper.GetNodeSymbols(context);
context.RegisterSourceOutput(nodeSymbols, (spc, symbols) =>
{
var nodes = symbols.Where(s => s is not null)
.ToImmutableArray();
var (model, diagnostics) = NodeModelBuilder.Build(nodes);
diagnostics.ForEach(spc.ReportDiagnostic);
if (diagnostics.Any(q => q.Severity > DiagnosticSeverity.Warning)) return;
var diExtensionsSource = DiExtensionsGenerator.Generate(model);
spc.AddSource("PipelineServiceCollectionExtensions.g.cs", diExtensionsSource);
var factorySource = NodeFactoryGenerator.Generate(model);
spc.AddSource("DiNodeFactory.g.cs", factorySource);
var validatorSource = NodeValidatorGenerator.Generate(model);
spc.AddSource("DiNodeValidator.g.cs", validatorSource);
});
}
}