| File: RestoreCommand\Diagnostics\IndexedRestoreTargetGraph.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. #nullable disable using System; using System.Collections.Generic; using NuGet.DependencyResolver; using NuGet.LibraryModel; namespace NuGet.Commands { /// <summary> /// Contains a RestoreTargetGraph with the flattened graph indexed on id. /// </summary> public class IndexedRestoreTargetGraph { private readonly Dictionary<string, GraphItem<RemoteResolveResult>> _lookup = new Dictionary<string, GraphItem<RemoteResolveResult>>(StringComparer.OrdinalIgnoreCase); private readonly HashSet<string> _idsWithErrors = new HashSet<string>(StringComparer.OrdinalIgnoreCase); /// <summary> /// RestoreTargetGraph /// </summary> public IRestoreTargetGraph Graph { get; } private IndexedRestoreTargetGraph(IRestoreTargetGraph graph) { Graph = graph ?? throw new ArgumentNullException(nameof(graph)); // Id -> Node foreach (var node in graph.Flattened) { var id = node.Key.Name; if (!_lookup.ContainsKey(id)) { _lookup.Add(id, node); } } // Index NU1107 version conflict errors var versionConflicts = graph.AnalyzeResult?.VersionConflicts; if (versionConflicts != null) { foreach (var node in versionConflicts) { // Selected and conflicting will have the same name. _idsWithErrors.Add(node.Conflicting.Key.Name); } } // Index cycles var cycles = graph.AnalyzeResult?.Cycles; if (cycles != null) { foreach (var node in cycles) { _idsWithErrors.Add(node.Key.Name); } } } public static IndexedRestoreTargetGraph Create(IRestoreTargetGraph graph) { return new IndexedRestoreTargetGraph(graph); } /// <summary> /// Returns the item or null if the id does not exist. /// </summary> public GraphItem<RemoteResolveResult> GetItemById(string id) { if (_lookup.TryGetValue(id, out var node)) { return node; } return null; } /// <summary> /// Returns the item or null if the id does not exist or does not match the type. /// </summary> public GraphItem<RemoteResolveResult> GetItemById(string id, LibraryType libraryType) { if (_lookup.TryGetValue(id, out var node) && node.Key.Type == libraryType) { return node; } return null; } /// <summary> /// True if an id has a conflict or cycle error associated with it. /// </summary> public bool HasErrors(string id) { return _idsWithErrors.Contains(id); } } }