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 });
+ }
}
}
}