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);