summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'src/StardewModdingAPI/Framework')
-rw-r--r--src/StardewModdingAPI/Framework/InternalExtensions.cs21
-rw-r--r--src/StardewModdingAPI/Framework/ModRegistry.cs40
2 files changed, 52 insertions, 9 deletions
diff --git a/src/StardewModdingAPI/Framework/InternalExtensions.cs b/src/StardewModdingAPI/Framework/InternalExtensions.cs
index 415785d9..c4bd2d35 100644
--- a/src/StardewModdingAPI/Framework/InternalExtensions.cs
+++ b/src/StardewModdingAPI/Framework/InternalExtensions.cs
@@ -86,5 +86,26 @@ namespace StardewModdingAPI.Framework
// anything else
return exception.ToString();
}
+
+ /****
+ ** Deprecation
+ ****/
+ /// <summary>Log a deprecation warning for mods using an event.</summary>
+ /// <param name="deprecationManager">The deprecation manager to extend.</param>
+ /// <param name="handlers">The event handlers.</param>
+ /// <param name="nounPhrase">A noun phrase describing what is deprecated.</param>
+ /// <param name="version">The SMAPI version which deprecated it.</param>
+ /// <param name="severity">How deprecated the code is.</param>
+ public static void WarnForEvent(this DeprecationManager deprecationManager, Delegate[] handlers, string nounPhrase, string version, DeprecationLevel severity)
+ {
+ if (handlers == null || !handlers.Any())
+ return;
+
+ foreach (Delegate handler in handlers)
+ {
+ string modName = Program.ModRegistry.GetModFrom(handler) ?? "an unknown mod"; // suppress stack trace for unknown mods, not helpful here
+ deprecationManager.Warn(modName, nounPhrase, version, severity);
+ }
+ }
}
}
diff --git a/src/StardewModdingAPI/Framework/ModRegistry.cs b/src/StardewModdingAPI/Framework/ModRegistry.cs
index b593142d..51ec7123 100644
--- a/src/StardewModdingAPI/Framework/ModRegistry.cs
+++ b/src/StardewModdingAPI/Framework/ModRegistry.cs
@@ -36,6 +36,34 @@ namespace StardewModdingAPI.Framework
return (from mod in this.Mods select mod);
}
+ /// <summary>Get the friendly mod name which handles a delegate.</summary>
+ /// <param name="delegate">The delegate to follow.</param>
+ /// <returns>Returns the mod name, or <c>null</c> if the delegate isn't implemented by a known mod.</returns>
+ public string GetModFrom(Delegate @delegate)
+ {
+ return @delegate?.Target != null
+ ? this.GetModFrom(@delegate.Target.GetType())
+ : null;
+ }
+
+ /// <summary>Get the friendly mod name which defines a type.</summary>
+ /// <param name="type">The type to check.</param>
+ /// <returns>Returns the mod name, or <c>null</c> if the type isn't part of a known mod.</returns>
+ public string GetModFrom(Type type)
+ {
+ // null
+ if (type == null)
+ return null;
+
+ // known type
+ string assemblyName = type.Assembly.FullName;
+ if (this.ModNamesByAssembly.ContainsKey(assemblyName))
+ return this.ModNamesByAssembly[assemblyName];
+
+ // not found
+ return null;
+ }
+
/// <summary>Get the friendly name for the closest assembly registered as a source of deprecation warnings.</summary>
/// <returns>Returns the source name, or <c>null</c> if no registered assemblies were found.</returns>
public string GetModFromStack()
@@ -49,16 +77,10 @@ namespace StardewModdingAPI.Framework
// search stack for a source assembly
foreach (StackFrame frame in frames)
{
- // get assembly name
MethodBase method = frame.GetMethod();
- Type type = method.ReflectedType;
- if (type == null)
- continue;
- string assemblyName = type.Assembly.FullName;
-
- // get name if it's a registered source
- if (this.ModNamesByAssembly.ContainsKey(assemblyName))
- return this.ModNamesByAssembly[assemblyName];
+ string name = this.GetModFrom(method.ReflectedType);
+ if (name != null)
+ return name;
}
// no known assembly found