- fix generic arguments and nullability

pull/62/head
Simon G. 3 days ago
parent 610c47bc15
commit ab810a5430
Signed by: SimonG
GPG Key ID: 0B82B964BA536523
  1. 2
      Debug.LightweightIocContainer.FactoryGenerator/Samples/Factories/ISampleClassFactory.cs
  2. 59
      LightweightIocContainer.FactoryGenerator/FactoryGenerator.cs

@ -12,7 +12,7 @@ public interface ISampleClassFactory
T Create<T, U, V>(U param1, V param2) where T : ISampleClass where U : class, new() where V : struct; T Create<T, U, V>(U param1, V param2) where T : ISampleClass where U : class, new() where V : struct;
Task<T> CreateAsync<T, U>(U parameter) where T : ISampleClass where U : class; Task<T> CreateAsync<T, U>(U parameter) where T : ISampleClass where U : class;
ISampleClass Create<T>(Task<T> task) where T : Task<ISampleClass>; ISampleClass Create<T>(Task<T> task) where T : Task<ISampleClass?>;
Task<T?> Create<T>(ISampleClass? sampleClass) where T : class, ISampleClass; Task<T?> Create<T>(ISampleClass? sampleClass) where T : class, ISampleClass;
ISampleClass? Create(int id); ISampleClass? Create(int id);

@ -180,10 +180,12 @@ public class FactoryGenerator : IIncrementalGenerator
if (!method.ReturnsVoid) if (!method.ReturnsVoid)
{ {
if (method.ReturnType.Name == "Task") if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
{ {
if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol) namespaces.AddRange(namedTypeSymbol.TypeArguments.Select(GetNamespaceOfType));
namespaces.AddRange(namedTypeSymbol.TypeArguments.Select(GetNamespaceOfType));
if (method.ReturnType.Name != "Task")
namespaces.Add(GetNamespaceOfType(method.ReturnType));
} }
else else
namespaces.Add(GetNamespaceOfType(method.ReturnType)); namespaces.Add(GetNamespaceOfType(method.ReturnType));
@ -215,11 +217,8 @@ public class FactoryGenerator : IIncrementalGenerator
{ {
stringBuilder.Append($"{INDENT}public {method.ReturnType.Name}"); stringBuilder.Append($"{INDENT}public {method.ReturnType.Name}");
if (method.ReturnType.Name == "Task") if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedReturnType)
{ stringBuilder.Append(GetGenericArguments(namedReturnType));
if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
stringBuilder.Append($"<{string.Join(", ", namedTypeSymbol.TypeArguments.Select(a => a.Name))}>");
}
stringBuilder.Append($" {method.Name}"); stringBuilder.Append($" {method.Name}");
@ -251,14 +250,12 @@ public class FactoryGenerator : IIncrementalGenerator
stringBuilder.AppendLine(); stringBuilder.AppendLine();
} }
if (method.ReturnType.Name == "Task") if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
{ {
stringBuilder.Append($"{INDENT}{INDENT}return container.ResolveAsync"); if (method.ReturnType.Name == "Task")
stringBuilder.Append($"{INDENT}{INDENT}return container.ResolveAsync{GetGenericArguments(namedTypeSymbol)}(");
if (method.ReturnType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol) else
stringBuilder.Append($"<{string.Join(", ", namedTypeSymbol.TypeArguments.Select(a => a.Name))}>"); stringBuilder.Append($"{INDENT}{INDENT}return container.Resolve<{method.ReturnType.Name}{GetGenericArguments(namedTypeSymbol)}>(");
stringBuilder.Append("(");
} }
else else
stringBuilder.Append($"{INDENT}{INDENT}return container.Resolve<{method.ReturnType.Name}>("); stringBuilder.Append($"{INDENT}{INDENT}return container.Resolve<{method.ReturnType.Name}>(");
@ -305,20 +302,34 @@ public class FactoryGenerator : IIncrementalGenerator
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
stringBuilder.Append(parameter.Type.Name); stringBuilder.Append(parameter.Type.Name);
if (parameter.Type is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
stringBuilder.Append(GetGenericArguments(namedTypeSymbol));
if (parameter.NullableAnnotation == NullableAnnotation.Annotated) if (parameter.NullableAnnotation == NullableAnnotation.Annotated)
stringBuilder.Append("?"); stringBuilder.Append("?");
stringBuilder.Append($" {parameter.Name}"); stringBuilder.Append($" {parameter.Name}");
return stringBuilder.ToString(); return stringBuilder.ToString();
} }
private string GetGenericArguments(INamedTypeSymbol namedTypeSymbol) => $"<{string.Join(", ", namedTypeSymbol.TypeArguments.Select(GetGenericArgument))}>";
private string GetGenericArgument(ITypeSymbol argument)
{
StringBuilder stringBuilder = new();
stringBuilder.Append(argument.Name);
if (argument is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
stringBuilder.Append(GetGenericArguments(namedTypeSymbol));
if (argument.NullableAnnotation == NullableAnnotation.Annotated)
stringBuilder.Append("?");
return stringBuilder.ToString();
}
private List<string> GetParameterConstraints(ITypeParameterSymbol typeParameterSymbol) private List<string> GetParameterConstraints(ITypeParameterSymbol typeParameterSymbol)
{ {
List<string> constraints = []; List<string> constraints = [];
foreach (ITypeSymbol constraintType in typeParameterSymbol.ConstraintTypes)
constraints.Add(constraintType.Name);
if (typeParameterSymbol.HasReferenceTypeConstraint) if (typeParameterSymbol.HasReferenceTypeConstraint)
constraints.Add("class"); constraints.Add("class");
@ -334,6 +345,14 @@ public class FactoryGenerator : IIncrementalGenerator
if (typeParameterSymbol.HasNotNullConstraint) if (typeParameterSymbol.HasNotNullConstraint)
constraints.Add("notnull"); constraints.Add("notnull");
foreach (ITypeSymbol constraintType in typeParameterSymbol.ConstraintTypes)
{
if (constraintType is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol)
constraints.Add($"{constraintType.Name}{GetGenericArguments(namedTypeSymbol)}");
else
constraints.Add(constraintType.Name);
}
return constraints; return constraints;
} }
} }
Loading…
Cancel
Save