< Summary

Information
Class: Hertzole.ScriptableValues.Generator.Naming
Assembly: Hertzole.ScriptableValues.Generator
File(s): Generator/Hertzole.ScriptableValues.Generator/Helpers/Naming.cs
Tag: 52_28197466029
Line coverage
100%
Covered lines: 43
Uncovered lines: 0
Coverable lines: 43
Total lines: 118
Line coverage: 100%
Branch coverage
97%
Covered branches: 36
Total branches: 37
Branch coverage: 97.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
FormatVariableName(...)100%11100%
RemovePrefix(...)100%88100%
UppercaseStart(...)100%44100%
CreateCallbackName(...)100%99100%
AppendFlagSuffix(...)100%66100%
StartsWithOn(...)90%1010100%

File(s)

Generator/Hertzole.ScriptableValues.Generator/Helpers/Naming.cs

#LineLine coverage
 1using System;
 2using System.Buffers;
 3
 4namespace Hertzole.ScriptableValues.Generator;
 5
 6internal static class Naming
 7{
 8    public static ReadOnlySpan<char> FormatVariableName(ReadOnlySpan<char> value)
 9    {
 35110        value = RemovePrefix(value);
 35111        value = UppercaseStart(value);
 12
 35113        return value;
 14    }
 15
 16    private static ReadOnlySpan<char> RemovePrefix(ReadOnlySpan<char> value)
 17    {
 35118        if (value.Length > 2 && value[1] == '_')
 19        {
 820            return value.Slice(2);
 21        }
 22
 34323        if (value.Length > 1 && value[0] == '_')
 24        {
 125            return value.Slice(1);
 26        }
 27
 34228        return value;
 29    }
 30
 31    private static ReadOnlySpan<char> UppercaseStart(ReadOnlySpan<char> value)
 32    {
 35133        if (value.Length == 0)
 34        {
 135            return value;
 36        }
 37
 35038        if (value[0] == char.ToUpperInvariant(value[0]))
 39        {
 30840            return value;
 41        }
 42
 4243        char[] newValue = ArrayPool<char>.Shared.Rent(value.Length);
 44        try
 45        {
 4246            value.CopyTo(newValue);
 47
 4248            newValue[0] = char.ToUpperInvariant(value[0]);
 49
 4250            return new ReadOnlySpan<char>(newValue, 0, value.Length);
 51        }
 52        finally
 53        {
 4254            ArrayPool<char>.Shared.Return(newValue);
 4255        }
 4256    }
 57
 58    public static string CreateCallbackName(string name, in ScriptableType scriptableType, in CallbackFlags flags)
 59    {
 34560        using ArrayBuilder<char> builder = new ArrayBuilder<char>(32);
 61
 34562        ReadOnlySpan<char> prettyName = FormatVariableName(name.AsSpan());
 63
 34564        if (StartsWithOn(prettyName))
 65        {
 66            // If it starts with "on", just uppercase the O and keep the rest.
 667            builder.Add('O');
 668            builder.AddRange(prettyName.Slice(1));
 69        }
 70        else
 71        {
 33972            builder.AddRange("On");
 33973            builder.AddRange(prettyName);
 74        }
 75
 34576        switch (scriptableType)
 77        {
 78            case ScriptableType.Value:
 3379                AppendFlagSuffix(in builder, in scriptableType, in flags);
 3380                break;
 81            case ScriptableType.Event:
 82            case ScriptableType.GenericEvent:
 30383                builder.AddRange("Invoked");
 30384                break;
 85            case ScriptableType.Pool:
 86            case ScriptableType.List:
 87            case ScriptableType.Dictionary:
 888                builder.AddRange("Changed");
 889                break;
 90            default:
 191                throw new ArgumentOutOfRangeException();
 92        }
 93
 34494        return builder.ToString();
 34495    }
 96
 97    public static void AppendFlagSuffix(in ArrayBuilder<char> builder, in ScriptableType type, in CallbackFlags flags)
 98    {
 45399        if (type == ScriptableType.Value)
 100        {
 158101            if ((flags & CallbackFlags.PostInvoke) != 0)
 102            {
 106103                builder.AddRange("Changed");
 104            }
 52105            else if ((flags & CallbackFlags.PreInvoke) != 0)
 106            {
 52107                builder.AddRange("Changing");
 108            }
 109        }
 347110    }
 111
 112    private static bool StartsWithOn(ReadOnlySpan<char> value)
 113    {
 114        // Check if it starts with "on" or "On" and the third character is uppercase.
 115        // Checking the third character ensures we don't match words like "only" or "once".
 345116        return value.Length >= 3 && (value[0] == 'o' || value[0] == 'O') && (value[1] == 'n' || value[1] == 'N') && char
 117    }
 118}