| File: Comparing\SymbolEqualityComparer.cs | Web Access |
| Project: src\sdk\src\Compatibility\ApiCompat\Microsoft.DotNet.ApiCompatibility\Microsoft.DotNet.ApiCompatibility.csproj (Microsoft.DotNet.ApiCompatibility) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics.CodeAnalysis; using Microsoft.CodeAnalysis; using Microsoft.DotNet.ApiSymbolExtensions; namespace Microsoft.DotNet.ApiCompatibility.Comparing { /// <summary> /// Defines methods to support the comparison of <see cref="ISymbol"/> for equality. /// </summary> public class SymbolEqualityComparer : IEqualityComparer<ISymbol> { /// <inheritdoc /> public bool Equals(ISymbol? x, ISymbol? y) => string.Equals(x != null ? GetKey(x) : null, y != null ? GetKey(y) : null, StringComparison.OrdinalIgnoreCase); /// <inheritdoc /> public int GetHashCode([DisallowNull] ISymbol obj) => GetKey(obj).GetHashCode(); private static string GetKey(ISymbol symbol) { if (symbol is IMethodSymbol method) { // The display string for event add and remove varies // depending if we have references or not. // As these can't have different overrides we don't care // about the full display string. if (method.IsEventAdderOrRemover()) return method.Name; } if (symbol is IAssemblySymbol assembly) { // When mapping assemblies, we must ignore the version, culture and token. return assembly.Identity.Name; } return symbol.ToComparisonDisplayString(); } } }