diff --git a/AutoMapProperty/AutoMapProperty.cs b/AutoMapProperty/AutoMapProperty.cs index 0f43f2f..c0e9fec 100644 --- a/AutoMapProperty/AutoMapProperty.cs +++ b/AutoMapProperty/AutoMapProperty.cs @@ -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 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 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 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 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 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(@"