Files
Nitrox/NitroxPatcher/PatternMatching/OperandPattern.cs
2025-07-06 00:23:46 +02:00

60 lines
1.8 KiB
C#

using System;
using System.Reflection;
using JetBrains.Annotations;
namespace NitroxPatcher.PatternMatching;
public readonly record struct OperandPattern(string DeclaringClassName, string MemberName, Type[] ArgumentTypes = null)
{
public bool IsAny => this == default;
public bool IsAnyArguments => ArgumentTypes == null;
public static bool operator ==(OperandPattern pattern, [CanBeNull] object operand)
{
if (pattern.IsAny)
{
return true;
}
if (operand is MemberInfo member)
{
if (!pattern.DeclaringClassName.Equals(member.DeclaringType?.FullName, StringComparison.OrdinalIgnoreCase) || !pattern.MemberName.Equals(member.Name, StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (member is MethodInfo method)
{
if (pattern.IsAnyArguments)
{
return true;
}
ParameterInfo[] parameters = method.GetParameters();
if (parameters.Length == pattern.ArgumentTypes.Length)
{
for (int i = 0; i < parameters.Length; i++)
{
if (!parameters[i].ParameterType.IsAssignableFrom(pattern.ArgumentTypes[i]))
{
return false;
}
}
return true;
}
}
else
{
return true;
}
}
return false;
}
public static bool operator !=(OperandPattern pattern, object operand)
{
return !(pattern == operand);
}
public override string ToString() => $"{DeclaringClassName}{(MemberName == null ? "" : $".{MemberName}")}";
}