summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/ModLoading/RewriteHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework/ModLoading/RewriteHelper.cs')
-rw-r--r--src/SMAPI/Framework/ModLoading/RewriteHelper.cs67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/ModLoading/RewriteHelper.cs b/src/SMAPI/Framework/ModLoading/RewriteHelper.cs
index d9a49cfa..553679f9 100644
--- a/src/SMAPI/Framework/ModLoading/RewriteHelper.cs
+++ b/src/SMAPI/Framework/ModLoading/RewriteHelper.cs
@@ -42,6 +42,10 @@ namespace StardewModdingAPI.Framework.ModLoading
/// <param name="reference">The type reference.</param>
public static bool IsSameType(Type type, TypeReference reference)
{
+ //
+ // duplicated by IsSameType(TypeReference, TypeReference) below
+ //
+
// same namespace & name
if (type.Namespace != reference.Namespace || type.Name != reference.Name)
return false;
@@ -66,6 +70,39 @@ namespace StardewModdingAPI.Framework.ModLoading
return true;
}
+ /// <summary>Get whether a type matches a type reference.</summary>
+ /// <param name="type">The defined type.</param>
+ /// <param name="reference">The type reference.</param>
+ public static bool IsSameType(TypeReference type, TypeReference reference)
+ {
+ //
+ // duplicated by IsSameType(Type, TypeReference) above
+ //
+
+ // same namespace & name
+ if (type.Namespace != reference.Namespace || type.Name != reference.Name)
+ return false;
+
+ // same generic parameters
+ if (type.IsGenericInstance)
+ {
+ if (!reference.IsGenericInstance)
+ return false;
+
+ TypeReference[] defGenerics = ((GenericInstanceType)type).GenericArguments.ToArray();
+ TypeReference[] refGenerics = ((GenericInstanceType)reference).GenericArguments.ToArray();
+ if (defGenerics.Length != refGenerics.Length)
+ return false;
+ for (int i = 0; i < defGenerics.Length; i++)
+ {
+ if (!RewriteHelper.IsSameType(defGenerics[i], refGenerics[i]))
+ return false;
+ }
+ }
+
+ return true;
+ }
+
/// <summary>Determine whether two type IDs look like the same type, accounting for placeholder values such as !0.</summary>
/// <param name="typeA">The type ID to compare.</param>
/// <param name="typeB">The other type ID to compare.</param>
@@ -80,6 +117,10 @@ namespace StardewModdingAPI.Framework.ModLoading
/// <param name="reference">The method reference.</param>
public static bool HasMatchingSignature(MethodInfo definition, MethodReference reference)
{
+ //
+ // duplicated by HasMatchingSignature(MethodDefinition, MethodReference) below
+ //
+
// same name
if (definition.Name != reference.Name)
return false;
@@ -97,6 +138,32 @@ namespace StardewModdingAPI.Framework.ModLoading
return true;
}
+ /// <summary>Get whether a method definition matches the signature expected by a method reference.</summary>
+ /// <param name="definition">The method definition.</param>
+ /// <param name="reference">The method reference.</param>
+ public static bool HasMatchingSignature(MethodDefinition definition, MethodReference reference)
+ {
+ //
+ // duplicated by HasMatchingSignature(MethodInfo, MethodReference) above
+ //
+
+ // same name
+ if (definition.Name != reference.Name)
+ return false;
+
+ // same arguments
+ ParameterDefinition[] definitionParameters = definition.Parameters.ToArray();
+ ParameterDefinition[] referenceParameters = reference.Parameters.ToArray();
+ if (referenceParameters.Length != definitionParameters.Length)
+ return false;
+ for (int i = 0; i < referenceParameters.Length; i++)
+ {
+ if (!RewriteHelper.IsSameType(definitionParameters[i].ParameterType, referenceParameters[i].ParameterType))
+ return false;
+ }
+ return true;
+ }
+
/// <summary>Get whether a type has a method whose signature matches the one expected by a method reference.</summary>
/// <param name="type">The type to check.</param>
/// <param name="reference">The method reference.</param>