From 82b0d03e1987a9d4b65d2679ed8ff74202041c8b Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sun, 23 May 2021 21:47:18 -0700 Subject: [PATCH] fix(codegen): Fixes serializing classes with no fields (#609) Fixes code genning classes with no fields. Fixes code genning primitives. FIxes code genning uo types. --- .../EntitySerializationGenerator.cs | 14 ++++----- .../Rules/PrimitiveTypeMigrationRule.cs | 2 +- .../Rules/PrimitiveUOTypeMigrationRule.cs | 2 +- .../SerializerSyntaxReceiver.cs | 29 +++++++++++++++++-- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/Projects/SerializationGenerator/EntitySerializationGenerator.cs b/Projects/SerializationGenerator/EntitySerializationGenerator.cs index 20b6dbee9..59b10c222 100755 --- a/Projects/SerializationGenerator/EntitySerializationGenerator.cs +++ b/Projects/SerializationGenerator/EntitySerializationGenerator.cs @@ -13,6 +13,7 @@ * along with this program. If not, see . * *************************************************************************/ +using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; @@ -54,17 +55,16 @@ namespace SerializationGenerator var jsonOptions = SerializableMigration.GetJsonSerializerOptions(context.Compilation); // List of types that _will_ become ISerializable var serializableList = receiver - .Fields - .GroupBy(f => f.ContainingType, SymbolEqualityComparer.Default) - .Select(g => g.Key as INamedTypeSymbol) + .ClassAndFields + .Select(g => g.Key) .Where(t => t.WillBeSerializable(context)) .ToImmutableArray(); - foreach (IGrouping group in receiver.Fields.GroupBy(f => f.ContainingType, SymbolEqualityComparer.Default)) + foreach (var kvp in receiver.ClassAndFields) { string classSource = SerializableEntityGeneration.GenerateSerializationPartialClass( - group.Key as INamedTypeSymbol, - group.ToList(), + kvp.Key, + kvp.Value, context, migrationPath, jsonOptions, @@ -73,7 +73,7 @@ namespace SerializationGenerator if (classSource != null) { - context.AddSource($"{group.Key.Name}.Serialization.cs", SourceText.From(classSource, Encoding.UTF8)); + context.AddSource($"{kvp.Key.ToDisplayString()}.Serialization.cs", SourceText.From(classSource, Encoding.UTF8)); } } } diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs index 7b0d1054e..37c5042be 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs @@ -126,7 +126,7 @@ namespace SerializationGenerator }; } - source.AppendLine($"{indent}{propertyName} = reader.{readMethod}()"); + source.AppendLine($"{indent}{propertyName} = reader.{readMethod}();"); } public void GenerateSerializationMethod(StringBuilder source, string indent, SerializableProperty property) diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs index 35c7a67fb..882961962 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs @@ -56,7 +56,7 @@ namespace SerializationGenerator } var propertyName = property.Name; - source.AppendLine($"{indent}{propertyName} = reader.Read{property.RuleArguments[0]}()"); + source.AppendLine($"{indent}{propertyName} = reader.Read{property.RuleArguments[0]}();"); } public void GenerateSerializationMethod(StringBuilder source, string indent, SerializableProperty property) diff --git a/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs b/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs index 7bc0f9bba..637e9e746 100755 --- a/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs +++ b/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs @@ -22,12 +22,29 @@ namespace SerializationGenerator { public class SerializerSyntaxReceiver : ISyntaxContextReceiver { - public List Fields { get; } = new(); +#pragma warning disable RS1024 + public Dictionary> ClassAndFields { get; } = new(SymbolEqualityComparer.Default); +#pragma warning restore RS1024 public static HashSet AttributeTypes { get; } = new(); public void OnVisitSyntaxNode(GeneratorSyntaxContext context) { + if (context.Node is ClassDeclarationSyntax { AttributeLists: { Count: > 0 } } classDeclarationSyntax) + { + if (context.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax) is not INamedTypeSymbol classSymbol) + { + return; + } + + if (!ClassAndFields.ContainsKey(classSymbol)) + { + ClassAndFields.Add(classSymbol, new List()); + } + + return; + } + if (context.Node is FieldDeclarationSyntax { AttributeLists: { Count: > 0 } } fieldDeclarationSyntax) { foreach (VariableDeclaratorSyntax variable in fieldDeclarationSyntax.Declaration.Variables) @@ -39,7 +56,15 @@ namespace SerializationGenerator if (fieldSymbol.GetAttributes().Any(ad => AttributeTypes.Contains(ad.AttributeClass?.ToDisplayString()))) { - Fields.Add(fieldSymbol); + var classSymbol = fieldSymbol.ContainingType; + if (ClassAndFields.TryGetValue(classSymbol, out var fieldsList)) + { + fieldsList.Add(fieldSymbol); + } + else + { + ClassAndFields.Add(classSymbol, new List { fieldSymbol }); + } } } }