Now that we generate methods in instantiated generic types, we were getting test failures from methods that were being detected as new methods. In actuality, they weren't new, but they differed only in generic type parameters from some base type method, and GetSignatureString ignores generic parameters completely. This fix eliminates the hacky GetSignatureString and replaces it with more-or-less proper signature comparison. This even manages to fix an incorrect test case from Methods.cs (because GetSignatureString was incorrectly incorporating the return type - when the return type should not be examined for signature checking).
46 lines
2.0 KiB
C#
46 lines
2.0 KiB
C#
/*
|
|
Copyright 2017-2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
|
|
|
All rights reserved.
|
|
*/
|
|
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
namespace Il2CppInspector.Reflection
|
|
{
|
|
public class MethodInfo : MethodBase
|
|
{
|
|
public override MemberTypes MemberType => MemberTypes.Method;
|
|
|
|
// Info about the return parameter
|
|
public ParameterInfo ReturnParameter { get; }
|
|
|
|
// Return type of the method
|
|
public TypeInfo ReturnType => ReturnParameter.ParameterType;
|
|
|
|
public override bool RequiresUnsafeContext => base.RequiresUnsafeContext || ReturnType.RequiresUnsafeContext;
|
|
|
|
// IL2CPP doesn't seem to retain return type custom attributes
|
|
|
|
public MethodInfo(Il2CppInspector pkg, int methodIndex, TypeInfo declaringType) : base(pkg, methodIndex, declaringType) {
|
|
// Add return parameter
|
|
ReturnParameter = new ParameterInfo(pkg, -1, this);
|
|
}
|
|
|
|
public MethodInfo(MethodInfo methodDef, TypeInfo declaringType) : base(methodDef, declaringType) {
|
|
ReturnParameter = ((MethodInfo)rootDefinition).ReturnParameter
|
|
.SubstituteGenericArguments(this, DeclaringType.GetGenericArguments(), GetGenericArguments());
|
|
}
|
|
|
|
private MethodInfo(MethodInfo methodDef, TypeInfo[] typeArguments) : base(methodDef, typeArguments) {
|
|
ReturnParameter = ((MethodInfo)rootDefinition).ReturnParameter
|
|
.SubstituteGenericArguments(this, DeclaringType.GetGenericArguments(), GetGenericArguments());
|
|
}
|
|
|
|
protected override MethodBase MakeGenericMethodImpl(TypeInfo[] typeArguments) => new MethodInfo(this, typeArguments);
|
|
|
|
public override string ToString() => ReturnType.Name + " " + Name + GetFullTypeParametersString() + "(" + string.Join(", ",
|
|
DeclaredParameters.Select(x => x.ParameterType.IsByRef? x.ParameterType.Name.TrimEnd('&') + " ByRef" : x.ParameterType.Name)) + ")";
|
|
}
|
|
} |