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);
}