private DependenciesChangesBuilder GetChanges(ITargetFramework targetFramework) { if (_changes == null) { _changes = new Dictionary <ITargetFramework, DependenciesChangesBuilder>(); } if (_changes.TryGetValue(targetFramework, out DependenciesChangesBuilder builder)) { return(builder); } return(_changes[targetFramework] = new DependenciesChangesBuilder()); }
protected override void Handle( AggregateCrossTargetProjectContext currentAggregateContext, ITargetFramework targetFrameworkToUpdate, EventData e) { IProjectSubscriptionUpdate projectUpdate = e.Item1; IProjectCatalogSnapshot catalogSnapshot = e.Item2; // Broken design time builds sometimes cause updates with no project changes and sometimes // cause updates with a project change that has no difference. // We handle the former case here, and the latter case is handled in the CommandLineItemHandler. if (projectUpdate.ProjectChanges.Count == 0) { return; } if (!projectUpdate.ProjectChanges.Any(x => x.Value.Difference.AnyChanges)) { return; } // Create an object to track dependency changes. var changesBuilder = new DependenciesChangesBuilder(); // Give each handler a chance to register dependency changes. foreach (Lazy <IDependenciesRuleHandler, IOrderPrecedenceMetadataView> handler in _handlers) { handler.Value.Handle(projectUpdate.ProjectChanges, targetFrameworkToUpdate, changesBuilder); } IDependenciesChanges?changes = changesBuilder.TryBuildChanges(); if (changes != null) { // Notify subscribers of a change in dependency data RaiseDependenciesChanged(targetFrameworkToUpdate, changes, currentAggregateContext, catalogSnapshot); } // Record all the rules that have occurred _treeTelemetryService.ObserveTargetFrameworkRules(targetFrameworkToUpdate, projectUpdate.ProjectChanges.Keys); }
public override string ToString() => DependenciesChangesBuilder.ToString(AddedNodes, RemovedNodes);