From 5c819662f88cd7004a85ac0d0e30a79b5dc4be37 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Tue, 19 Apr 2022 19:14:53 -0400 Subject: suppress some duplicate deprecation notices --- .../Framework/Deprecations/DeprecationManager.cs | 42 +++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) (limited to 'src/SMAPI/Framework/Deprecations') 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 /// A noun phrase describing what is deprecated. /// The SMAPI version which deprecated it. /// How deprecated the code is. - public void Warn(IModMetadata? source, string nounPhrase, string version, DeprecationLevel severity) + /// A list of stack trace substrings which should suppress deprecation warnings if they appear in the stack trace. + 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 ?? ""}::{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)); + } } /// A placeholder method used to track deprecated code for which a separate warning will be shown. @@ -117,18 +123,22 @@ namespace StardewModdingAPI.Framework.Deprecations /********* ** Private methods *********/ - /// Mark a deprecation warning as already logged. - /// The mod which used the deprecated code. - /// A noun phrase describing what is deprecated (e.g. "the Extensions.AsInt32 method"). - /// The SMAPI version which deprecated it. - /// Returns whether the deprecation was successfully marked as warned. Returns false if it was already marked. - private bool MarkWarned(IModMetadata? source, string nounPhrase, string version) + /// Get whether a deprecation warning should be suppressed. + /// The stack trace for which it was raised. + /// A list of stack trace substrings which should suppress deprecation warnings if they appear in the stack trace. + private bool ShouldSuppress(ImmutableStackTrace stack, string[]? unlessStackIncludes) { - string key = $"{source?.DisplayName ?? ""}::{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; } /// Get the simplest stack trace which shows where in the mod the deprecated code was called from. -- cgit