< Summary

Information
Class: System.Text.Json.Serialization.Converters.SmallObjectWithParameterizedConstructorConverter<T1, T2, T3, T4, T5>
Assembly: System.Text.Json
File(s): C:\h\w\B31A098C\w\BB5A0A33\e\runtime-utils\Runner\runtime\src\libraries\System.Text.Json\src\System\Text\Json\Serialization\Converters\Object\ObjectWithParameterizedConstructorConverter.Small.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 63
Coverable lines: 63
Total lines: 129
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 22
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
CreateObject(...)100%110%
ReadAndCacheConstructorArgument(...)0%550%
TryRead(...)0%10100%
InitializeConstructorArgumentCaches(...)0%770%
ConfigureJsonTypeInfoUsingReflection(...)100%110%

File(s)

C:\h\w\B31A098C\w\BB5A0A33\e\runtime-utils\Runner\runtime\src\libraries\System.Text.Json\src\System\Text\Json\Serialization\Converters\Object\ObjectWithParameterizedConstructorConverter.Small.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Collections.Generic;
 5using System.Diagnostics;
 6using System.Diagnostics.CodeAnalysis;
 7using System.Text.Json.Serialization.Metadata;
 8
 9namespace System.Text.Json.Serialization.Converters
 10{
 11    /// <summary>
 12    /// Implementation of <cref>JsonObjectConverter{T}</cref> that supports the deserialization
 13    /// of JSON objects using parameterized constructors.
 14    /// </summary>
 15    internal sealed class SmallObjectWithParameterizedConstructorConverter<T, TArg0, TArg1, TArg2, TArg3> : ObjectWithPa
 16    {
 17        protected override object CreateObject(ref ReadStackFrame frame)
 018        {
 019            var createObject = (JsonTypeInfo.ParameterizedConstructorDelegate<T, TArg0, TArg1, TArg2, TArg3>)
 020                frame.JsonTypeInfo.CreateObjectWithArgs!;
 021            var arguments = (Arguments<TArg0, TArg1, TArg2, TArg3>)frame.CtorArgumentState!.Arguments;
 022            return createObject!(arguments.Arg0, arguments.Arg1, arguments.Arg2, arguments.Arg3);
 023        }
 24
 25        protected override bool ReadAndCacheConstructorArgument(
 26            scoped ref ReadStack state,
 27            ref Utf8JsonReader reader,
 28            JsonParameterInfo jsonParameterInfo)
 029        {
 030            Debug.Assert(state.Current.CtorArgumentState!.Arguments != null);
 031            var arguments = (Arguments<TArg0, TArg1, TArg2, TArg3>)state.Current.CtorArgumentState.Arguments;
 32
 33            bool success;
 34
 035            switch (jsonParameterInfo.Position)
 36            {
 37                case 0:
 038                    success = TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg0);
 039                    break;
 40                case 1:
 041                    success = TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg1);
 042                    break;
 43                case 2:
 044                    success = TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg2);
 045                    break;
 46                case 3:
 047                    success = TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg3);
 048                    break;
 49                default:
 050                    Debug.Fail("More than 4 params: we should be in override for LargeObjectWithParameterizedConstructor
 51                    throw new InvalidOperationException();
 52            }
 53
 054            return success;
 055        }
 56
 57        private static bool TryRead<TArg>(
 58            scoped ref ReadStack state,
 59            ref Utf8JsonReader reader,
 60            JsonParameterInfo jsonParameterInfo,
 61            out TArg? arg)
 062        {
 063            Debug.Assert(jsonParameterInfo.ShouldDeserialize);
 64
 065            var info = (JsonParameterInfo<TArg>)jsonParameterInfo;
 66
 067            bool success = info.EffectiveConverter.TryRead(ref reader, info.ParameterType, info.Options, ref state, out 
 68
 069            if (success)
 070            {
 071                if (value is null)
 072                {
 073                    if (info.IgnoreNullTokensOnRead)
 074                    {
 75                        // Use default value specified on parameter, if any.
 076                        value = info.EffectiveDefaultValue;
 077                    }
 078                    else if (!info.IsNullable && info.Options.RespectNullableAnnotations)
 079                    {
 080                        ThrowHelper.ThrowJsonException_ConstructorParameterDisallowNull(info.Name, state.Current.JsonTyp
 81                    }
 082                }
 083            }
 84
 085            arg = value;
 086            return success;
 087        }
 88
 89        protected override void InitializeConstructorArgumentCaches(ref ReadStack state, JsonSerializerOptions options)
 090        {
 091            JsonTypeInfo typeInfo = state.Current.JsonTypeInfo;
 92
 093            Debug.Assert(typeInfo.CreateObjectWithArgs != null);
 94
 095            var arguments = new Arguments<TArg0, TArg1, TArg2, TArg3>();
 96
 097            foreach (JsonParameterInfo parameterInfo in typeInfo.ParameterCache)
 098            {
 099                switch (parameterInfo.Position)
 100                {
 101                    case 0:
 0102                        arguments.Arg0 = ((JsonParameterInfo<TArg0>)parameterInfo).EffectiveDefaultValue;
 0103                        break;
 104                    case 1:
 0105                        arguments.Arg1 = ((JsonParameterInfo<TArg1>)parameterInfo).EffectiveDefaultValue;
 0106                        break;
 107                    case 2:
 0108                        arguments.Arg2 = ((JsonParameterInfo<TArg2>)parameterInfo).EffectiveDefaultValue;
 0109                        break;
 110                    case 3:
 0111                        arguments.Arg3 = ((JsonParameterInfo<TArg3>)parameterInfo).EffectiveDefaultValue;
 0112                        break;
 113                    default:
 0114                        Debug.Fail("More than 4 params: we should be in override for LargeObjectWithParameterizedConstru
 115                        break;
 116                }
 0117            }
 118
 0119            state.Current.CtorArgumentState!.Arguments = arguments;
 0120        }
 121
 122        [RequiresUnreferencedCode(JsonSerializer.SerializationUnreferencedCodeMessage)]
 123        [RequiresDynamicCode(JsonSerializer.SerializationRequiresDynamicCodeMessage)]
 124        internal override void ConfigureJsonTypeInfoUsingReflection(JsonTypeInfo jsonTypeInfo, JsonSerializerOptions opt
 0125        {
 0126            jsonTypeInfo.CreateObjectWithArgs = DefaultJsonTypeInfoResolver.MemberAccessor.CreateParameterizedConstructo
 0127        }
 128    }
 129}