From 015abb8a876737d5b58a3103cc2ac6b92a396b78 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Sat, 15 Jun 2024 15:51:17 -0700 Subject: [PATCH] Fix assignment tracking Fixes incorrect handling of skipping fields --- src/generator/Generator.Deserialize.cs | 27 ++++++++--- ...rde.Test.AllInOne.IDeserialize.verified.cs | 4 +- .../C.IDeserialize.verified.cs | 4 +- .../OptsWrap.IDeserialize.verified.cs | 4 +- .../S.IDeserialize.verified.cs | 4 +- .../Array#ArrayField.IDeserialize.verified.cs | 4 +- ...Missing#SetToNull.IDeserialize.verified.cs | 4 +- ...lizeOnlyWrap#Wrap.IDeserialize.verified.cs | 4 +- .../MemberSkip#Rgb.IDeserialize.verified.cs | 4 +- ...ipDeserialize#Rgb.IDeserialize.verified.cs | 5 +- ...SkipSerialize#Rgb.IDeserialize.verified.cs | 4 +- ...alClasses#A.B.C.D.IDeserialize.verified.cs | 4 +- ...ullableRefField#S.IDeserialize.verified.cs | 4 +- .../Rgb#Rgb.IDeserialize.verified.cs | 4 +- .../S.IDeserialize.verified.cs | 4 +- .../S2.IDeserialize.verified.cs | 4 +- .../S.IDeserialize.verified.cs | 4 +- .../OPTSWrap.IDeserialize.verified.cs | 4 +- .../S.IDeserialize.verified.cs | 4 +- .../OPTSWrap.IDeserialize.verified.cs | 4 +- .../Test.ChannelList.IDeserialize.verified.cs | 4 +- .../C.IDeserialize.verified.cs | 4 +- .../OPTSWrap.IDeserialize.verified.cs | 4 +- .../PointWrap.IDeserialize.verified.cs | 4 +- .../R.IDeserialize.verified.cs | 4 +- .../Test.Parent.IDeserialize.verified.cs | 4 +- ...est.RecursiveWrap.IDeserialize.verified.cs | 4 +- test/Serde.Test/JsonDeserializeTests.cs | 22 +++++++++ .../Serde.Test.AllInOne.IDeserialize.cs | 4 +- ...tomArrayWrapExplicitOnType.IDeserialize.cs | 4 +- ...mArrayExplicitWrapOnMember.IDeserialize.cs | 4 +- ...serializeTests.DenyUnknown.IDeserialize.cs | 4 +- ...erializeTests.ExtraMembers.IDeserialize.cs | 4 +- ...nDeserializeTests.IdStruct.IDeserialize.cs | 4 +- ...erializeTests.IdStructList.IDeserialize.cs | 4 +- ...ializeTests.NullableFields.IDeserialize.cs | 4 +- ...DeserializeTests.SetToNull.IDeserialize.cs | 4 +- ...alizeTests.SkipDeserialize.IDeserialize.cs | 48 +++++++++++++++++++ ...alizeTests.SkipDeserializeSerdeTypeInfo.cs | 11 +++++ ...erializeTests.ThrowMissing.IDeserialize.cs | 4 +- .../Serde.Test.MaxSizeType.IDeserialize.cs | 4 +- .../Serde.Test.AllInOne.IDeserialize.cs | 4 +- 42 files changed, 178 insertions(+), 83 deletions(-) create mode 100644 test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.SkipDeserialize.IDeserialize.cs create mode 100644 test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.SkipDeserializeSerdeTypeInfo.cs diff --git a/src/generator/Generator.Deserialize.cs b/src/generator/Generator.Deserialize.cs index 901fb90b..1fa147ae 100644 --- a/src/generator/Generator.Deserialize.cs +++ b/src/generator/Generator.Deserialize.cs @@ -86,8 +86,8 @@ private static MethodDeclarationSyntax GenerateCustomDeserializeMethod( <= 64 => "ulong", _ => throw new InvalidOperationException("Too many members in type") }; - var (cases, locals, assignedMask) = InitCasesAndLocals(); - string typeCreationExpr = GenerateTypeCreation(context, typeFqn, type, members); + var (cases, locals, requiredMask) = InitCasesAndLocals(); + string typeCreationExpr = GenerateTypeCreation(context, typeFqn, type, members, requiredMask); const string typeInfoLocalName = "_l_typeInfo"; const string indexLocalName = "_l_index_"; @@ -96,7 +96,7 @@ private static MethodDeclarationSyntax GenerateCustomDeserializeMethod( static {{typeFqn}} Serde.IDeserialize<{{typeFqn}}>.Deserialize(IDeserializer deserializer) { {{locals}} - {{assignedVarType}} {{AssignedVarName}} = {{assignedMask}}; + {{assignedVarType}} {{AssignedVarName}} = 0; var {{typeInfoLocalName}} = {{type.Name}}SerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType({{typeInfoLocalName}}); @@ -119,10 +119,12 @@ private static MethodDeclarationSyntax GenerateCustomDeserializeMethod( var casesBuilder = new StringBuilder(); var localsBuilder = new StringBuilder(); long assignedMaskValue = 0; + var skippedIndices = new List(); for (int i = 0; i < members.Count; i++) { if (members[i].SkipDeserialize) { + skippedIndices.Add(i); continue; } @@ -160,7 +162,7 @@ private static MethodDeclarationSyntax GenerateCustomDeserializeMethod( {AssignedVarName} |= (({assignedVarType})1) << {i}; break; """); - if (m.IsNullable && !m.ThrowIfMissing) + if (!m.IsNullable || m.ThrowIfMissing) { assignedMaskValue |= 1L << i; } @@ -170,6 +172,12 @@ private static MethodDeclarationSyntax GenerateCustomDeserializeMethod( throw new InvalidDeserializeValueException("Unexpected field or property name in type {type.Name}: '" + _l_errorName + "'"); """ : "break;"; + foreach (var i in skippedIndices) + { + casesBuilder.AppendLine($""" + case {i}: + """); + } casesBuilder.AppendLine($""" case Serde.IDeserializeType.IndexNotFound: {unknownMemberBehavior} @@ -452,7 +460,7 @@ private static MemberDeclarationSyntax GenerateCustomTypeVisitor( _ => throw new InvalidOperationException("Too many members in type") }; var (cases, locals, assignedMask) = InitCasesAndLocals(); - string typeCreationExpr = GenerateTypeCreation(context, typeName, type, members); + string typeCreationExpr = GenerateTypeCreation(context, typeName, type, members, assignedMask); var methodText = $$""" {{typeName}} Serde.IDeserializeVisitor<{{typeName}}>.VisitDictionary(ref D d) { @@ -529,7 +537,12 @@ private static MemberDeclarationSyntax GenerateCustomTypeVisitor( /// must be a constructor signature as specified by the ConstructorSignature property /// in the SerdeTypeOptions. /// - private static string GenerateTypeCreation(GeneratorExecutionContext context, string typeName, ITypeSymbol type, List members) + private static string GenerateTypeCreation( + GeneratorExecutionContext context, + string typeName, + ITypeSymbol type, + List members, + string assignedMask) { var targetSignature = SymbolUtilities.GetTypeOptions(type).ConstructorSignature; var targetTuple = targetSignature as INamedTypeSymbol; @@ -602,7 +615,7 @@ private static string GenerateTypeCreation(GeneratorExecutionContext context, st } var mask = new string('1', members.Count); return $$""" - if ({{AssignedVarName}} != 0b{{mask}}) + if (({{AssignedVarName}} & {{assignedMask}}) != {{assignedMask}}) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/AllInOneTest.GeneratorTest/Serde.Test.AllInOne.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/AllInOneTest.GeneratorTest/Serde.Test.AllInOne.IDeserialize.verified.cs index 36527aa0..b3c3212c 100644 --- a/test/Serde.Generation.Test/test_output/AllInOneTest.GeneratorTest/Serde.Test.AllInOne.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/AllInOneTest.GeneratorTest/Serde.Test.AllInOne.IDeserialize.verified.cs @@ -26,7 +26,7 @@ partial record AllInOne : Serde.IDeserialize int[][] _l_nestedarr = default !; System.Collections.Immutable.ImmutableArray _l_intimm = default !; Serde.Test.AllInOne.ColorEnum _l_color = default !; - ushort _r_assignedValid = 0b100000000000; + ushort _r_assignedValid = 0; var _l_typeInfo = AllInOneSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -105,7 +105,7 @@ partial record AllInOne : Serde.IDeserialize } } - if (_r_assignedValid != 0b1111111111111111) + if ((_r_assignedValid & 0b1111011111111111) != 0b1111011111111111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests.EnumMember/C.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests.EnumMember/C.IDeserialize.verified.cs index 6c3c874d..be571d80 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests.EnumMember/C.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests.EnumMember/C.IDeserialize.verified.cs @@ -12,7 +12,7 @@ static C Serde.IDeserialize.Deserialize(IDeserializer deserializer) ColorByte _l_colorbyte = default !; ColorLong _l_colorlong = default !; ColorULong _l_colorulong = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = CSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -43,7 +43,7 @@ static C Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1111) + if ((_r_assignedValid & 0b1111) != 0b1111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests.NestedExplicitDeserializeWrapper/OptsWrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests.NestedExplicitDeserializeWrapper/OptsWrap.IDeserialize.verified.cs index e3edcb7b..a91a3dc8 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests.NestedExplicitDeserializeWrapper/OptsWrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests.NestedExplicitDeserializeWrapper/OptsWrap.IDeserialize.verified.cs @@ -12,7 +12,7 @@ partial record struct OptsWrap : Serde.IDeserialize static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) { System.Collections.Immutable.ImmutableArray _l_opts = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = SSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/Array#ArrayField.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/Array#ArrayField.IDeserialize.verified.cs index b6eef14e..4af34de2 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/Array#ArrayField.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/Array#ArrayField.IDeserialize.verified.cs @@ -9,7 +9,7 @@ partial class ArrayField : Serde.IDeserialize static ArrayField Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int[] _l_intarr = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = ArrayFieldSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static ArrayField Serde.IDeserialize.Deserialize(IDeserializer deser } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeMissing#SetToNull.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeMissing#SetToNull.IDeserialize.verified.cs index 02a709bd..21989236 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeMissing#SetToNull.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeMissing#SetToNull.IDeserialize.verified.cs @@ -11,7 +11,7 @@ static SetToNull Serde.IDeserialize.Deserialize(IDeserializer deseria string _l_present = default !; string? _l_missing = default !; string? _l_throwmissing = default !; - byte _r_assignedValid = 0b10; + byte _r_assignedValid = 0; var _l_typeInfo = SetToNullSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -38,7 +38,7 @@ static SetToNull Serde.IDeserialize.Deserialize(IDeserializer deseria } } - if (_r_assignedValid != 0b111) + if ((_r_assignedValid & 0b101) != 0b101) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeOnlyWrap#Wrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeOnlyWrap#Wrap.IDeserialize.verified.cs index 95277664..2fe68e0e 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeOnlyWrap#Wrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/DeserializeOnlyWrap#Wrap.IDeserialize.verified.cs @@ -12,7 +12,7 @@ partial record struct Wrap : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { byte _l_red = default !; byte _l_blue = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = RgbSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -33,7 +33,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b11) + if ((_r_assignedValid & 0b11) != 0b11) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipDeserialize#Rgb.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipDeserialize#Rgb.IDeserialize.verified.cs index 1a7ddb31..65088dd8 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipDeserialize#Rgb.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipDeserialize#Rgb.IDeserialize.verified.cs @@ -10,7 +10,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) { byte _l_red = default !; byte _l_blue = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = RgbSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -26,6 +26,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) _l_blue = typeDeserialize.ReadValue(_l_index_); _r_assignedValid |= ((byte)1) << 2; break; + case 1: case Serde.IDeserializeType.IndexNotFound: break; default: @@ -33,7 +34,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b111) + if ((_r_assignedValid & 0b101) != 0b101) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipSerialize#Rgb.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipSerialize#Rgb.IDeserialize.verified.cs index ba4f35d5..38fad683 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipSerialize#Rgb.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/MemberSkipSerialize#Rgb.IDeserialize.verified.cs @@ -11,7 +11,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) byte _l_red = default !; byte _l_green = default !; byte _l_blue = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = RgbSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -38,7 +38,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b111) + if ((_r_assignedValid & 0b111) != 0b111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/NestedPartialClasses#A.B.C.D.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/NestedPartialClasses#A.B.C.D.IDeserialize.verified.cs index 23c4419a..916ae9b0 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/NestedPartialClasses#A.B.C.D.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/NestedPartialClasses#A.B.C.D.IDeserialize.verified.cs @@ -15,7 +15,7 @@ partial class D : Serde.IDeserialize static A.B.C.D Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_field = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = DSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -34,7 +34,7 @@ partial class D : Serde.IDeserialize } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/NullableRefField#S.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/NullableRefField#S.IDeserialize.verified.cs index 29f035d7..eb9098df 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/NullableRefField#S.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/NullableRefField#S.IDeserialize.verified.cs @@ -9,7 +9,7 @@ partial struct S : Serde.IDeserialize static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) { string? _l_f = default !; - byte _r_assignedValid = 0b1; + byte _r_assignedValid = 0; var _l_typeInfo = SSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b0) != 0b0) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/DeserializeTests/Rgb#Rgb.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/DeserializeTests/Rgb#Rgb.IDeserialize.verified.cs index ba4f35d5..38fad683 100644 --- a/test/Serde.Generation.Test/test_output/DeserializeTests/Rgb#Rgb.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/DeserializeTests/Rgb#Rgb.IDeserialize.verified.cs @@ -11,7 +11,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) byte _l_red = default !; byte _l_green = default !; byte _l_blue = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = RgbSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -38,7 +38,7 @@ static Rgb Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b111) + if ((_r_assignedValid & 0b111) != 0b111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S.IDeserialize.verified.cs index 1a9865ef..e4e6cc52 100644 --- a/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S.IDeserialize.verified.cs @@ -9,7 +9,7 @@ partial struct S : Serde.IDeserialize static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) { ColorEnum _l_e = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = SSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S2.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S2.IDeserialize.verified.cs index 5642dac0..3ffe2716 100644 --- a/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S2.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/MemberFormatTests.EnumValues/S2.IDeserialize.verified.cs @@ -9,7 +9,7 @@ partial struct S2 : Serde.IDeserialize static S2 Serde.IDeserialize.Deserialize(IDeserializer deserializer) { ColorEnum _l_e = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = S2SerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static S2 Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/MemberFormatTests.KebabCase/S.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/MemberFormatTests.KebabCase/S.IDeserialize.verified.cs index e7a23d0a..3dd451b5 100644 --- a/test/Serde.Generation.Test/test_output/MemberFormatTests.KebabCase/S.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/MemberFormatTests.KebabCase/S.IDeserialize.verified.cs @@ -10,7 +10,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_one = default !; int _l_twoword = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = SSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -33,7 +33,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b11) + if ((_r_assignedValid & 0b11) != 0b11) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/SerializeTests.NestedExplicitSerializeWrapper/OPTSWrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/SerializeTests.NestedExplicitSerializeWrapper/OPTSWrap.IDeserialize.verified.cs index 901190ae..802a806d 100644 --- a/test/Serde.Generation.Test/test_output/SerializeTests.NestedExplicitSerializeWrapper/OPTSWrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/SerializeTests.NestedExplicitSerializeWrapper/OPTSWrap.IDeserialize.verified.cs @@ -12,7 +12,7 @@ partial record struct OPTSWrap : Serde.IDeserialize static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) { System.Collections.Immutable.ImmutableArray _l_opts = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = SSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static S Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.GenerateSerdeWrap/OPTSWrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.GenerateSerdeWrap/OPTSWrap.IDeserialize.verified.cs index 901190ae..802a806d 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.GenerateSerdeWrap/OPTSWrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.GenerateSerdeWrap/OPTSWrap.IDeserialize.verified.cs @@ -12,7 +12,7 @@ partial record struct OPTSWrap : Serde.IDeserialize static Test.ChannelList Serde.IDeserialize.Deserialize(IDeserializer deserializer) { System.Collections.Immutable.ImmutableArray _l_channels = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = ChannelListSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -30,7 +30,7 @@ partial record struct ChannelList : Serde.IDeserialize } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/C.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/C.IDeserialize.verified.cs index a4dba222..c3035811 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/C.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/C.IDeserialize.verified.cs @@ -9,7 +9,7 @@ partial class C : Serde.IDeserialize static C Serde.IDeserialize.Deserialize(IDeserializer deserializer) { System.Runtime.InteropServices.ComTypes.BIND_OPTS _l_s = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = CSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -28,7 +28,7 @@ static C Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/OPTSWrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/OPTSWrap.IDeserialize.verified.cs index 901190ae..802a806d 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/OPTSWrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.NestedDeserializeWrap/OPTSWrap.IDeserialize.verified.cs @@ -12,7 +12,7 @@ partial record struct OPTSWrap : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_x = default !; int _l_y = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = PointSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -33,7 +33,7 @@ static Point Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b11) + if ((_r_assignedValid & 0b11) != 0b11) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.PositionalRecordDeserialize/R.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.PositionalRecordDeserialize/R.IDeserialize.verified.cs index 28805c9f..d3703dcf 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.PositionalRecordDeserialize/R.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.PositionalRecordDeserialize/R.IDeserialize.verified.cs @@ -10,7 +10,7 @@ static R Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_a = default !; string _l_b = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = RSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -33,7 +33,7 @@ static R Serde.IDeserialize.Deserialize(IDeserializer deserializer) } } - if (_r_assignedValid != 0b11) + if ((_r_assignedValid & 0b11) != 0b11) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.Parent.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.Parent.IDeserialize.verified.cs index 02d0f0f5..2f601299 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.Parent.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.Parent.IDeserialize.verified.cs @@ -11,7 +11,7 @@ partial record Parent : Serde.IDeserialize static Test.Parent Serde.IDeserialize.Deserialize(IDeserializer deserializer) { Recursive _l_r = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = ParentSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -30,7 +30,7 @@ partial record Parent : Serde.IDeserialize } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b1) != 0b1) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.RecursiveWrap.IDeserialize.verified.cs b/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.RecursiveWrap.IDeserialize.verified.cs index a0f11cb6..a8a15498 100644 --- a/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.RecursiveWrap.IDeserialize.verified.cs +++ b/test/Serde.Generation.Test/test_output/WrapperTests.RecursiveType/Test.RecursiveWrap.IDeserialize.verified.cs @@ -11,7 +11,7 @@ partial record struct RecursiveWrap : Serde.IDeserialize static Recursive Serde.IDeserialize.Deserialize(IDeserializer deserializer) { Recursive? _l_next = default !; - byte _r_assignedValid = 0b1; + byte _r_assignedValid = 0; var _l_typeInfo = RecursiveSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -30,7 +30,7 @@ static Recursive Serde.IDeserialize.Deserialize(IDeserializer deseria } } - if (_r_assignedValid != 0b1) + if ((_r_assignedValid & 0b0) != 0b0) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Test/JsonDeserializeTests.cs b/test/Serde.Test/JsonDeserializeTests.cs index 1b90bc38..ed77d4ff 100644 --- a/test/Serde.Test/JsonDeserializeTests.cs +++ b/test/Serde.Test/JsonDeserializeTests.cs @@ -270,5 +270,27 @@ public void NullableFieldsTest() } Assert.Equal(s.Dict.Count, de.Dict.Count); } + + [Fact] + public void DeserializeWithSkip() + { + var src = """ +{ + "required": "abc", + "skip": "def" +} +"""; + var de = JsonSerializer.Deserialize(src); + Assert.Equal(new SkipDeserialize { Required = "abc" }, de); + } + + [GenerateDeserialize] + public partial record SkipDeserialize + { + public required string Required { get; init; } + + [SerdeMemberOptions(SkipDeserialize = true)] + public string Skip => "xyz"; + } } } \ No newline at end of file diff --git a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs index 12d3b02c..d2ea5015 100644 --- a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs +++ b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs @@ -25,7 +25,7 @@ partial record AllInOne : Serde.IDeserialize int[][] _l_nestedarr = default !; System.Collections.Immutable.ImmutableArray _l_intimm = default !; Serde.Test.AllInOne.ColorEnum _l_color = default !; - ushort _r_assignedValid = 0b100000000000; + ushort _r_assignedValid = 0; var _l_typeInfo = AllInOneSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -104,7 +104,7 @@ partial record AllInOne : Serde.IDeserialize } } - if (_r_assignedValid != 0b1111111111111111) + if ((_r_assignedValid & 0b1111011111111111) != 0b1111011111111111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.GenericWrapperTests.CustomArrayWrapExplicitOnType.IDeserialize.cs b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.GenericWrapperTests.CustomArrayWrapExplicitOnType.IDeserialize.cs index 27cb46a4..4a14dcbb 100644 --- a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.GenericWrapperTests.CustomArrayWrapExplicitOnType.IDeserialize.cs +++ b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.GenericWrapperTests.CustomArrayWrapExplicitOnType.IDeserialize.cs @@ -12,7 +12,7 @@ partial record struct CustomArrayWrapExplicitOnType : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { Serde.Test.GenericWrapperTests.CustomImArray2 _l_a = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = CustomArrayWrapExplicitOnTypeSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -31,7 +31,7 @@ partial record struct CustomArrayWrapExplicitOnType : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { Serde.Test.GenericWrapperTests.CustomImArray _l_a = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = CustomImArrayExplicitWrapOnMemberSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -31,7 +31,7 @@ partial record struct CustomImArrayExplicitWrapOnMember : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_b = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = ExtraMembersSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -31,7 +31,7 @@ partial struct ExtraMembers : Serde.IDeserialize.Deserialize(IDeserializer deserializer) { int _l_id = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = IdStructSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -31,7 +31,7 @@ partial struct IdStruct : Serde.IDeserialize _l_list = default !; - byte _r_assignedValid = 0b0; + byte _r_assignedValid = 0; var _l_typeInfo = IdStructListSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -36,7 +36,7 @@ partial record struct IdStructList : Serde.IDeserialize _l_dict = default !; - byte _r_assignedValid = 0b1; + byte _r_assignedValid = 0; var _l_typeInfo = NullableFieldsSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -36,7 +36,7 @@ partial class NullableFields : Serde.IDeserialize + { + static Serde.Test.JsonDeserializeTests.SkipDeserialize Serde.IDeserialize.Deserialize(IDeserializer deserializer) + { + string _l_required = default !; + byte _r_assignedValid = 0; + var _l_typeInfo = SkipDeserializeSerdeTypeInfo.TypeInfo; + var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); + int _l_index_; + while ((_l_index_ = typeDeserialize.TryReadIndex(_l_typeInfo, out var _l_errorName)) != IDeserializeType.EndOfType) + { + switch (_l_index_) + { + case 0: + _l_required = typeDeserialize.ReadValue(_l_index_); + _r_assignedValid |= ((byte)1) << 0; + break; + case 1: + case Serde.IDeserializeType.IndexNotFound: + break; + default: + throw new InvalidOperationException("Unexpected index: " + _l_index_); + } + } + + if ((_r_assignedValid & 0b1) != 0b1) + { + throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); + } + + var newType = new Serde.Test.JsonDeserializeTests.SkipDeserialize() + { + Required = _l_required, + }; + return newType; + } + } + } +} \ No newline at end of file diff --git a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.SkipDeserializeSerdeTypeInfo.cs b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.SkipDeserializeSerdeTypeInfo.cs new file mode 100644 index 00000000..b51edbb7 --- /dev/null +++ b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.SkipDeserializeSerdeTypeInfo.cs @@ -0,0 +1,11 @@ +namespace Serde.Test; +partial class JsonDeserializeTests +{ + internal static class SkipDeserializeSerdeTypeInfo +{ + internal static readonly Serde.TypeInfo TypeInfo = Serde.TypeInfo.Create(new (string, System.Reflection.MemberInfo)[] { +("required", typeof(Serde.Test.JsonDeserializeTests.SkipDeserialize).GetProperty("Required")!), +("skip", typeof(Serde.Test.JsonDeserializeTests.SkipDeserialize).GetProperty("Skip")!) + }); +} +} \ No newline at end of file diff --git a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.ThrowMissing.IDeserialize.cs b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.ThrowMissing.IDeserialize.cs index 6fff32fe..1885a985 100644 --- a/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.ThrowMissing.IDeserialize.cs +++ b/test/Serde.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.JsonDeserializeTests.ThrowMissing.IDeserialize.cs @@ -13,7 +13,7 @@ partial record struct ThrowMissing : Serde.IDeserialize byte _l_field62 = default !; byte _l_field63 = default !; byte _l_field64 = default !; - ulong _r_assignedValid = 0b0; + ulong _r_assignedValid = 0; var _l_typeInfo = MaxSizeTypeSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -344,7 +344,7 @@ partial struct MaxSizeType : Serde.IDeserialize } } - if (_r_assignedValid != 0b1111111111111111111111111111111111111111111111111111111111111111) + if ((_r_assignedValid & 0b1111111111111111111111111111111111111111111111111111111111111111) != 0b1111111111111111111111111111111111111111111111111111111111111111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); } diff --git a/test/Serde.Xml.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs b/test/Serde.Xml.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs index 12d3b02c..d2ea5015 100644 --- a/test/Serde.Xml.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs +++ b/test/Serde.Xml.Test/generated/SerdeGenerator/Serde.SerdeImplRoslynGenerator/Serde.Test.AllInOne.IDeserialize.cs @@ -25,7 +25,7 @@ partial record AllInOne : Serde.IDeserialize int[][] _l_nestedarr = default !; System.Collections.Immutable.ImmutableArray _l_intimm = default !; Serde.Test.AllInOne.ColorEnum _l_color = default !; - ushort _r_assignedValid = 0b100000000000; + ushort _r_assignedValid = 0; var _l_typeInfo = AllInOneSerdeTypeInfo.TypeInfo; var typeDeserialize = deserializer.DeserializeType(_l_typeInfo); int _l_index_; @@ -104,7 +104,7 @@ partial record AllInOne : Serde.IDeserialize } } - if (_r_assignedValid != 0b1111111111111111) + if ((_r_assignedValid & 0b1111011111111111) != 0b1111011111111111) { throw new Serde.InvalidDeserializeValueException("Not all members were assigned"); }