File: Linker.Steps\CheckSuppressionsDispatcher.cs
Web Access
Project: src\src\tools\illink\src\linker\Mono.Linker.csproj (illink)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System.Collections.Generic;
using System.Linq;
using ILLink.Shared;
using Mono.Cecil;
 
namespace Mono.Linker.Steps
{
	public class CheckSuppressionsDispatcher : SubStepsDispatcher
	{
		public CheckSuppressionsDispatcher () : base (new List<ISubStep> { new CheckSuppressionsStep () })
		{
 
		}
 
		public override void Process (LinkContext context)
		{
			base.Process (context);
			var redundantSuppressions = context.Suppressions.GetUnusedSuppressions ();
 
			// Suppressions targeting warning caused by anything but the ILLink tool should not be reported.
			// Suppressions targeting RedundantSuppression warning should not be reported.
			redundantSuppressions = redundantSuppressions
				.Where (suppression => ((DiagnosticId) suppression.SuppressMessageInfo.Id).GetDiagnosticCategory () == DiagnosticCategory.Trimming)
				.Where (suppression => ((DiagnosticId) suppression.SuppressMessageInfo.Id) != DiagnosticId.RedundantSuppression)
				.Where (suppression => ProviderIsMarked (suppression.Provider));
 
			foreach (var suppression in redundantSuppressions) {
				var source = context.Suppressions.GetSuppressionOrigin (suppression);
 
				context.LogWarning (new MessageOrigin (source), DiagnosticId.RedundantSuppression, $"IL{suppression.SuppressMessageInfo.Id:0000}");
			}
 
			bool ProviderIsMarked (ICustomAttributeProvider provider)
			{
				if (provider is PropertyDefinition property) {
					return (property.GetMethod != null && context.Annotations.IsMarked (property.GetMethod))
						|| (property.SetMethod != null && context.Annotations.IsMarked (property.SetMethod));
				}
 
				if (provider is EventDefinition @event) {
					return (@event.AddMethod != null && context.Annotations.IsMarked (@event.AddMethod))
						|| (@event.InvokeMethod != null && context.Annotations.IsMarked (@event.InvokeMethod))
						|| (@event.RemoveMethod != null && context.Annotations.IsMarked (@event.RemoveMethod));
				}
 
				return context.Annotations.IsMarked (provider);
			}
		}
	}
}