diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-03-12 17:48:53 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-03-12 17:48:53 -0400 |
commit | a12bcf3b7845b7c4541ca7539a4810a81b87e3ce (patch) | |
tree | 010e6c0d0885ec8693d6bfb8e2e076486886c330 /src/StardewModdingAPI.AssemblyRewriters/Framework | |
parent | 003a9586b287f3bd831f9dfe7ca52b9e4e03c028 (diff) | |
download | SMAPI-a12bcf3b7845b7c4541ca7539a4810a81b87e3ce.tar.gz SMAPI-a12bcf3b7845b7c4541ca7539a4810a81b87e3ce.tar.bz2 SMAPI-a12bcf3b7845b7c4541ca7539a4810a81b87e3ce.zip |
reject mods which reference obsolete SGame class (#247)
Diffstat (limited to 'src/StardewModdingAPI.AssemblyRewriters/Framework')
-rw-r--r-- | src/StardewModdingAPI.AssemblyRewriters/Framework/BaseTypeFinder.cs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/StardewModdingAPI.AssemblyRewriters/Framework/BaseTypeFinder.cs b/src/StardewModdingAPI.AssemblyRewriters/Framework/BaseTypeFinder.cs new file mode 100644 index 00000000..5a768794 --- /dev/null +++ b/src/StardewModdingAPI.AssemblyRewriters/Framework/BaseTypeFinder.cs @@ -0,0 +1,52 @@ +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace StardewModdingAPI.AssemblyRewriters.Framework +{ + /// <summary>Base class for a type reference finder.</summary> + public abstract class BaseTypeFinder : IInstructionFinder + { + /********* + ** Accessors + *********/ + /// <summary>A brief noun phrase indicating what the instruction finder matches.</summary> + public abstract string NounPhrase { get; } + + /// <summary>The full type name to match.</summary> + public abstract string FullTypeName { get; } + + + /********* + ** Public methods + *********/ + /// <summary>Get whether a CIL instruction matches.</summary> + /// <param name="instruction">The IL instruction.</param> + /// <param name="platformChanged">Whether the mod was compiled on a different platform.</param> + public virtual bool IsMatch(Instruction instruction, bool platformChanged) + { + string fullName = this.FullTypeName; + + // field reference + if (instruction.OpCode == OpCodes.Ldfld || instruction.OpCode == OpCodes.Ldsfld || instruction.OpCode == OpCodes.Stfld || instruction.OpCode == OpCodes.Stsfld) + { + FieldReference field = (FieldReference)instruction.Operand; + return + field.DeclaringType.FullName == fullName // field on target class + || field.FieldType.FullName == fullName; // field value is target class + } + + // method reference + if (instruction.OpCode == OpCodes.Call || instruction.OpCode == OpCodes.Callvirt) + { + MethodReference method = (MethodReference)instruction.Operand; + return + method.DeclaringType.FullName == fullName // method on target class + || method.ReturnType.FullName == fullName // method returns target class + || method.Parameters.Any(p => p.ParameterType.FullName == fullName); // method parameters + } + + return false; + } + } +} |