private bool MergeChanges( IDependenciesChanges changes, IEnumerable <IDependenciesSnapshotFilter> snapshotFilters, IEnumerable <IProjectDependenciesSubTreeProvider> subTreeProviders, HashSet <string> projectItemSpecs) { var worldBuilder = DependenciesWorld.ToBuilder(); var topLevelBuilder = TopLevelDependencies.ToBuilder(); var anyChanges = false; foreach (var removed in changes.RemovedNodes) { var targetedId = Dependency.GetID(TargetFramework, removed.ProviderType, removed.Id); if (!worldBuilder.TryGetValue(targetedId, out IDependency dependency)) { continue; } if (snapshotFilters != null) { foreach (var filter in snapshotFilters) { dependency = filter.BeforeRemove( ProjectPath, TargetFramework, dependency, worldBuilder, topLevelBuilder, out bool filterAnyChanges); anyChanges |= filterAnyChanges; if (dependency == null) { break; } } } if (dependency == null) { continue; } anyChanges = true; worldBuilder.Remove(targetedId); topLevelBuilder.Remove(dependency); } var subTreeProvidersMap = GetSubTreeProviderMap(subTreeProviders); foreach (var added in changes.AddedNodes) { IDependency newDependency = new Dependency(added, TargetFramework, ProjectPath); if (snapshotFilters != null) { foreach (var filter in snapshotFilters) { newDependency = filter.BeforeAdd( ProjectPath, TargetFramework, newDependency, worldBuilder, topLevelBuilder, subTreeProvidersMap, projectItemSpecs, out bool filterAnyChanges); anyChanges |= filterAnyChanges; if (newDependency == null) { break; } } } if (newDependency == null) { continue; } anyChanges = true; worldBuilder.Remove(newDependency.Id); worldBuilder.Add(newDependency.Id, newDependency); if (newDependency.TopLevel) { topLevelBuilder.Remove(newDependency); topLevelBuilder.Add(newDependency); } } DependenciesWorld = worldBuilder.ToImmutable(); TopLevelDependencies = topLevelBuilder.ToImmutable(); ConstructTopLevelDependenciesByPathMap(); return(anyChanges); }
private bool MergeChanges( IDependenciesChanges changes, IEnumerable <IDependenciesSnapshotFilter> snapshotFilters) { var topLevelBuilder = TopLevelDependencies.ToBuilder(); var worldBuilder = ImmutableDictionary.CreateBuilder <string, IDependency>( StringComparer.OrdinalIgnoreCase); worldBuilder.AddRange(DependenciesWorld); var anyChanges = false; foreach (var removed in changes.RemovedNodes) { var targetedId = Dependency.GetID(TargetFramework, removed.ProviderType, removed.Id); if (!worldBuilder.TryGetValue(targetedId, out IDependency dependency)) { continue; } snapshotFilters.ForEach( filter => filter.BeforeRemove(ProjectPath, TargetFramework, dependency, worldBuilder, topLevelBuilder)); anyChanges = true; worldBuilder.Remove(targetedId); topLevelBuilder.Remove(dependency); } foreach (var added in changes.AddedNodes) { IDependency newDependency = new Dependency(added, this); foreach (var filter in snapshotFilters) { newDependency = filter.BeforeAdd(ProjectPath, TargetFramework, newDependency, worldBuilder, topLevelBuilder); if (newDependency == null) { break; } } if (newDependency == null) { continue; } anyChanges = true; worldBuilder.Remove(newDependency.Id); worldBuilder.Add(newDependency.Id, newDependency); if (newDependency.TopLevel) { topLevelBuilder.Remove(newDependency); topLevelBuilder.Add(newDependency); } } DependenciesWorld = worldBuilder.ToImmutable(); TopLevelDependencies = topLevelBuilder.ToImmutable(); return(anyChanges); }