< Summary

Information
Class: SwiftCollections.SwiftStateJsonConverterFactory
Assembly: SwiftCollections
File(s): /home/runner/work/SwiftCollections/SwiftCollections/src/SwiftCollections/Serialization/SwiftStateJsonConverterFactory.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 61
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CanConvert(...)100%11100%
CreateConverter(...)100%11100%

File(s)

/home/runner/work/SwiftCollections/SwiftCollections/src/SwiftCollections/Serialization/SwiftStateJsonConverterFactory.cs

#LineLine coverage
 1using System;
 2using System.Linq.Expressions;
 3using System.Reflection;
 4using System.Text.Json;
 5using System.Text.Json.Serialization;
 6
 7namespace SwiftCollections;
 8
 9public sealed class SwiftStateJsonConverterFactory : JsonConverterFactory
 10{
 11    public override bool CanConvert(Type typeToConvert)
 2712    {
 2713        var stateProp = typeToConvert.GetProperty(
 2714            "State",
 2715            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 16
 2717        return stateProp != null;
 2718    }
 19
 20    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
 2721    {
 2722        var stateProp = typeToConvert.GetProperty(
 2723            "State",
 2724            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 25
 2726        Type stateType = stateProp.PropertyType;
 27
 2728        var ctor = typeToConvert.GetConstructor(new[] { stateType });
 29
 2730        Type converterType = typeof(SwiftStateJsonConverter<,>)
 2731            .MakeGenericType(typeToConvert, stateType);
 32
 33        // Build constructor delegate
 2734        var stateParam = Expression.Parameter(stateType);
 2735        var newExpr = Expression.New(ctor, stateParam);
 36
 2737        var factoryLambda = Expression.Lambda(
 2738            typeof(Func<,>).MakeGenericType(stateType, typeToConvert),
 2739            newExpr,
 2740            stateParam);
 41
 2742        var factoryDelegate = factoryLambda.Compile();
 43
 44        // Build state getter delegate
 2745        var collectionParam = Expression.Parameter(typeToConvert);
 46
 2747        var getterExpr = Expression.Property(collectionParam, stateProp);
 48
 2749        var getterLambda = Expression.Lambda(
 2750            typeof(Func<,>).MakeGenericType(typeToConvert, stateType),
 2751            getterExpr,
 2752            collectionParam);
 53
 2754        var getterDelegate = getterLambda.Compile();
 55
 2756        return (JsonConverter)Activator.CreateInstance(
 2757            converterType,
 2758            factoryDelegate,
 2759            getterDelegate);
 2760    }
 61}