suppress some duplicate deprecation notices

This commit is contained in:
Jesse Plamondon-Willard 2022-04-19 19:14:53 -04:00
parent e6c696fa6b
commit 5c819662f8
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
2 changed files with 38 additions and 18 deletions

View File

@ -36,7 +36,12 @@ namespace StardewModdingAPI.Framework.Content
source: SCore.DeprecationManager.GetModFromStack(), source: SCore.DeprecationManager.GetModFromStack(),
nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetName)}", nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetName)}",
version: "3.14.0", 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; return this.NameWithoutLocale.Name;
@ -72,7 +77,12 @@ namespace StardewModdingAPI.Framework.Content
source: SCore.DeprecationManager.GetModFromStack(), source: SCore.DeprecationManager.GetModFromStack(),
nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetNameEquals)}", nounPhrase: $"{nameof(IAssetInfo)}.{nameof(IAssetInfo.AssetNameEquals)}",
version: "3.14.0", version: "3.14.0",
severity: DeprecationLevel.Notice severity: DeprecationLevel.Notice,
unlessStackIncludes: new[]
{
$"{typeof(AssetInterceptorChange).FullName}.{nameof(AssetInterceptorChange.CanIntercept)}",
$"{typeof(ContentCoordinator).FullName}.{nameof(ContentCoordinator.GetAssetOperations)}"
}
); );

View File

@ -56,15 +56,21 @@ namespace StardewModdingAPI.Framework.Deprecations
/// <param name="nounPhrase">A noun phrase describing what is deprecated.</param> /// <param name="nounPhrase">A noun phrase describing what is deprecated.</param>
/// <param name="version">The SMAPI version which deprecated it.</param> /// <param name="version">The SMAPI version which deprecated it.</param>
/// <param name="severity">How deprecated the code is.</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 // skip if already warned
if (!this.MarkWarned(source, nounPhrase, version)) string cacheKey = $"{source?.DisplayName ?? "<unknown>"}::{nounPhrase}::{version}";
if (this.LoggedDeprecations.Contains(cacheKey))
return; return;
// queue warning // warn if valid
ImmutableStackTrace stack = ImmutableStackTrace.Get(skipFrames: 1); 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> /// <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 ** Private methods
*********/ *********/
/// <summary>Mark a deprecation warning as already logged.</summary> /// <summary>Get whether a deprecation warning should be suppressed.</summary>
/// <param name="source">The mod which used the deprecated code.</param> /// <param name="stack">The stack trace for which it was raised.</param>
/// <param name="nounPhrase">A noun phrase describing what is deprecated (e.g. "the Extensions.AsInt32 method").</param> /// <param name="unlessStackIncludes">A list of stack trace substrings which should suppress deprecation warnings if they appear in the stack trace.</param>
/// <param name="version">The SMAPI version which deprecated it.</param> private bool ShouldSuppress(ImmutableStackTrace stack, string[]? unlessStackIncludes)
/// <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)
{ {
string key = $"{source?.DisplayName ?? "<unknown>"}::{nounPhrase}::{version}"; if (unlessStackIncludes?.Any() == true)
if (this.LoggedDeprecations.Contains(key)) {
return false; string stackTrace = stack.ToString();
this.LoggedDeprecations.Add(key); foreach (string method in unlessStackIncludes)
return true; {
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> /// <summary>Get the simplest stack trace which shows where in the mod the deprecated code was called from.</summary>