Files
TheDeclineOfWarriors/Packages/jp.hadashikick.vcontainer/Runtime/Diagnostics/RegisterInfo.cs
T
2026-04-07 04:51:37 +07:00

119 lines
3.7 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Security;
using System.Threading;
namespace VContainer.Diagnostics
{
public sealed class RegisterInfo
{
static bool displayFileNames = true;
static int idSeed;
public int Id { get; }
public RegistrationBuilder RegistrationBuilder { get; }
public StackTrace StackTrace { get; }
StackFrame headLineStackFrame;
internal string formattedStackTrace = default; // cache field for internal use(Unity Editor, etc...)
public RegisterInfo(RegistrationBuilder registrationBuilder)
{
Id = Interlocked.Increment(ref idSeed);
RegistrationBuilder = registrationBuilder;
StackTrace = new StackTrace(true);
headLineStackFrame = GetHeadlineFrame(StackTrace);
}
public string GetFilename()
{
if (headLineStackFrame != null && displayFileNames && headLineStackFrame.GetILOffset() != -1)
{
try
{
return headLineStackFrame.GetFileName();
}
catch (NotSupportedException)
{
displayFileNames = false;
}
catch (SecurityException)
{
displayFileNames = false;
}
}
return null;
}
public int GetFileLineNumber()
{
if (headLineStackFrame != null && displayFileNames && headLineStackFrame.GetILOffset() != -1)
{
try
{
return headLineStackFrame.GetFileLineNumber();
}
catch (NotSupportedException)
{
displayFileNames = false;
}
catch (SecurityException)
{
displayFileNames = false;
}
}
return -1;
}
public string GetScriptAssetPath()
{
var filename = GetFilename();
if (filename == null)
return "";
var prefixIndex = filename.LastIndexOf("Assets/");
return prefixIndex > 0 ? filename.Substring(prefixIndex) : "";
}
public string GetHeadline()
{
if (headLineStackFrame == null)
return "";
var method = headLineStackFrame.GetMethod();
var filename = GetFilename();
if (filename != null)
{
var lineNumber = GetFileLineNumber();
return $"{method.DeclaringType?.FullName}.{method.Name} (at {Path.GetFileName(filename)}:{lineNumber})";
}
var ilOffset = headLineStackFrame.GetILOffset();
if (ilOffset != -1)
{
return $"{method.DeclaringType?.FullName}.{method.Name}(offset: {ilOffset})";
}
return $"{method.DeclaringType?.FullName}.{method.Name}";
}
StackFrame GetHeadlineFrame(StackTrace stackTrace)
{
for (var i = 0; i < stackTrace.FrameCount; i++)
{
var sf = stackTrace.GetFrame(i);
if (sf == null) continue;
var m = sf.GetMethod();
if (m == null) continue;
if (m.DeclaringType == null) continue;
if (m.DeclaringType.Namespace == null || !m.DeclaringType.Namespace.StartsWith("VContainer"))
{
return sf;
}
}
return stackTrace.FrameCount > 0 ? stackTrace.GetFrame(0) : null;
}
}
}