< Summary

Information
Class: System.Text.Json.Serialization.Converters.NullableConverterFactory
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\Value\NullableConverterFactory.cs
Line coverage
13%
Covered lines: 3
Uncovered lines: 19
Coverable lines: 22
Total lines: 52
Line coverage: 13.6%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
CanConvert(...)100%11100%
CreateConverter(...)0%440%
CreateValueConverter(...)0%220%
GetNullableConverterType(...)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\Value\NullableConverterFactory.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.Diagnostics;
 5using System.Diagnostics.CodeAnalysis;
 6using System.Reflection;
 7using System.Text.Json.Reflection;
 8
 9namespace System.Text.Json.Serialization.Converters
 10{
 11    [RequiresDynamicCode(JsonSerializer.SerializationRequiresDynamicCodeMessage)]
 12    internal sealed class NullableConverterFactory : JsonConverterFactory
 13    {
 14        public override bool CanConvert(Type typeToConvert)
 364615        {
 364616            return typeToConvert.IsNullableOfT();
 364617        }
 18
 19        public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
 020        {
 021            Debug.Assert(typeToConvert.IsNullableOfT());
 22
 023            Type valueTypeToConvert = typeToConvert.GetGenericArguments()[0];
 024            JsonConverter valueConverter = options.GetConverterInternal(valueTypeToConvert);
 25
 26            // If the value type has an interface or object converter, just return that converter directly.
 027            if (!valueConverter.Type!.IsValueType && valueTypeToConvert.IsValueType)
 028            {
 029                return valueConverter;
 30            }
 31
 032            return CreateValueConverter(valueTypeToConvert, valueConverter);
 033        }
 34
 35        public static JsonConverter CreateValueConverter(Type valueTypeToConvert, JsonConverter valueConverter)
 036        {
 037            Debug.Assert(valueTypeToConvert.IsValueType && !valueTypeToConvert.IsNullableOfT());
 038            return (JsonConverter)Activator.CreateInstance(
 039                GetNullableConverterType(valueTypeToConvert),
 040                BindingFlags.Instance | BindingFlags.Public,
 041                binder: null,
 042                args: new object[] { valueConverter },
 043                culture: null)!;
 044        }
 45
 46        [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2071:UnrecognizedReflectionPattern",
 47            Justification = "'NullableConverter<T> where T : struct' implies 'T : new()', so the trimmer is warning call
 48            "But NullableConverter doesn't call new T(), so this is safe.")]
 49        [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
 050        private static Type GetNullableConverterType(Type valueTypeToConvert) => typeof(NullableConverter<>).MakeGeneric
 51    }
 52}