| File: RestoreCommand\DependencyGraphResolver.LibraryRangeComparer.cs | Web Access |
| Project: src\nuget-client\src\NuGet.Core\NuGet.Commands\NuGet.Commands.csproj (NuGet.Commands) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using NuGet.LibraryModel; using NuGet.Shared; using NuGet.Versioning; namespace NuGet.Commands { internal sealed partial class DependencyGraphResolver { /// <summary> /// Represents an <see cref="IEqualityComparer{T}" /> of <see cref="LibraryRange" /> that considers them to be equal based on the same functionality of <see cref="LibraryRange.ToString" />. /// </summary> public sealed class LibraryRangeComparer : IEqualityComparer<LibraryRange> { private LibraryRangeComparer() { } /// <summary> /// Gets an instance of <see cref="LibraryRangeComparer" />. /// </summary> public static LibraryRangeComparer Instance { get; } = new LibraryRangeComparer(); public bool Equals(LibraryRange? x, LibraryRange? y) { if (x == null || y == null || x.VersionRange == null || y.VersionRange == null) { return false; } if (ReferenceEquals(x, y)) { return true; } // All of this logic is copied from LibraryRange.ToString() LibraryDependencyTarget typeConstraint1 = LibraryDependencyTarget.None; LibraryDependencyTarget typeConstraint2 = LibraryDependencyTarget.None; switch (x.TypeConstraint) { case LibraryDependencyTarget.Reference: typeConstraint1 = LibraryDependencyTarget.Reference; break; case LibraryDependencyTarget.ExternalProject: typeConstraint1 = LibraryDependencyTarget.ExternalProject; break; case LibraryDependencyTarget.Project: case LibraryDependencyTarget.Project | LibraryDependencyTarget.ExternalProject: typeConstraint1 = LibraryDependencyTarget.Project; break; } switch (y.TypeConstraint) { case LibraryDependencyTarget.Reference: typeConstraint2 = LibraryDependencyTarget.Reference; break; case LibraryDependencyTarget.ExternalProject: typeConstraint2 = LibraryDependencyTarget.ExternalProject; break; case LibraryDependencyTarget.Project: case LibraryDependencyTarget.Project | LibraryDependencyTarget.ExternalProject: typeConstraint2 = LibraryDependencyTarget.Project; break; } return typeConstraint1 == typeConstraint2 && x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase) && x.VersionRange.Equals(y.VersionRange); } public int GetHashCode(LibraryRange obj) { LibraryDependencyTarget typeConstraint = LibraryDependencyTarget.None; switch (obj.TypeConstraint) { case LibraryDependencyTarget.Reference: typeConstraint = LibraryDependencyTarget.Reference; break; case LibraryDependencyTarget.ExternalProject: typeConstraint = LibraryDependencyTarget.ExternalProject; break; case LibraryDependencyTarget.Project: case LibraryDependencyTarget.Project | LibraryDependencyTarget.ExternalProject: typeConstraint = LibraryDependencyTarget.Project; break; } VersionRange versionRange = obj.VersionRange ?? VersionRange.None; HashCodeCombiner combiner = new(); combiner.AddObject((int)typeConstraint); combiner.AddStringIgnoreCase(obj.Name); combiner.AddObject(versionRange); return combiner.CombinedHash; } } } }