From b5f16126fea92ab65ddeb56c3eb3c0d0949bf2c9 Mon Sep 17 00:00:00 2001 From: "Simon G." Date: Wed, 3 Dec 2025 13:41:56 +0100 Subject: [PATCH] - don't generate a file twice for the same factory --- .../FactoryGenerator.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs b/LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs index 71fd88c..a0101bc 100644 --- a/LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs +++ b/LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs @@ -29,7 +29,7 @@ public class FactoryGenerator : IIncrementalGenerator IncrementalValuesProvider syntaxProvider = context.SyntaxProvider.CreateSyntaxProvider(IsCallToGenerateFactory, GetTypeArgument); context.RegisterSourceOutput(syntaxProvider.Collect(), GenerateTypeDependentClasses); - context.RegisterSourceOutput(syntaxProvider, GenerateFactory); + context.RegisterSourceOutput(syntaxProvider.Collect(), GenerateFactory); } private string GenerateFactoryExtensionsClass(string? classNamespace, string className) @@ -99,12 +99,15 @@ public class FactoryGenerator : IIncrementalGenerator context.AddSource($"{BUILDER_CLASS_NAME}.g.cs", GenerateBuilderClassSourceCode(classNamespace, types)); } - private void GenerateFactory(SourceProductionContext context, ITypeSymbol? typeSymbol) + private void GenerateFactory(SourceProductionContext context, ImmutableArray types) { - if (typeSymbol is null) - return; + foreach (ISymbol? symbol in types.Distinct(SymbolEqualityComparer.IncludeNullability)) + { + if (symbol is not ITypeSymbol typeSymbol) + continue; - context.AddSource($"Generated{typeSymbol.Name}.g.cs", GenerateFactorySourceCode(typeSymbol)); + context.AddSource($"Generated{typeSymbol.Name}.g.cs", GenerateFactorySourceCode(typeSymbol)); + } } private string GenerateBuilderClassSourceCode(string? classNamespace, ImmutableArray types) @@ -132,9 +135,9 @@ public class FactoryGenerator : IIncrementalGenerator stringBuilder.AppendLine($"{INDENT}public TFactory Create(IocContainer container)"); stringBuilder.AppendLine($"{INDENT}{{"); - foreach (ITypeSymbol? type in types) + foreach (ISymbol? symbol in types.Distinct(SymbolEqualityComparer.IncludeNullability)) { - if (type is null) + if (symbol is not ITypeSymbol type) continue; stringBuilder.AppendLine($"{INDENT}{INDENT}if (typeof(TFactory) == typeof({type.Name}))");