< Summary

Information
Class: NexusLabs.Needlr.Generators.CodeGen.RecordConstructorOverloadCodeGenerator
Assembly: NexusLabs.Needlr.Generators
File(s): /_work/nick-alienware-needlr-1-1784953859-3e8997/needlr/needlr/src/NexusLabs.Needlr.Generators/CodeGen/RecordConstructorOverloadCodeGenerator.cs
Line coverage
100%
Covered lines: 70
Uncovered lines: 0
Coverable lines: 70
Total lines: 132
Line coverage: 100%
Branch coverage
94%
Covered branches: 17
Total branches: 18
Branch coverage: 94.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
BuildHintName(...)50%22100%
GenerateSource(...)100%1414100%
ToCrefTypeParameterList(...)100%22100%

File(s)

/_work/nick-alienware-needlr-1-1784953859-3e8997/needlr/needlr/src/NexusLabs.Needlr.Generators/CodeGen/RecordConstructorOverloadCodeGenerator.cs

#LineLine coverage
 1using System.Linq;
 2using System.Text;
 3
 4using NexusLabs.Needlr.Generators.Models;
 5
 6namespace NexusLabs.Needlr.Generators.CodeGen;
 7
 8/// <summary>
 9/// Emits one public forwarding constructor overload for a positional record model.
 10/// </summary>
 11internal static class RecordConstructorOverloadCodeGenerator
 12{
 13    private const string GeneratedFileSuffix =
 14        ".RecordConstructorOverload.g.cs";
 15
 16    /// <summary>
 17    /// Builds the deterministic generated-source hint name.
 18    /// </summary>
 19    internal static string BuildHintName(RecordConstructorOverloadModel model)
 20    {
 1621        var baseName = model.ContainingNamespace.Length > 0
 1622            ? $"{model.ContainingNamespace}.{model.ContainingTypeName}"
 1623            : model.ContainingTypeName;
 1624        return $"{GeneratorHelpers.SanitizeIdentifier(baseName)}_T{model.Arity}{GeneratedFileSuffix}";
 25    }
 26
 27    /// <summary>
 28    /// Emits the complete partial record declaration and forwarding constructor.
 29    /// </summary>
 30    internal static string GenerateSource(
 31        RecordConstructorOverloadModel model,
 32        string assemblyName,
 33        BreadcrumbWriter breadcrumbs)
 34    {
 1635        var builder = new StringBuilder();
 36
 1637        breadcrumbs.WriteFileHeader(
 1638            builder,
 1639            assemblyName,
 1640            $"Generated record constructor overload for {model.ContainingTypeName}{model.TypeParameterList}");
 1641        builder.AppendLine("#nullable enable");
 1642        builder.AppendLine();
 43
 1644        if (model.ContainingNamespace.Length > 0)
 45        {
 1646            builder.AppendLine($"namespace {model.ContainingNamespace};");
 1647            builder.AppendLine();
 48        }
 49
 1650        breadcrumbs.WriteInlineComment(
 1651            builder,
 1652            string.Empty,
 1653            $"Constructor overload generated from {model.PropertyParameters.Length} marked property parameter(s)");
 1654        builder.AppendLine(
 1655            $"partial record class {model.EscapedContainingTypeName}{model.TypeParameterList}");
 1656        builder.AppendLine("{");
 1657        builder.AppendLine("    /// <summary>");
 1658        builder.AppendLine(
 1659            $"    /// Initializes a new instance of the <see cref=\"{model.EscapedContainingTypeName}{ToCrefTypeParamete
 1660        builder.AppendLine("    /// </summary>");
 61
 8462        foreach (var parameter in model.PrimaryParameters)
 63        {
 2664            builder.AppendLine(
 2665                $"    /// <param name=\"{parameter.Name}\">{parameter.Documentation}</param>");
 66        }
 67
 7268        foreach (var parameter in model.PropertyParameters)
 69        {
 2070            builder.AppendLine(
 2071                $"    /// <param name=\"{parameter.PropertyName}\">{parameter.Documentation}</param>");
 72        }
 73
 1674        ConstructorGuardCodeGenerator.WriteExceptionDocumentation(
 1675            builder,
 1676            model.PropertyParameters
 2077                .Select(parameter => parameter.PropertyName)
 1678                .ToArray(),
 1679            model.PropertyParameters
 2080                .Select(parameter => parameter.EffectiveGuards)
 1681                .ToArray(),
 1682            "    ");
 83
 1684        var parameters = model.PrimaryParameters
 1685            .Select(parameter =>
 2686                $"{parameter.TypeName} {parameter.EscapedName}")
 1687            .Concat(model.PropertyParameters.Select(parameter =>
 3688                $"{parameter.TypeName} {parameter.EscapedPropertyName}"));
 1689        builder.AppendLine(
 1690            $"    public {model.EscapedContainingTypeName}({string.Join(", ", parameters)})");
 91
 1692        var forwardedArguments = string.Join(
 1693            ", ",
 1694            model.PrimaryParameters.Select(parameter =>
 4295                parameter.EscapedName));
 1696        builder.AppendLine($"        : this({forwardedArguments})");
 1697        builder.AppendLine("    {");
 98
 1699        var emittedGuard = false;
 72100        foreach (var parameter in model.PropertyParameters)
 101        {
 54102            foreach (var guard in parameter.EffectiveGuards)
 103            {
 7104                builder.AppendLine(
 7105                    $"        {ConstructorGuardCodeGenerator.BuildGuardCall(guard, parameter.EscapedPropertyName)}");
 7106                emittedGuard = true;
 107            }
 108        }
 109
 16110        if (emittedGuard)
 5111            builder.AppendLine();
 112
 72113        foreach (var parameter in model.PropertyParameters)
 114        {
 20115            builder.AppendLine(
 20116                $"        this.{parameter.EscapedPropertyName} = {parameter.EscapedPropertyName};");
 117        }
 118
 16119        builder.AppendLine("    }");
 16120        builder.AppendLine("}");
 121
 16122        return builder.ToString();
 123    }
 124
 125    private static string ToCrefTypeParameterList(string typeParameterList)
 126    {
 16127        if (typeParameterList.Length == 0)
 14128            return string.Empty;
 129
 2130        return typeParameterList.Replace('<', '{').Replace('>', '}');
 131    }
 132}