< Summary

Information
Class: System.Text.Json.Serialization.Converters.FSharpTypeConverterFactory
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\FSharp\FSharpTypeConverterFactory.cs
Line coverage
9%
Covered lines: 3
Uncovered lines: 30
Coverable lines: 33
Total lines: 78
Line coverage: 9%
Branch coverage
8%
Covered branches: 1
Total branches: 12
Branch coverage: 8.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
CanConvert(...)50%22100%
CreateConverter(...)0%10100%

File(s)

C:\h\w\B31A098C\w\BB5A0A33\e\runtime-utils\Runner\runtime\src\libraries\System.Text.Json\src\System\Text\Json\Serialization\Converters\FSharp\FSharpTypeConverterFactory.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.Text.Json.Serialization.Metadata;
 7using FSharpKind = System.Text.Json.Serialization.Metadata.FSharpCoreReflectionProxy.FSharpKind;
 8
 9namespace System.Text.Json.Serialization.Converters
 10{
 11    [RequiresDynamicCode(FSharpCoreReflectionProxy.FSharpCoreUnreferencedCodeMessage)]
 12    internal sealed class FSharpTypeConverterFactory : JsonConverterFactory
 13    {
 14        [RequiresUnreferencedCode(FSharpCoreReflectionProxy.FSharpCoreUnreferencedCodeMessage)]
 315        public FSharpTypeConverterFactory() { }
 16
 17        private ObjectConverterFactory? _recordConverterFactory;
 18
 19        [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
 20            Justification = "The ctor is marked RequiresUnreferencedCode.")]
 21        public override bool CanConvert(Type typeToConvert) =>
 230122            FSharpCoreReflectionProxy.IsFSharpType(typeToConvert) &&
 230123                FSharpCoreReflectionProxy.Instance.DetectFSharpKind(typeToConvert) is not FSharpKind.Unrecognized;
 24
 25        [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
 26            Justification = "The ctor is marked RequiresUnreferencedCode.")]
 27        [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2055:MakeGenericType",
 28            Justification = "The ctor is marked RequiresUnreferencedCode.")]
 29        public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
 030        {
 031            Debug.Assert(CanConvert(typeToConvert));
 32
 33            Type elementType;
 34            Type converterFactoryType;
 035            object?[]? constructorArguments = null;
 36
 037            switch (FSharpCoreReflectionProxy.Instance.DetectFSharpKind(typeToConvert))
 38            {
 39                case FSharpKind.Option:
 040                    elementType = typeToConvert.GetGenericArguments()[0];
 041                    converterFactoryType = typeof(FSharpOptionConverter<,>).MakeGenericType(typeToConvert, elementType);
 042                    constructorArguments = new object[] { options.GetConverterInternal(elementType) };
 043                    break;
 44                case FSharpKind.ValueOption:
 045                    elementType = typeToConvert.GetGenericArguments()[0];
 046                    converterFactoryType = typeof(FSharpValueOptionConverter<,>).MakeGenericType(typeToConvert, elementT
 047                    constructorArguments = new object[] { options.GetConverterInternal(elementType) };
 048                    break;
 49                case FSharpKind.List:
 050                    elementType = typeToConvert.GetGenericArguments()[0];
 051                    converterFactoryType = typeof(FSharpListConverter<,>).MakeGenericType(typeToConvert, elementType);
 052                    break;
 53                case FSharpKind.Set:
 054                    elementType = typeToConvert.GetGenericArguments()[0];
 055                    converterFactoryType = typeof(FSharpSetConverter<,>).MakeGenericType(typeToConvert, elementType);
 056                    break;
 57                case FSharpKind.Map:
 058                    Type[] genericArgs = typeToConvert.GetGenericArguments();
 059                    Type keyType = genericArgs[0];
 060                    Type valueType = genericArgs[1];
 061                    converterFactoryType = typeof(FSharpMapConverter<,,>).MakeGenericType(typeToConvert, keyType, valueT
 062                    break;
 63                case FSharpKind.Record:
 64                    // Use a modified object converter factory that picks the right constructor for struct record deseri
 065                    ObjectConverterFactory objectFactory = _recordConverterFactory ??= new ObjectConverterFactory(useDef
 066                    Debug.Assert(objectFactory.CanConvert(typeToConvert));
 067                    return objectFactory.CreateConverter(typeToConvert, options);
 68                case FSharpKind.Union:
 069                    return UnsupportedTypeConverterFactory.CreateUnsupportedConverterForType(typeToConvert, SR.FSharpDis
 70                default:
 071                    Debug.Fail("Unrecognized F# type.");
 72                    throw new Exception();
 73            }
 74
 075            return (JsonConverter)Activator.CreateInstance(converterFactoryType, constructorArguments)!;
 076        }
 77    }
 78}