diff options
Diffstat (limited to 'src/StardewModdingAPI.AssemblyRewriters')
3 files changed, 45 insertions, 1 deletions
diff --git a/src/StardewModdingAPI.AssemblyRewriters/IMethodRewriter.cs b/src/StardewModdingAPI.AssemblyRewriters/IMethodRewriter.cs new file mode 100644 index 00000000..5cbb7e0d --- /dev/null +++ b/src/StardewModdingAPI.AssemblyRewriters/IMethodRewriter.cs @@ -0,0 +1,21 @@ +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace StardewModdingAPI.AssemblyRewriters +{ + /// <summary>Rewrites a method for compatibility.</summary> + public interface IMethodRewriter + { + /// <summary>Get whether the given method reference can be rewritten.</summary> + /// <param name="methodRef">The method reference.</param> + bool ShouldRewrite(MethodReference methodRef); + + /// <summary>Rewrite a method for compatibility.</summary> + /// <param name="module">The module being rewritten.</param> + /// <param name="cil">The CIL rewriter.</param> + /// <param name="callOp">The instruction which calls the method.</param> + /// <param name="methodRef">The method reference invoked by the <paramref name="callOp"/>.</param> + /// <param name="assemblyMap">Metadata for mapping assemblies to the current platform.</param> + void Rewrite(ModuleDefinition module, ILProcessor cil, Instruction callOp, MethodReference methodRef, PlatformAssemblyMap assemblyMap); + } +} diff --git a/src/StardewModdingAPI.AssemblyRewriters/PlatformAssemblyMap.cs b/src/StardewModdingAPI.AssemblyRewriters/PlatformAssemblyMap.cs index c0855719..f2826080 100644 --- a/src/StardewModdingAPI.AssemblyRewriters/PlatformAssemblyMap.cs +++ b/src/StardewModdingAPI.AssemblyRewriters/PlatformAssemblyMap.cs @@ -1,4 +1,7 @@ +using System.Collections.Generic; +using System.Linq; using System.Reflection; +using Mono.Cecil; namespace StardewModdingAPI.AssemblyRewriters { @@ -8,6 +11,9 @@ namespace StardewModdingAPI.AssemblyRewriters /********* ** Accessors *********/ + /**** + ** Data + ****/ /// <summary>The target game platform.</summary> public readonly Platform TargetPlatform; @@ -15,8 +21,19 @@ namespace StardewModdingAPI.AssemblyRewriters public readonly string[] RemoveNames; /// <summary>The assembly filenames to target. Equivalent types should be rewritten to use these assemblies.</summary> + + /**** + ** Metadata + ****/ + /// <summary>The assemblies to target. Equivalent types should be rewritten to use these assemblies.</summary> public readonly Assembly[] Targets; + /// <summary>An assembly => reference cache.</summary> + public readonly IDictionary<Assembly, AssemblyNameReference> TargetReferences; + + /// <summary>An assembly => module cache.</summary> + public readonly IDictionary<Assembly, ModuleDefinition> TargetModules; + /********* ** Public methods @@ -27,9 +44,14 @@ namespace StardewModdingAPI.AssemblyRewriters /// <param name="targetAssemblies">The assemblies to target.</param> public PlatformAssemblyMap(Platform targetPlatform, string[] removeAssemblyNames, Assembly[] targetAssemblies) { + // save data this.TargetPlatform = targetPlatform; this.RemoveNames = removeAssemblyNames; + + // cache assembly metadata this.Targets = targetAssemblies; + this.TargetReferences = this.Targets.ToDictionary(assembly => assembly, assembly => AssemblyNameReference.Parse(assembly.FullName)); + this.TargetModules = this.Targets.ToDictionary(assembly => assembly, assembly => ModuleDefinition.ReadModule(assembly.Modules.Single().FullyQualifiedName)); } } -}
\ No newline at end of file +} diff --git a/src/StardewModdingAPI.AssemblyRewriters/StardewModdingAPI.AssemblyRewriters.csproj b/src/StardewModdingAPI.AssemblyRewriters/StardewModdingAPI.AssemblyRewriters.csproj index d87a48bc..b2533566 100644 --- a/src/StardewModdingAPI.AssemblyRewriters/StardewModdingAPI.AssemblyRewriters.csproj +++ b/src/StardewModdingAPI.AssemblyRewriters/StardewModdingAPI.AssemblyRewriters.csproj @@ -71,6 +71,7 @@ <Compile Include="..\GlobalAssemblyInfo.cs"> <Link>Properties\GlobalAssemblyInfo.cs</Link> </Compile> + <Compile Include="IMethodRewriter.cs" /> <Compile Include="Platform.cs" /> <Compile Include="PlatformAssemblyMap.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> |