- only distinct types by name when creating factories to ensure correct builder generation

master
Simon G. 2 months ago
parent ff1eb813f0
commit 864c91eb0f
Signed by: SimonG
GPG Key ID: 0B82B964BA536523
  1. 8
      LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs

@ -101,7 +101,7 @@ public class FactoryGenerator : IIncrementalGenerator
private void GenerateFactory(SourceProductionContext context, ImmutableArray<ITypeSymbol?> types) private void GenerateFactory(SourceProductionContext context, ImmutableArray<ITypeSymbol?> types)
{ {
foreach (ITypeSymbol typeSymbol in GetDistinctTypes(types)) foreach (ITypeSymbol typeSymbol in GetDistinctTypes(types, true))
context.AddSource($"Generated{typeSymbol.Name}.g.cs", GenerateFactorySourceCode(typeSymbol)); context.AddSource($"Generated{typeSymbol.Name}.g.cs", GenerateFactorySourceCode(typeSymbol));
} }
@ -130,7 +130,7 @@ public class FactoryGenerator : IIncrementalGenerator
stringBuilder.AppendLine($"{INDENT}public TFactory Create<TFactory>(IocContainer container)"); stringBuilder.AppendLine($"{INDENT}public TFactory Create<TFactory>(IocContainer container)");
stringBuilder.AppendLine($"{INDENT}{{"); stringBuilder.AppendLine($"{INDENT}{{");
foreach (ITypeSymbol type in GetDistinctTypes(types)) foreach (ITypeSymbol type in GetDistinctTypes(types, false))
{ {
stringBuilder.AppendLine($"{INDENT}{INDENT}if (typeof(TFactory) == typeof({GetTypeText(type, false)}))"); stringBuilder.AppendLine($"{INDENT}{INDENT}if (typeof(TFactory) == typeof({GetTypeText(type, false)}))");
stringBuilder.AppendLine($"{INDENT}{INDENT}{{"); stringBuilder.AppendLine($"{INDENT}{INDENT}{{");
@ -255,7 +255,7 @@ public class FactoryGenerator : IIncrementalGenerator
return stringBuilder.ToString(); return stringBuilder.ToString();
} }
private IEnumerable<ITypeSymbol> GetDistinctTypes(ImmutableArray<ITypeSymbol?> types) private IEnumerable<ITypeSymbol> GetDistinctTypes(ImmutableArray<ITypeSymbol?> types, bool distinctByName)
{ {
List<ITypeSymbol> distinctTypes = []; List<ITypeSymbol> distinctTypes = [];
foreach (ITypeSymbol? typeSymbol in types) foreach (ITypeSymbol? typeSymbol in types)
@ -266,7 +266,7 @@ public class FactoryGenerator : IIncrementalGenerator
if (distinctTypes.Contains(typeSymbol, SymbolEqualityComparer.IncludeNullability)) if (distinctTypes.Contains(typeSymbol, SymbolEqualityComparer.IncludeNullability))
continue; continue;
if (distinctTypes.Any(t => t.Name == typeSymbol.Name)) if (distinctByName && distinctTypes.Any(t => t.Name == typeSymbol.Name))
continue; continue;
distinctTypes.Add(typeSymbol); distinctTypes.Add(typeSymbol);

Loading…
Cancel
Save