first commit
This commit is contained in:
59
NitroxPatcher/PatternMatching/OperandPattern.cs
Normal file
59
NitroxPatcher/PatternMatching/OperandPattern.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
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}")}";
|
||||
}
|
Reference in New Issue
Block a user