rewrite AccessTools methods which changed in Harmony 2.0 (#711)

This commit is contained in:
Jesse Plamondon-Willard 2020-05-10 11:50:35 -04:00
parent 1ff0968590
commit 10531e537f
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
4 changed files with 40 additions and 11 deletions

View File

@ -42,8 +42,9 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters
/// <param name="fromType">The type whose methods to remap.</param>
/// <param name="toType">The type with methods to map to.</param>
/// <param name="onlyIfPlatformChanged">Whether to only rewrite references if loading the assembly on a different platform than it was compiled on.</param>
public MethodParentRewriter(Type fromType, Type toType, bool onlyIfPlatformChanged = false)
: this(fromType.FullName, toType, onlyIfPlatformChanged) { }
/// <param name="nounPhrase">A brief noun phrase indicating what the instruction finder matches (or <c>null</c> to generate one).</param>
public MethodParentRewriter(Type fromType, Type toType, bool onlyIfPlatformChanged = false, string nounPhrase = null)
: this(fromType.FullName, toType, onlyIfPlatformChanged, nounPhrase) { }
/// <summary>Perform the predefined logic for an instruction if applicable.</summary>

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using HarmonyLib;
namespace StardewModdingAPI.Framework.RewriteFacades
{
/// <summary>Maps Harmony 1.x <see cref="AccessTools"/> methods to Harmony 2.x to avoid breaking older mods.</summary>
/// <remarks>This is public to support SMAPI rewriting and should not be referenced directly by mods.</remarks>
[SuppressMessage("ReSharper", "CS1591", Justification = "Documentation not needed for facade classes.")]
public class AccessToolsMethods
{
/*********
** Public methods
*********/
public static ConstructorInfo DeclaredConstructor(Type type, Type[] parameters = null)
{
return AccessTools.DeclaredConstructor(type, parameters, searchForStatic: true);
}
public static ConstructorInfo Constructor(Type type, Type[] parameters = null)
{
return AccessTools.Constructor(type, parameters, searchForStatic: true);
}
public static List<ConstructorInfo> GetDeclaredConstructors(Type type)
{
return AccessTools.GetDeclaredConstructors(type, searchForStatic: true);
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
@ -7,8 +8,9 @@ using HarmonyLib;
namespace StardewModdingAPI.Framework.RewriteFacades
{
/// <summary>Maps Harmony 1.x methods to Harmony 2.x to avoid breaking older mods.</summary>
/// <summary>Maps Harmony 1.x <code>HarmonyInstance</code> methods to Harmony 2.x's <see cref="Harmony"/> to avoid breaking older mods.</summary>
/// <remarks>This is public to support SMAPI rewriting and should not be referenced directly by mods.</remarks>
[SuppressMessage("ReSharper", "CS1591", Justification = "Documentation not needed for facade classes.")]
public class HarmonyInstanceMethods : Harmony
{
/*********
@ -19,18 +21,11 @@ namespace StardewModdingAPI.Framework.RewriteFacades
public HarmonyInstanceMethods(string id)
: base(id) { }
/// <summary>Creates a new Harmony instance.</summary>
/// <param name="id">A unique identifier for the instance.</param>
public static Harmony Create(string id)
{
return new Harmony(id);
}
/// <summary>Apply one or more patches to a method.</summary>
/// <param name="original">The original method.</param>
/// <param name="prefix">The prefix to apply.</param>
/// <param name="postfix">The postfix to apply.</param>
/// <param name="transpiler">The transpiler to apply.</param>
public DynamicMethod Patch(MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null, HarmonyMethod transpiler = null)
{
try

View File

@ -38,7 +38,8 @@ namespace StardewModdingAPI.Metadata
// rewrite for SMAPI 3.6 (Harmony 1.x => 2.0 update)
yield return new Harmony1AssemblyRewriter();
yield return new MethodParentRewriter("HarmonyLib.Harmony", typeof(HarmonyInstanceMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
yield return new MethodParentRewriter(typeof(HarmonyLib.Harmony), typeof(HarmonyInstanceMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
yield return new MethodParentRewriter(typeof(HarmonyLib.AccessTools), typeof(AccessToolsMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
/****
** detect mod issues