diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/SuppressibleMSBuildLog.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/SuppressibleMSBuildLog.cs index 0dda7cfe46cc..57e2ff4748cf 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/SuppressibleMSBuildLog.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/SuppressibleMSBuildLog.cs @@ -10,7 +10,8 @@ namespace Microsoft.DotNet.ApiCompat.Task /// Class that can log Suppressions in an MSBuild task, by implementing MSBuildLog and ISuppressibleLog. /// internal sealed class SuppressibleMSBuildLog(NET.Build.Tasks.Logger log, - ISuppressionEngine suppressionEngine) : MSBuildLog(log), ISuppressibleLog + ISuppressionEngine suppressionEngine, + string? noWarn = null) : MSBuildLog(log, noWarn), ISuppressibleLog { /// public bool HasLoggedErrorSuppressions { get; private set; } diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidateAssembliesTask.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidateAssembliesTask.cs index 650245dae575..424d81b4862a 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidateAssembliesTask.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidateAssembliesTask.cs @@ -132,7 +132,7 @@ public override bool Execute() protected override void ExecuteCore() { - SuppressibleMSBuildLog logFactory(ISuppressionEngine suppressionEngine) => new(Log, suppressionEngine); + SuppressibleMSBuildLog logFactory(ISuppressionEngine suppressionEngine) => new(Log, suppressionEngine, NoWarn); ValidateAssemblies.Run(logFactory, GenerateSuppressionFile, PreserveUnnecessarySuppressions, diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidatePackageTask.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidatePackageTask.cs index b839ca1d4325..196d90c47272 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidatePackageTask.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Task/ValidatePackageTask.cs @@ -140,7 +140,7 @@ public override bool Execute() protected override void ExecuteCore() { - SuppressibleMSBuildLog logFactory(ISuppressionEngine suppressionEngine) => new(Log, suppressionEngine); + SuppressibleMSBuildLog logFactory(ISuppressionEngine suppressionEngine) => new(Log, suppressionEngine, NoWarn); ValidatePackage.Run(logFactory, GenerateSuppressionFile, PreserveUnnecessarySuppressions, diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/Program.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/Program.cs index cb248930e153..1cf403f061f1 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/Program.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/Program.cs @@ -196,7 +196,7 @@ static int Main(string[] args) (string, string)[]? leftAssembliesTransformationPattern = parseResult.GetValue(leftAssembliesTransformationPatternOption); (string, string)[]? rightAssembliesTransformationPattern = parseResult.GetValue(rightAssembliesTransformationPatternOption); - SuppressibleConsoleLog logFactory(ISuppressionEngine suppressionEngine) => new(suppressionEngine, verbosity); + SuppressibleConsoleLog logFactory(ISuppressionEngine suppressionEngine) => new(suppressionEngine, verbosity, noWarn); int exitCode = ValidateAssemblies.Run(logFactory, generateSuppressionFile, preserveUnnecessarySuppressions, @@ -320,7 +320,7 @@ static int Main(string[] args) Dictionary>? baselinePackageAssemblyReferences = parseResult.GetValue(baselinePackageAssemblyReferencesOption); string[]? baselinePackageFrameworksToIgnore = parseResult.GetValue(baselinePackageFrameworksToIgnoreOption); - SuppressibleConsoleLog logFactory(ISuppressionEngine suppressionEngine) => new(suppressionEngine, verbosity); + SuppressibleConsoleLog logFactory(ISuppressionEngine suppressionEngine) => new(suppressionEngine, verbosity, noWarn); int exitCode = ValidatePackage.Run(logFactory, generateSuppressionFile, preserveUnnecessarySuppressions, diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/SuppressibleConsoleLog.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/SuppressibleConsoleLog.cs index 4bda2be1f799..5d2222e45a58 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/SuppressibleConsoleLog.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompat.Tool/SuppressibleConsoleLog.cs @@ -10,7 +10,8 @@ namespace Microsoft.DotNet.ApiCompat.Tool /// Class that can log Suppressions to the Console, by implementing ConsoleLog and ISuppressibleLog. /// internal sealed class SuppressibleConsoleLog(ISuppressionEngine suppressionEngine, - MessageImportance messageImportance) : ConsoleLog(messageImportance), ISuppressibleLog + MessageImportance messageImportance, + string? noWarn = null) : ConsoleLog(messageImportance, noWarn), ISuppressibleLog { /// public bool HasLoggedErrorSuppressions { get; private set; } diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompatibility/Logging/SuppressionEngine.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompatibility/Logging/SuppressionEngine.cs index fef506d21bbf..8fbfbc69c1ae 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompatibility/Logging/SuppressionEngine.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.ApiCompatibility/Logging/SuppressionEngine.cs @@ -17,7 +17,7 @@ public class SuppressionEngine(string? noWarn = null, bool baselineAllErrors = f protected const string DiagnosticIdDocumentationComment = " https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids "; private readonly HashSet _baselineSuppressions = []; private readonly HashSet _suppressions = []; - private readonly HashSet _noWarn = string.IsNullOrEmpty(noWarn) ? [] : new(noWarn!.Split(';')); + private readonly HashSet _noWarn = string.IsNullOrEmpty(noWarn) ? [] : new(noWarn!.Split(';'), StringComparer.OrdinalIgnoreCase); /// public bool BaselineAllErrors { get; } = baselineAllErrors; diff --git a/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/ConsoleLog.cs b/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/ConsoleLog.cs index fd380e6c1214..41754fadcfa2 100644 --- a/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/ConsoleLog.cs +++ b/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/ConsoleLog.cs @@ -6,8 +6,10 @@ namespace Microsoft.DotNet.ApiSymbolExtensions.Logging /// /// Class to define common logging abstraction to the console across the APICompat and GenAPI codebases. /// - public class ConsoleLog(MessageImportance messageImportance) : ILog + public class ConsoleLog(MessageImportance messageImportance, string? noWarn = null) : ILog { + private readonly HashSet _noWarn = string.IsNullOrEmpty(noWarn) ? [] : new(noWarn!.Split(';'), StringComparer.OrdinalIgnoreCase); + /// public bool HasLoggedErrors { get; private set; } @@ -30,8 +32,20 @@ public virtual void LogWarning(string message) => Console.WriteLine(message); /// - public virtual void LogWarning(string code, string message) => - Console.WriteLine($"{code}: {message}"); + public virtual void LogWarning(string code, string message) + { + string messageTextWithCode = $"{code}: {message}"; + + // Mimic MSBuild which logs suppressed warnings as low importance messages. + if (_noWarn.Contains(code)) + { + LogMessage(MessageImportance.Low, messageTextWithCode); + } + else + { + Console.WriteLine(messageTextWithCode); + } + } /// public virtual void LogMessage(string message) => diff --git a/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/MSBuildLog.cs b/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/MSBuildLog.cs index 2d85e521ecad..cd2eb8e5bc05 100644 --- a/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/MSBuildLog.cs +++ b/src/Compatibility/Microsoft.DotNet.ApiSymbolExtensions/Logging/MSBuildLog.cs @@ -8,8 +8,11 @@ namespace Microsoft.DotNet.ApiSymbolExtensions.Logging /// /// Class to define common logging abstraction for MSBuild tasks across the APICompat and GenAPI codebases. /// - internal class MSBuildLog(Logger log) : ILog + internal class MSBuildLog(Logger log, string? noWarn = null) : ILog { + // Remove passing in NoWarn when MSBuild respects it correctly in outer-builds: https://github.com/dotnet/msbuild/issues/10873 + private readonly HashSet _noWarn = string.IsNullOrEmpty(noWarn) ? [] : new(noWarn!.Split(';'), StringComparer.OrdinalIgnoreCase); + /// public bool HasLoggedErrors => log.HasLoggedErrors; @@ -27,7 +30,8 @@ public virtual void LogWarning(string message) => /// public virtual void LogWarning(string code, string message) => - LogCore(MessageLevel.Warning, code, message); + // Mimic MSBuild which logs suppressed warnings as low importance messages. + LogCore(_noWarn.Contains(code) ? MessageLevel.LowImportance : MessageLevel.Warning, code, message); /// public virtual void LogMessage(string message) =>