diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-04-19 19:14:53 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-04-19 19:14:53 -0400 |
commit | 5c819662f88cd7004a85ac0d0e30a79b5dc4be37 (patch) | |
tree | bb1e988ffd903860f20c22818b1d142e8e40f9e5 | |
parent | e6c696fa6b0bfe5ef013e1179765ce1dcb071c38 (diff) | |
download | SMAPI-5c819662f88cd7004a85ac0d0e30a79b5dc4be37.tar.gz SMAPI-5c819662f88cd7004a85ac0d0e30a79b5dc4be37.tar.bz2 SMAPI-5c819662f88cd7004a85ac0d0e30a79b5dc4be37.zip |
suppress some duplicate deprecation notices
-rw-r--r-- | src/SMAPI/Framework/Content/AssetInfo.cs | 14 | ||||
-rw-r--r-- | src/SMAPI/Framework/Deprecations/DeprecationManager.cs | 42 |
2 files changed, 38 insertions, 18 deletions
diff --git a/src/SMAPI/Framework/Content/AssetInfo.cs b/src/SMAPI/Framework/Content/AssetInfo.cs index c632249d..363fffb3 100644 --- a/src/SMAPI/Framework/Content/AssetInfo.cs +++ b/src/SMAPI/Framework/Content/AssetInfo.cs @@ -36,7 +36,12 @@ namespace StardewModdingAPI.Framework.Content source: SCore.DeprecationManager.GetModFromStack(), nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetName)}", version: "3.14.0", - severity: DeprecationLevel.Notice + severity: DeprecationLevel.Notice, + unlessStackIncludes: new[] + { + $"{typeof(AssetInterceptorChange).FullName}.{nameof(AssetInterceptorChange.CanIntercept)}", + $"{typeof(ContentCoordinator).FullName}.{nameof(ContentCoordinator.GetAssetOperations)}" + } ); return this.NameWithoutLocale.Name; @@ -72,7 +77,12 @@ namespace StardewModdingAPI.Framework.Content source: SCore.DeprecationManager.GetModFromStack(), nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetNameEquals)}", version: "3.14.0", - severity: DeprecationLevel.Notice + severity: DeprecationLevel.Notice, + unlessStackIncludes: new[] + { + $"{typeof(AssetInterceptorChange).FullName}.{nameof(AssetInterceptorChange.CanIntercept)}", + $"{typeof(ContentCoordinator).FullName}.{nameof(ContentCoordinator.GetAssetOperations)}" + } ); diff --git a/src/SMAPI/Framework/Deprecations/DeprecationManager.cs b/src/SMAPI/Framework/Deprecations/DeprecationManager.cs index 84ce2132..5ca07702 100644 --- a/src/SMAPI/Framework/Deprecations/DeprecationManager.cs +++ b/src/SMAPI/Framework/Deprecations/DeprecationManager.cs @@ -56,15 +56,21 @@ namespace StardewModdingAPI.Framework.Deprecations /// <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 void Warn(IModMetadata? source, string nounPhrase, string version, DeprecationLevel severity) + /// <param name="unlessStackIncludes">A list of stack trace substrings which should suppress deprecation warnings if they appear in the stack trace.</param> + public void Warn(IModMetadata? source, string nounPhrase, string version, DeprecationLevel severity, string[]? unlessStackIncludes = null) { - // ignore if already warned - if (!this.MarkWarned(source, nounPhrase, version)) + // skip if already warned + string cacheKey = $"{source?.DisplayName ?? "<unknown>"}::{nounPhrase}::{version}"; + if (this.LoggedDeprecations.Contains(cacheKey)) return; - // queue warning + // warn if valid ImmutableStackTrace stack = ImmutableStackTrace.Get(skipFrames: 1); - this.QueuedWarnings.Add(new DeprecationWarning(source, nounPhrase, version, severity, stack)); + if (!this.ShouldSuppress(stack, unlessStackIncludes)) + { + this.LoggedDeprecations.Add(cacheKey); + this.QueuedWarnings.Add(new DeprecationWarning(source, nounPhrase, version, severity, stack)); + } } /// <summary>A placeholder method used to track deprecated code for which a separate warning will be shown.</summary> @@ -117,18 +123,22 @@ namespace StardewModdingAPI.Framework.Deprecations /********* ** Private methods *********/ - /// <summary>Mark a deprecation warning as already logged.</summary> - /// <param name="source">The mod which used the deprecated code.</param> - /// <param name="nounPhrase">A noun phrase describing what is deprecated (e.g. "the Extensions.AsInt32 method").</param> - /// <param name="version">The SMAPI version which deprecated it.</param> - /// <returns>Returns whether the deprecation was successfully marked as warned. Returns <c>false</c> if it was already marked.</returns> - private bool MarkWarned(IModMetadata? source, string nounPhrase, string version) + /// <summary>Get whether a deprecation warning should be suppressed.</summary> + /// <param name="stack">The stack trace for which it was raised.</param> + /// <param name="unlessStackIncludes">A list of stack trace substrings which should suppress deprecation warnings if they appear in the stack trace.</param> + private bool ShouldSuppress(ImmutableStackTrace stack, string[]? unlessStackIncludes) { - string key = $"{source?.DisplayName ?? "<unknown>"}::{nounPhrase}::{version}"; - if (this.LoggedDeprecations.Contains(key)) - return false; - this.LoggedDeprecations.Add(key); - return true; + if (unlessStackIncludes?.Any() == true) + { + string stackTrace = stack.ToString(); + foreach (string method in unlessStackIncludes) + { + if (stackTrace.Contains(method)) + return true; + } + } + + return false; } /// <summary>Get the simplest stack trace which shows where in the mod the deprecated code was called from.</summary> |