generate other generated types for proejctions

This commit is contained in:
honzapatCZ 2024-09-27 16:23:49 +02:00
parent 1e0beb41ed
commit 501291c548

View File

@ -142,7 +142,7 @@ namespace AutoMapProperty
foreach (ClassToGenerate classToGenerate in enumsToGenerate)
{
//throw new Exception(classToGenerate.Name);
string result = GenerateExtensionClass(classToGenerate);
string result = GenerateExtensionClass(enumsToGenerate, classToGenerate);
context.AddSource(classToGenerate.Name + ".g.cs", SourceText.From(result, Encoding.UTF8));
}
}
@ -521,7 +521,7 @@ namespace AutoMapProperty
sb.Append(method.ContainingType.ToDisplayString()).Append(".").Append(method.Name);
return sb.ToString();
}
public static string GeneratePropertyFrom(string Key, ITypeSymbol FromType, ITypeSymbol ToType, bool nullable = true)
public static string GeneratePropertyFrom(List<ClassToGenerate> otherClasses, string Key, ITypeSymbol FromType, ITypeSymbol ToType, bool nullable = true, string prefix = "")
{
var sb = new StringBuilder();
sb.Append(Key).Append(@" = ");
@ -533,8 +533,8 @@ namespace AutoMapProperty
if (isArray)
{
sb.Append("(").Append(ToType).Append(@")(source.").Append(Key).Append(" != null ? ");
sb.Append("source.").Append(Key);
sb.Append("(").Append(ToType).Append(@")(source").Append(prefix).Append(".").Append(Key).Append(" != null ? ");
sb.Append("source").Append(prefix).Append(".").Append(Key);
sb.Append(nullable ? "?" : "");
if (!SymbolEqualityComparer.Default.Equals(concreteToType, concreteFromType))
{
@ -558,7 +558,25 @@ namespace AutoMapProperty
}
else
{
sb.Append("(").Append(ToType).Append(@")source.").Append(Key);
if (!otherClasses.Select(x => x.Name).Contains(ToType.Name))
sb.Append("(").Append(ToType).Append(@")source").Append(prefix).Append(".").Append(Key);
else
{
var classToGenerate = otherClasses.First(x => x.Name == ToType.Name);
sb.Append(@"new ").Append(classToGenerate.Name).Append(@"()
{");
foreach (var prop in classToGenerate.MappableProperties)
{
var property = GenerateCorrectFromProperty(otherClasses, prop.Key, prop.Value, false, prefix + "." + Key);
if (property == null)
continue;
sb.Append(@"
").Append(property).Append(@",");
}
sb.Append(@"
}");
}
}
return sb.ToString();
@ -569,11 +587,11 @@ namespace AutoMapProperty
return symbol.ToDisplayString(format: displayFormat);
}
public static string? GenerateCorrectFromProperty(string Key, ClassToGenerate.MappableTypes Value, bool nullable = true)
public static string? GenerateCorrectFromProperty(List<ClassToGenerate> otherClasses, string Key, ClassToGenerate.MappableTypes Value, bool nullable = true, string prefix = "")
{
if (!Value.CustomFrom)
{
return GeneratePropertyFrom(Key, Value.FromType, Value.ToType, nullable);
return GeneratePropertyFrom(otherClasses, Key, Value.FromType, Value.ToType, nullable, prefix);
}
else
{
@ -581,18 +599,56 @@ namespace AutoMapProperty
return null;
StringBuilder sb = new StringBuilder();
sb.Append(Key).Append(" = (").Append(GetFullString(Value.ToType)).Append(@")").Append(GetFullMethodName(Value.CustomFromMethod)).Append(@"(providers, source, source.").Append(Key).Append(")");
sb.Append(Key).Append(" = (").Append(GetFullString(Value.ToType)).Append(@")").Append(GetFullMethodName(Value.CustomFromMethod)).Append(@"(providers, source, source").Append(prefix).Append(".").Append(Key).Append(")");
return sb.ToString();
}
}
public static string GeneratePropertyTo(string Key, ITypeSymbol Type)
public static string GeneratePropertyTo(List<ClassToGenerate> otherClasses, string Key, ITypeSymbol FromType, ITypeSymbol ToType, bool nullable = true)
{
var sb = new StringBuilder();
sb.Append(Key).Append(@" = (").Append(GetFullString(Type)).Append(@")this.").Append(Key);
sb.Append(Key).Append(@" =");
var concreteToType = GetConcreteType(ToType);
var concreteFromType = GetConcreteType(FromType);
bool isArray = !SymbolEqualityComparer.Default.Equals(FromType, concreteFromType);
if (isArray)
{
sb.Append("(").Append(FromType).Append(@")(this.").Append(Key).Append(" != null ? ");
sb.Append("this.").Append(Key);
sb.Append(nullable ? "?" : "");
if (!SymbolEqualityComparer.Default.Equals(concreteToType, concreteFromType))
{
sb.Append(@".Select(x => (").Append(GetFullString(concreteFromType)).Append(@")x)");
sb.Append(nullable ? "?" : "");
}
//Add the appropriate ToHashSet or ToSet or ToCollection or ToList
if (FromType.Name.Contains("Set"))
sb.Append(@".ToHashSet()");
else
sb.Append(@".ToList()");
sb.Append(" : new ");
if (FromType.Name.Contains("Set"))
sb.Append("HashSet<").Append(GetFullString(concreteFromType)).Append(">()");
else
sb.Append("List<").Append(GetFullString(concreteFromType)).Append(">()");
sb.Append(")");
}
else
{
// if (otherClasses.Select(x => x.Name).Contains(ToType.Name))
// sb.Append("this.").Append(Key).Append(".ApplyTo(providers, source.").Append(Key).Append(")");
// else
sb.Append("(").Append(GetFullString(FromType)).Append(@")this.").Append(Key);
}
return sb.ToString();
}
public static string? GenerateCorrectToProperty(string Key, ClassToGenerate.MappableTypes Value)
public static string? GenerateCorrectToProperty(List<ClassToGenerate> otherClasses, string Key, ClassToGenerate.MappableTypes Value, bool nullable = true)
{
var retSb = new StringBuilder();
retSb.Append("source.");
@ -600,7 +656,7 @@ namespace AutoMapProperty
{
if (Value.FromIsReadOnly)
return null;
retSb.Append(GeneratePropertyTo(Key, Value.FromType));
retSb.Append(GeneratePropertyTo(otherClasses, Key, Value.FromType, Value.ToType, nullable));
}
else
{
@ -662,7 +718,7 @@ namespace AutoMapProperty
return sb.ToString();
}
public static string GenerateExtensionClass(ClassToGenerate classToGenerate)
public static string GenerateExtensionClass(List<ClassToGenerate> otherClasses, ClassToGenerate classToGenerate)
{
var sb = new StringBuilder();
@ -720,7 +776,7 @@ namespace ").Append(classToGenerate.Namespace).Append(@"
{");
foreach (var prop in classToGenerate.MappableProperties)
{
var property = GenerateCorrectFromProperty(prop.Key, prop.Value);
var property = GenerateCorrectFromProperty(otherClasses, prop.Key, prop.Value);
if (property == null)
continue;
@ -736,7 +792,7 @@ namespace ").Append(classToGenerate.Namespace).Append(@"
{");
foreach (var prop in classToGenerate.MappableProperties)
{
var property = GenerateCorrectFromProperty(prop.Key, prop.Value, false);
var property = GenerateCorrectFromProperty(otherClasses, prop.Key, prop.Value, false);
if (property == null)
continue;
@ -852,7 +908,7 @@ namespace ").Append(classToGenerate.Namespace).Append(@"
{");
foreach (var prop in classToGenerate.MappableProperties)
{
var property = GenerateCorrectToProperty(prop.Key, prop.Value);
var property = GenerateCorrectToProperty(otherClasses, prop.Key, prop.Value);
if (property == null)
continue;
sb.Append(@"