From 38121333cae00bf16f9be6bd98a6ef5878437278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sun, 2 Jan 2022 19:07:39 +0100 Subject: [PATCH] feat: split inline generated deserialization into different methods --- ...acketConditionalIndexAttributeGenerator.cs | 4 +- .../PacketContextListAttributeGenerator.cs | 4 +- .../PacketGreedyIndexAttributeGenerator.cs | 2 +- .../PacketIndexAttributeGenerator.cs | 8 +- .../PacketListIndexAttributeGenerator.cs | 4 +- .../Constants.cs | 5 ++ .../ConverterDeserializationGenerator.cs | 25 ++++++ .../BasicInlineConverterGenerator.cs | 55 +++++++------ .../BoolInlineConverterGenerator.cs | 30 +++++++- .../EnumInlineConverterGenerator.cs | 77 +++++++++++++------ .../FallbackInlineConverterGenerator.cs | 30 +++----- .../IInlineConverterGenerator.cs | 14 +++- .../StringInlineConverterGenerator.cs | 31 ++++++-- .../InlineTypeConverterGenerator.cs | 8 +- ...osSmooth.PacketSerializersGenerator.csproj | 4 + .../PacketConverterGenerator.cs | 10 --- .../SourceGenerator.cs | 48 +++++++++++- 17 files changed, 257 insertions(+), 102 deletions(-) diff --git a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketConditionalIndexAttributeGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketConditionalIndexAttributeGenerator.cs index 2098548..f77e3e4 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketConditionalIndexAttributeGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketConditionalIndexAttributeGenerator.cs @@ -218,7 +218,7 @@ public class PacketConditionalIndexAttributeGenerator : IParameterGenerator } // serialize, check the error. - _inlineTypeConverterGenerators.SerializeAndCheck(textWriter, packetInfo); + _inlineTypeConverterGenerators.Serialize(textWriter, packetInfo); // pop inner separator level if (pushedLevel) @@ -274,7 +274,7 @@ public class PacketConditionalIndexAttributeGenerator : IParameterGenerator pushedLevel = true; } - _inlineTypeConverterGenerators.DeserializeAndCheck(textWriter, packetInfo); + generator.DeserializeAndCheck(parameter, packetInfo, _inlineTypeConverterGenerators); if (!parameter.Nullable) { diff --git a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketContextListAttributeGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketContextListAttributeGenerator.cs index 4eda16d..2a3fed4 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketContextListAttributeGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketContextListAttributeGenerator.cs @@ -75,7 +75,7 @@ public class PacketContextListAttributeGenerator : IParameterGenerator var innerSeparator = attribute.GetNamedValue("InnerSeparator", '.'); generator.PrepareLevel(innerSeparator); - _inlineTypeConverterGenerators.SerializeAndCheck(textWriter, packetInfo); + _inlineTypeConverterGenerators.Serialize(textWriter, packetInfo); generator.RemovePreparedLevel(); generator.PopLevel(); @@ -115,7 +115,7 @@ public class PacketContextListAttributeGenerator : IParameterGenerator var innerSeparator = attribute.GetNamedValue("InnerSeparator", '.'); generator.PrepareLevel(innerSeparator); - _inlineTypeConverterGenerators.DeserializeAndCheck(textWriter, packetInfo); + generator.DeserializeAndCheck(parameter, packetInfo, _inlineTypeConverterGenerators); generator.RemovePreparedLevel(); generator.PopLevel(); if (!parameter.Nullable) diff --git a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketGreedyIndexAttributeGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketGreedyIndexAttributeGenerator.cs index 3ff00b3..cf2d2ac 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketGreedyIndexAttributeGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketGreedyIndexAttributeGenerator.cs @@ -82,7 +82,7 @@ public class PacketGreedyIndexAttributeGenerator : IParameterGenerator } generator.SetReadToLast(); // Greedy - _inlineTypeConverterGenerators.DeserializeAndCheck(textWriter, packetInfo); + generator.DeserializeAndCheck(parameter, packetInfo, _inlineTypeConverterGenerators); if (!parameter.Nullable) { diff --git a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketIndexAttributeGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketIndexAttributeGenerator.cs index 71d434d..ebf6ab1 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketIndexAttributeGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketIndexAttributeGenerator.cs @@ -77,7 +77,7 @@ public class PacketIndexAttributeGenerator : IParameterGenerator } // serialize, check the error. - _inlineTypeConverterGenerators.SerializeAndCheck(textWriter, packetInfo); + _inlineTypeConverterGenerators.Serialize(textWriter, packetInfo); // pop inner separator level if (pushedLevel) @@ -124,11 +124,11 @@ public class PacketIndexAttributeGenerator : IParameterGenerator pushedLevel = true; } - _inlineTypeConverterGenerators.DeserializeAndCheck(textWriter, packetInfo); - + generator.DeserializeAndCheck(parameter, packetInfo, _inlineTypeConverterGenerators); if (!parameter.Nullable) { - generator.CheckNullError(parameter.GetNullableVariableName(), parameter.GetResultVariableName(), parameter.Name); + generator.CheckNullError + (parameter.GetNullableVariableName(), parameter.GetResultVariableName(), parameter.Name); } generator.AssignLocalVariable(parameter, false); diff --git a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketListIndexAttributeGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketListIndexAttributeGenerator.cs index 21c7e78..f5c3ff5 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketListIndexAttributeGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/AttributeGenerators/PacketListIndexAttributeGenerator.cs @@ -77,7 +77,7 @@ public class PacketListIndexAttributeGenerator : IParameterGenerator var innerSeparator = attribute.GetNamedValue("InnerSeparator", '.'); generator.PrepareLevel(innerSeparator); - _inlineTypeConverterGenerators.SerializeAndCheck(textWriter, packetInfo); + _inlineTypeConverterGenerators.Serialize(textWriter, packetInfo); generator.RemovePreparedLevel(); generator.PopLevel(); @@ -119,7 +119,7 @@ public class PacketListIndexAttributeGenerator : IParameterGenerator var innerSeparator = attribute.GetNamedValue("InnerSeparator", '.'); generator.PrepareLevel(innerSeparator); - _inlineTypeConverterGenerators.DeserializeAndCheck(textWriter, packetInfo); + generator.DeserializeAndCheck(parameter, packetInfo, _inlineTypeConverterGenerators); generator.RemovePreparedLevel(); generator.PopLevel(); if (!parameter.Nullable) diff --git a/Core/NosSmooth.PacketSerializersGenerator/Constants.cs b/Core/NosSmooth.PacketSerializersGenerator/Constants.cs index cb4960f..87bb338 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/Constants.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/Constants.cs @@ -20,4 +20,9 @@ public class Constants /// Gets the full name of the packet attribute classes that are used for the generation. /// public static string PacketAttributesClassRegex => @"^NosSmooth\.Packets\.Attributes\.Packet.*"; + + /// + /// Gets the full name of helper class used for inline type converters. + /// + public static string HelperClass => "NosSmooth.Generated.HelperClass"; } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs index d44f713..67baa90 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs @@ -178,4 +178,29 @@ if ({nullableVariableName} is null) {{ _textWriter.Indent--; _textWriter.WriteLine("}"); } + + /// + /// Call deserializer and check the result. + /// + /// The parameter. + /// The packet. + /// The inline converter generator. + public void DeserializeAndCheck(ParameterInfo parameter, PacketInfo packet, InlineTypeConverterGenerator inlineTypeConverter) + { + _textWriter.WriteLine($"var {parameter.GetResultVariableName()} = "); + inlineTypeConverter.CallDeserialize(_textWriter, packet); + + _textWriter.WriteLine($"if (!{parameter.GetResultVariableName()}.IsSuccess)"); + _textWriter.Indent++; + _textWriter.WriteLine + ( + $"return Result<{packet.Name}?>.FromError(new PacketParameterSerializerError(this, \"{parameter.Name}\", {parameter.GetResultVariableName()}), {parameter.GetResultVariableName()});" + ); + _textWriter.Indent--; + + _textWriter.WriteLine + ( + $"{parameter.GetNullableType()} {parameter.GetNullableVariableName()} = {parameter.GetResultVariableName()}.Entity;" + ); + } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs index 50afa90..70660a6 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs @@ -36,31 +36,42 @@ public class BasicInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { var parameter = packet.Parameters.Current; - var type = parameter.Parameter.Type!.ToString(); - string isLastString = packet.Parameters.IsLast ? "true" : "false"; - textWriter.WriteMultiline - ( - $@" -var {parameter.GetResultVariableName()} = stringEnumerator.GetNextToken(); -var {parameter.GetErrorVariableName()} = CheckDeserializationResult({parameter.GetResultVariableName()}, ""{parameter.Name}"", stringEnumerator, {isLastString}); -if ({parameter.GetErrorVariableName()} is not null) + var type = parameter.Parameter.Type!.ToString().Trim('?'); + textWriter.WriteLine($"{Constants.HelperClass}.ParseBasic{type}(this, stringEnumerator);"); + return null; + } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + foreach (var type in HandleTypes) + { + textWriter.WriteMultiline($@" +public static Result<{type}?> ParseBasic{type}(ITypeConverter typeConverter, PacketStringEnumerator stringEnumerator) {{ - return Result<{packet.Name}?>.FromError({parameter.GetErrorVariableName()}, {parameter.GetResultVariableName()}); -}} -{parameter.GetVariableName()} = default; -{parameter.GetNullableType()} {parameter.GetNullableVariableName()}; -if ({parameter.GetResultVariableName()}.Entity.Token == ""-"") {{ - {parameter.GetNullableVariableName()} = null; -}} -else if (!{type}.TryParse({parameter.GetResultVariableName()}.Entity.Token, out {parameter.GetVariableName()})) {{ - return new PacketParameterSerializerError(this, ""{parameter.Name}"", {parameter.GetResultVariableName()}, $""Could not convert {{{parameter.GetResultVariableName()}.Entity.Token}} as {type} in inline converter""); + var tokenResult = stringEnumerator.GetNextToken(); + if (!tokenResult.IsSuccess) + {{ + return Result<{type}?>.FromError(tokenResult); + }} + + var token = tokenResult.Entity.Token; + if (token == ""-"") + {{ + return Result<{type}?>.FromSuccess(null); + }} + + if (!{type}.TryParse(token, out var val)) + {{ + return new CouldNotConvertError(typeConverter, token, ""Could not convert as {type} in inline converter""); + }} + + return val; }} -{parameter.GetNullableVariableName()} = {parameter.GetVariableName()}; -" - ); - return null; +"); + } } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs index 2dfbe17..de418e2 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs @@ -41,10 +41,11 @@ public class BoolInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { var parameter = packet.Parameters.Current; - string isLastString = packet.Parameters.IsLast ? "true" : "false"; + textWriter.WriteLine($"{Constants.HelperClass}.ParseBool(stringEnumerator);"); + /*string isLastString = packet.Parameters.IsLast ? "true" : "false"; textWriter.WriteMultiline($@" var {parameter.GetResultVariableName()} = stringEnumerator.GetNextToken(); var {parameter.GetErrorVariableName()} = CheckDeserializationResult({parameter.GetResultVariableName()}, ""{parameter.Name}"", stringEnumerator, {isLastString}); @@ -53,7 +54,30 @@ if ({parameter.GetErrorVariableName()} is not null) return Result<{packet.Name}?>.FromError({parameter.GetErrorVariableName()}, {parameter.GetResultVariableName()}); }} {parameter.GetNullableType()} {parameter.GetNullableVariableName()} = {parameter.GetResultVariableName()}.Entity.Token == ""1"" ? true : ({parameter.GetResultVariableName()}.Entity.Token == ""-"" ? null : false); -"); +");*/ return null; } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + textWriter.WriteLine(@" +public static Result ParseBool(PacketStringEnumerator stringEnumerator) +{{ + var tokenResult = stringEnumerator.GetNextToken(); + if (!tokenResult.IsSuccess) + {{ + return Result.FromError(tokenResult); + }} + + var token = tokenResult.Entity.Token; + if (token == ""-"") + {{ + return Result.FromSuccess(null); + }} + + return token == ""1"" ? true : false; +}} +"); + } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs index b59f2c4..551d373 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs @@ -15,6 +15,16 @@ namespace NosSmooth.PacketSerializersGenerator.InlineConverterGenerators; /// public class EnumInlineConverterGenerator : IInlineConverterGenerator { + private readonly List _enumTypes; + + /// + /// Initializes a new instance of the class. + /// + public EnumInlineConverterGenerator() + { + _enumTypes = new List(); + } + /// public bool ShouldHandle(ParameterInfo parameter) => parameter.Type.TypeKind == TypeKind.Enum; @@ -25,37 +35,58 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator var parameter = packet.Parameters.Current; var underlyingType = ((INamedTypeSymbol)parameter.Type).EnumUnderlyingType!.ToString(); textWriter.WriteLine - ($"builder.Append((({underlyingType}?)obj.{parameter.Name}{(parameter.Nullable ? "?" : string.Empty)}).ToString() ?? \"-\");"); + ( + $"builder.Append((({underlyingType}?)obj.{parameter.Name}{(parameter.Nullable ? "?" : string.Empty)}).ToString() ?? \"-\");" + ); return null; } /// - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { var parameter = packet.Parameters.Current; - var underlyingType = ((INamedTypeSymbol)parameter.Type).EnumUnderlyingType!.ToString(); - string isLastString = packet.Parameters.IsLast ? "true" : "false"; - textWriter.WriteMultiline - ( - $@" -var {parameter.GetResultVariableName()} = stringEnumerator.GetNextToken(); -var {parameter.GetErrorVariableName()} = CheckDeserializationResult({parameter.GetResultVariableName()}, ""{parameter.Name}"", stringEnumerator, {isLastString}); -if ({parameter.GetErrorVariableName()} is not null) + if (_enumTypes.All(x => x.ToString() != parameter.Type.ToString())) + { + _enumTypes.Add(parameter.Type); + } + + textWriter.WriteLine + ($"{Constants.HelperClass}.ParseEnum{parameter.GetActualType().Replace('.', '_')}(this, stringEnumerator);"); + return null; + } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + foreach (var type in _enumTypes) + { + var underlyingType = ((INamedTypeSymbol)type).EnumUnderlyingType!.ToString(); + textWriter.WriteMultiline + ( + $@" +public static Result<{type}?> ParseEnum{type.ToString().Replace('.', '_')}(ITypeConverter typeConverter, PacketStringEnumerator stringEnumerator) {{ - return Result<{packet.Name}?>.FromError({parameter.GetErrorVariableName()}, {parameter.GetResultVariableName()}); -}} -{parameter.GetVariableName()} = default; -{underlyingType} {parameter.GetVariableName()}Underlying = default; -{parameter.GetNullableType()} {parameter.GetNullableVariableName()}; -if ({parameter.GetResultVariableName()}.Entity.Token == ""-"") {{ - {parameter.GetNullableVariableName()} = null; -}} -else if (!{underlyingType}.TryParse({parameter.GetResultVariableName()}.Entity.Token, out {parameter.GetVariableName()}Underlying)) {{ - return new PacketParameterSerializerError(this, ""{parameter.Name}"", {parameter.GetResultVariableName()}, $""Could not convert {{{parameter.GetResultVariableName()}.Entity.Token}} as {underlyingType} in inline converter""); + var tokenResult = stringEnumerator.GetNextToken(); + if (!tokenResult.IsSuccess) + {{ + return Result<{type}?>.FromError(tokenResult); + }} + + var token = tokenResult.Entity.Token; + if (token == ""-"") + {{ + return Result<{type}?>.FromSuccess(null); + }} + + if (!{underlyingType}.TryParse(token, out var val)) + {{ + return new CouldNotConvertError(typeConverter, token, ""Could not convert as {type} in inline converter""); + }} + + return ({type}?)val; }} -{parameter.GetNullableVariableName()} = ({parameter.GetNullableType()}){parameter.GetVariableName()}Underlying; " - ); - return null; + ); + } } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs index e9dd07f..331442f 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs @@ -24,33 +24,21 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator public IError? GenerateSerializerPart(IndentedTextWriter textWriter, PacketInfo packet) { var parameter = packet.Parameters.Current; - textWriter.WriteMultiline - ( - $@" -var {parameter.GetResultVariableName()} = _typeConverterRepository.Serialize<{parameter.GetActualType()}>(obj.{parameter.Name}, builder); -if (!{parameter.GetResultVariableName()}.IsSuccess) -{{ - return Result.FromError(new PacketParameterSerializerError(this, ""{parameter.Name}"", {parameter.GetResultVariableName()}), {parameter.GetResultVariableName()}); -}} -" - ); + textWriter.WriteLine($"_typeConverterRepository.Serialize<{parameter.GetActualType()}>(obj.{parameter.Name}, builder);"); return null; } /// - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { var parameter = packet.Parameters.Current; - string isLastString = packet.Parameters.IsLast ? "true" : "false"; - textWriter.WriteMultiline($@" -var {parameter.GetResultVariableName()} = _typeConverterRepository.Deserialize<{parameter.GetNullableType()}>(stringEnumerator); -var {parameter.GetErrorVariableName()} = CheckDeserializationResult({parameter.GetResultVariableName()}, ""{parameter.Name}"", stringEnumerator, {isLastString}); -if ({parameter.GetErrorVariableName()} is not null) -{{ - return Result<{packet.Name}?>.FromError({parameter.GetErrorVariableName()}, {parameter.GetResultVariableName()}); -}} -var {parameter.GetNullableVariableName()} = {parameter.GetResultVariableName()}.Entity; -"); + textWriter.WriteLine($"_typeConverterRepository.Deserialize<{parameter.GetNullableType()}>(stringEnumerator);"); return null; } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + // ignore + } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs index 6bc91bf..212f848 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs @@ -36,5 +36,17 @@ public interface IInlineConverterGenerator /// The text writer to write to. /// The packet. /// An error, if any. - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet); + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet); + + /// + /// Generate helper methods to HelperClass. + /// + /// + /// These will be added to class . + /// This will be called after calling and + /// for all packets and parameters. + /// The converter can group information it needs for the generations that way. + /// + /// The text writer to append full methods to. + public void GenerateHelperMethods(IndentedTextWriter textWriter); } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs index 57361e9..c8d8b3a 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs @@ -27,11 +27,12 @@ public class StringInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? GenerateDeserializerPart(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { - var parameter = packet.Parameters.Current; - string isLastString = packet.Parameters.IsLast ? "true" : "false"; - textWriter.WriteMultiline($@" + // var parameter = packet.Parameters.Current; + // string isLastString = packet.Parameters.IsLast ? "true" : "false"; + textWriter.WriteLine($"{Constants.HelperClass}.ParseString(stringEnumerator);"); + /*textWriter.WriteMultiline($@" var {parameter.GetResultVariableName()} = stringEnumerator.GetNextToken(); var {parameter.GetErrorVariableName()} = CheckDeserializationResult({parameter.GetResultVariableName()}, ""{parameter.Name}"", stringEnumerator, {isLastString}); if ({parameter.GetErrorVariableName()} is not null) @@ -39,7 +40,27 @@ if ({parameter.GetErrorVariableName()} is not null) return Result<{packet.Name}?>.FromError({parameter.GetErrorVariableName()}, {parameter.GetResultVariableName()}); }} var {parameter.GetNullableVariableName()} = {parameter.GetResultVariableName()}.Entity.Token == ""-"" ? null : {parameter.GetResultVariableName()}.Entity.Token; -"); +");*/ return null; } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + textWriter.WriteLine + ( + @" +public static Result ParseString(PacketStringEnumerator stringEnumerator) +{{ + var tokenResult = stringEnumerator.GetNextToken(); + if (!tokenResult.IsSuccess) + {{ + return Result.FromError(tokenResult); + }} + + return tokenResult.Entity.Token; +}} +" + ); + } } \ No newline at end of file diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs index a00e008..193ab17 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs @@ -37,7 +37,7 @@ public class InlineTypeConverterGenerator /// The text writer. /// The packet. /// An error, if any. - public IError? DeserializeAndCheck(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) { var shouldGenerateInline = packet.GenerateAttribute.GetIndexedValue(0); if (shouldGenerateInline) @@ -46,12 +46,12 @@ public class InlineTypeConverterGenerator { if (generator.ShouldHandle(packet.Parameters.Current)) { - return generator.GenerateDeserializerPart(textWriter, packet); + return generator.CallDeserialize(textWriter, packet); } } } - return _fallbackInlineConverterGenerator.GenerateDeserializerPart(textWriter, packet); + return _fallbackInlineConverterGenerator.CallDeserialize(textWriter, packet); } /// @@ -60,7 +60,7 @@ public class InlineTypeConverterGenerator /// The text writer. /// The packet. /// An error, if any. - public IError? SerializeAndCheck(IndentedTextWriter textWriter, PacketInfo packet) + public IError? Serialize(IndentedTextWriter textWriter, PacketInfo packet) { var shouldGenerateInline = packet.GenerateAttribute.GetIndexedValue(0); if (shouldGenerateInline) diff --git a/Core/NosSmooth.PacketSerializersGenerator/NosSmooth.PacketSerializersGenerator.csproj b/Core/NosSmooth.PacketSerializersGenerator/NosSmooth.PacketSerializersGenerator.csproj index 2c152d4..cf63b88 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/NosSmooth.PacketSerializersGenerator.csproj +++ b/Core/NosSmooth.PacketSerializersGenerator/NosSmooth.PacketSerializersGenerator.csproj @@ -19,4 +19,8 @@ + + + + diff --git a/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs index 4e8ee20..5e70051 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs @@ -112,16 +112,6 @@ public override Result<{_packetInfo.Name}?> Deserialize(PacketStringEnumerator s ( $@" }} - -private IResultError? CheckDeserializationResult(Result result, string property, PacketStringEnumerator stringEnumerator, bool last = false) -{{ - if (!result.IsSuccess) - {{ - return new PacketParameterSerializerError(this, property, result); - }} - - return null; -}} }}" ); return null; diff --git a/Core/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs index d433b89..2faf476 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs @@ -32,7 +32,7 @@ public class SourceGenerator : ISourceGenerator /// public SourceGenerator() { - var typeGenerators = new List + _typeConverterGenerator = new List ( new IInlineConverterGenerator[] { @@ -43,7 +43,7 @@ public class SourceGenerator : ISourceGenerator } ); - var inlineTypeConverter = new InlineTypeConverterGenerator(typeGenerators); + var inlineTypeConverter = new InlineTypeConverterGenerator(_typeConverterGenerator); _generators = new List ( @@ -59,6 +59,7 @@ public class SourceGenerator : ISourceGenerator } private readonly List _generators; + private readonly List _typeConverterGenerator; /// public void Initialize(GeneratorInitializationContext context) @@ -129,8 +130,51 @@ public class SourceGenerator : ISourceGenerator $"{packetRecord.GetPrefix()}.{packetRecord.Identifier.NormalizeWhitespace().ToFullString()}Converter.g.cs", stringWriter.GetStringBuilder().ToString() ); + File.WriteAllText + ( + $"/tmp/{packetRecord.GetPrefix()}.{packetRecord.Identifier.NormalizeWhitespace().ToFullString()}Converter.g.cs", + stringWriter.GetStringBuilder().ToString() + ); } } + + var helperClass = GenerateHelperMethods(); + context.AddSource + ( + $"HelperClass.g.cs", + helperClass + ); + File.WriteAllText + ( + $"/tmp/HelperClass.g.cs", + helperClass + ); + } + + private string GenerateHelperMethods() + { + using var stringWriter = new StringWriter(); + using var writer = new IndentedTextWriter(stringWriter, " "); + writer.WriteMultiline(@"// +#nullable enable +#pragma warning disable 1591 + +using NosSmooth.Packets.Converters; +using NosSmooth.Packets.Errors; +using NosSmooth.Packets; +using Remora.Results; + +namespace NosSmooth.Generated; + +internal static class HelperClass +{ +"); + foreach (var inlineHelperGenerator in _typeConverterGenerator) + { + inlineHelperGenerator.GenerateHelperMethods(writer); + } + writer.WriteLine("}"); + return stringWriter.GetStringBuilder().ToString(); } private IError? GeneratePacketSerializer -- 2.48.1