From b0fab4a0764d4cd1eb807db88e704aa401e4f716 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 12 Mar 2017 01:15:01 -0500 Subject: log rewritten instructions (#247) --- src/StardewModdingAPI/Framework/AssemblyLoader.cs | 26 +++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src/StardewModdingAPI/Framework') diff --git a/src/StardewModdingAPI/Framework/AssemblyLoader.cs b/src/StardewModdingAPI/Framework/AssemblyLoader.cs index eb5d1cf4..8af67772 100644 --- a/src/StardewModdingAPI/Framework/AssemblyLoader.cs +++ b/src/StardewModdingAPI/Framework/AssemblyLoader.cs @@ -162,6 +162,7 @@ namespace StardewModdingAPI.Framework private bool RewriteAssembly(AssemblyDefinition assembly) { ModuleDefinition module = assembly.MainModule; + HashSet loggedRewrites = new HashSet(); // swap assembly references if needed (e.g. XNA => MonoGame) bool platformChanged = false; @@ -170,6 +171,7 @@ namespace StardewModdingAPI.Framework // remove old assembly reference if (this.AssemblyMap.RemoveNames.Any(name => module.AssemblyReferences[i].Name == name)) { + this.LogOnce(this.Monitor, loggedRewrites, $"Rewriting {assembly.Name.Name} for OS..."); platformChanged = true; module.AssemblyReferences.RemoveAt(i); i--; @@ -197,14 +199,16 @@ namespace StardewModdingAPI.Framework if (!canRewrite) continue; - // prepare method - ILProcessor cil = method.Body.GetILProcessor(); - // rewrite instructions + ILProcessor cil = method.Body.GetILProcessor(); foreach (Instruction op in cil.Body.Instructions.ToArray()) { IInstructionRewriter rewriter = rewriters.FirstOrDefault(p => p.IsMatch(op, platformChanged)); - rewriter?.Rewrite(module, cil, op, this.AssemblyMap); + if (rewriter != null) + { + this.LogOnce(this.Monitor, loggedRewrites, $"Rewriting {assembly.Name.Name} to fix {rewriter.NounPhrase}..."); + rewriter.Rewrite(module, cil, op, this.AssemblyMap); + } } // finalise method @@ -244,5 +248,19 @@ namespace StardewModdingAPI.Framework select method ); } + + /// Log a message for the player or developer the first time it occurs. + /// The monitor through which to log the message. + /// The hash of logged messages. + /// The message to log. + /// The log severity level. + private void LogOnce(IMonitor monitor, HashSet hash, string message, LogLevel level = LogLevel.Trace) + { + if (!hash.Contains(message)) + { + this.Monitor.Log(message, level); + hash.Add(message); + } + } } } -- cgit