diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-03-12 01:15:01 -0500 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-03-12 01:15:01 -0500 |
commit | b0fab4a0764d4cd1eb807db88e704aa401e4f716 (patch) | |
tree | 1049763de594bc1e56997c85545f4173164be343 /src/StardewModdingAPI/Framework | |
parent | 3663f70603fae8ed34e1e0c7500adc2c899312a5 (diff) | |
download | SMAPI-b0fab4a0764d4cd1eb807db88e704aa401e4f716.tar.gz SMAPI-b0fab4a0764d4cd1eb807db88e704aa401e4f716.tar.bz2 SMAPI-b0fab4a0764d4cd1eb807db88e704aa401e4f716.zip |
log rewritten instructions (#247)
Diffstat (limited to 'src/StardewModdingAPI/Framework')
-rw-r--r-- | src/StardewModdingAPI/Framework/AssemblyLoader.cs | 26 |
1 files changed, 22 insertions, 4 deletions
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<string> loggedRewrites = new HashSet<string>(); // 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 ); } + + /// <summary>Log a message for the player or developer the first time it occurs.</summary> + /// <param name="monitor">The monitor through which to log the message.</param> + /// <param name="hash">The hash of logged messages.</param> + /// <param name="message">The message to log.</param> + /// <param name="level">The log severity level.</param> + private void LogOnce(IMonitor monitor, HashSet<string> hash, string message, LogLevel level = LogLevel.Trace) + { + if (!hash.Contains(message)) + { + this.Monitor.Log(message, level); + hash.Add(message); + } + } } } |