private static SampleParsingResult ParseSampleName()

in resharper/resharper-unity/src/Unity.Rider/Common/CSharp/Daemon/Profiler/SamplesCacheUtils.cs [144:236]


    private static SampleParsingResult ParseSampleName(string sampleName)
    {
        //AssemblyName.dll!NamespaceName::ClassName.MethodName() [Invoke]
        //real examples: 
        //  Assembly-CSharp.dll!MyNamespace2::HeavyScript2.get_GetName() [Invoke]
        //  Assembly-CSharp.dll!MyNamespace2::HeavyScript2.Update() 

        // Fast path for empty or null strings
        if (string.IsNullOrEmpty(sampleName))
            return new SampleParsingResult(EmptyString, EmptyString, EmptyString);

        var slice = new StringSlice(sampleName);

        // Extract dllName
        string dllName;
        var exclamationIndex = slice.IndexOf('!');
        if (exclamationIndex < 0)
        {
            dllName = EmptyString;
        }
        else
        {
            dllName = slice.Substring(0, exclamationIndex).ToString();
            slice = slice.Substring(exclamationIndex + 1);
        }

        // Process qualifiedName
        var doubleColonIndex = slice.IndexOf("::");
        if (doubleColonIndex == 0)
        {
            // Empty namespace
            slice = slice.Substring(2);
        }
        else if (doubleColonIndex > 0)
        {
            // Replace :: with .
            using var sb = PooledStringBuilder.GetInstance();
            var startIndex = 0;

            // Pre-allocate StringBuilder capacity based on input length to avoid resizing
            // Add extra capacity for potential '.' replacements
            sb.Builder.EnsureCapacity(slice.Length + 10);

            while (true)
            {
                doubleColonIndex = slice.IndexOf("::", startIndex);
                if (doubleColonIndex < 0)
                {
                    sb.Append(slice.Substring(startIndex).ToString());
                    break;
                }

                sb.Append(slice.Substring(startIndex, doubleColonIndex - startIndex).ToString());
                sb.Append('.');
                startIndex = doubleColonIndex + 2;
            }

            slice = new StringSlice(sb.ToString());
        }

        // Use ReadOnlySpan for string comparisons to avoid allocations
        // Remove [Invoke] if present
        var invokeSpan = GetInvokeSpan();
        if (slice.Length >= invokeSpan.Length)
        {
            var sliceEnd = slice.ToString().AsSpan().Slice(slice.Length - invokeSpan.Length);
            if (sliceEnd.SequenceEqual(invokeSpan))
            {
                slice = slice.Substring(0, slice.Length - invokeSpan.Length).Trim();
            }
        }

        // Remove () if present
        var bracketsSpan = GetBracketsSpan();
        if (slice.Length >= bracketsSpan.Length)
        {
            var sliceEnd = slice.ToString().AsSpan().Slice(slice.Length - bracketsSpan.Length);
            if (sliceEnd.SequenceEqual(bracketsSpan))
            {
                slice = slice.Substring(0, slice.Length - bracketsSpan.Length);
            }
        }

        // Trim and get final qualifiedName
        slice = slice.Trim();
        var qualifiedName = slice.ToString();

        // Extract typeName
        var lastDotIndex = slice.LastIndexOf('.');
        var typeName = lastDotIndex > 0 ? slice.Substring(0, lastDotIndex).ToString() : EmptyString;

        return new SampleParsingResult(dllName, qualifiedName, typeName);
    }