< Summary

Information
Class: NexusLabs.Needlr.Generators.Helpers.StringHelpers
Assembly: NexusLabs.Needlr.Generators
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Generators/Helpers/StringHelpers.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 27
Coverable lines: 27
Total lines: 107
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
EscapeStringLiteral(...)100%210%
EscapeVerbatimStringLiteral(...)100%210%
EscapeXmlContent(...)100%210%
GetSimpleTypeName(...)0%2040%
ToCamelCase(...)0%620%
StripGlobalPrefix(...)0%620%
ExtractGenericTypeArgument(...)0%4260%
GetGenericBaseName(...)0%2040%
GetProxyTypeName(...)100%210%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Generators/Helpers/StringHelpers.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace NexusLabs.Needlr.Generators.Helpers;
 4
 5/// <summary>
 6/// Helper methods for string manipulation and escaping.
 7/// </summary>
 8internal static class StringHelpers
 9{
 10    /// <summary>
 11    /// Escapes a string for use in a regular C# string literal (quoted string).
 12    /// </summary>
 13    public static string EscapeStringLiteral(string value)
 14    {
 015        return value.Replace("\\", "\\\\").Replace("\"", "\\\"");
 16    }
 17
 18    /// <summary>
 19    /// Escapes a string for use in a C# verbatim string literal (@"...").
 20    /// </summary>
 21    public static string EscapeVerbatimStringLiteral(string value)
 22    {
 23        // In verbatim strings, only quotes need escaping (doubled)
 024        return value.Replace("\"", "\"\"");
 25    }
 26
 27    /// <summary>
 28    /// Escapes content for use in XML documentation comments.
 29    /// </summary>
 30    public static string EscapeXmlContent(string content)
 31    {
 032        return content
 033            .Replace("&", "&amp;")
 034            .Replace("<", "&lt;")
 035            .Replace(">", "&gt;");
 36    }
 37
 38    /// <summary>
 39    /// Gets the simple type name without namespace or generic markers.
 40    /// </summary>
 41    public static string GetSimpleTypeName(string fullyQualifiedName)
 42    {
 043        var name = fullyQualifiedName.Replace("global::", "");
 044        var lastDot = name.LastIndexOf('.');
 045        var simpleName = lastDot >= 0 ? name.Substring(lastDot + 1) : name;
 46
 47        // Remove generic suffix if present
 048        var genericIndex = simpleName.IndexOf('<');
 049        return genericIndex >= 0 ? simpleName.Substring(0, genericIndex) : simpleName;
 50    }
 51
 52    /// <summary>
 53    /// Converts a PascalCase name to camelCase.
 54    /// </summary>
 55    public static string ToCamelCase(string name)
 56    {
 057        if (string.IsNullOrEmpty(name)) return name;
 058        return char.ToLowerInvariant(name[0]) + name.Substring(1);
 59    }
 60
 61    /// <summary>
 62    /// Removes the global:: prefix from a type name if present.
 63    /// </summary>
 64    public static string StripGlobalPrefix(string name)
 65    {
 066        return name.StartsWith("global::") ? name.Substring(8) : name;
 67    }
 68
 69    /// <summary>
 70    /// Extracts the generic type argument from a generic type name.
 71    /// E.g., "IHandler&lt;Order&gt;" returns "Order".
 72    /// </summary>
 73    public static string ExtractGenericTypeArgument(string genericTypeName)
 74    {
 075        var start = genericTypeName.IndexOf('<');
 076        var end = genericTypeName.LastIndexOf('>');
 077        if (start < 0 || end < 0 || end <= start)
 078            return genericTypeName;
 079        return genericTypeName.Substring(start + 1, end - start - 1);
 80    }
 81
 82    /// <summary>
 83    /// Gets the base name of a generic type (before the generic marker).
 84    /// E.g., "LoggingDecorator`1" returns "LoggingDecorator".
 85    /// </summary>
 86    public static string GetGenericBaseName(string typeName)
 87    {
 088        var backtickIndex = typeName.IndexOf('`');
 089        if (backtickIndex > 0)
 090            return typeName.Substring(0, backtickIndex);
 91
 092        var angleBracketIndex = typeName.IndexOf('<');
 093        if (angleBracketIndex > 0)
 094            return typeName.Substring(0, angleBracketIndex);
 95
 096        return typeName;
 97    }
 98
 99    /// <summary>
 100    /// Gets the proxy type name for an intercepted service.
 101    /// E.g., "global::MyApp.MyService" returns "MyService_InterceptorProxy".
 102    /// </summary>
 103    public static string GetProxyTypeName(string fullyQualifiedTypeName)
 104    {
 0105        return GetSimpleTypeName(fullyQualifiedTypeName) + "_InterceptorProxy";
 106    }
 107}