// 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.Collections.Generic; using System.Collections.Immutable; using Microsoft.VisualStudio.ProjectSystem.Properties; namespace Microsoft.VisualStudio.ProjectSystem { internal class TestProjectChangeDescription : IProjectChangeDescription { public TestProjectChangeDescription(IProjectRuleSnapshot before, IProjectRuleSnapshot after) { Before = before; After = after; Difference = Diff.Create(before, after); } public IProjectRuleSnapshot Before { get; } public IProjectChangeDiff Difference { get; } public IProjectRuleSnapshot After { get; } private class Diff : IProjectChangeDiff { public static Diff Create(IProjectRuleSnapshot before, IProjectRuleSnapshot after) { var addedItems = new HashSet(after.Items.Keys); addedItems.ExceptWith(before.Items.Keys); var removedItems = new HashSet(before.Items.Keys); removedItems.ExceptWith(after.Items.Keys); // changed items must be present in both sets, but have different properties. var changedItems = new HashSet(before.Items.Keys); changedItems.IntersectWith(after.Items.Keys); changedItems.RemoveWhere(key => { var x = before.Items[key]; var y = after.Items[key]; if (x.Count != y.Count) { return true; } foreach (var kvp in x) { if (!y.Contains(kvp)) { return true; } } return false; }); var changedProperties = new HashSet(before.Properties.Keys); changedProperties.RemoveWhere(key => { var x = before.Properties[key]; var y = after.Properties[key]; return object.Equals(x, y); }); return new Diff() { AddedItems = addedItems.ToImmutableHashSet(), RemovedItems = removedItems.ToImmutableHashSet(), ChangedItems = changedItems.ToImmutableHashSet(), // We ignore renamed items. RenamedItems = ImmutableDictionary.Empty, ChangedProperties = changedProperties.ToImmutableHashSet(), }; } public IImmutableSet AddedItems { get; private set; } public IImmutableSet RemovedItems { get; private set; } public IImmutableSet ChangedItems { get; private set; } public IImmutableDictionary RenamedItems { get; private set; } public IImmutableSet ChangedProperties { get; private set; } public bool AnyChanges => AddedItems.Count > 0 || RemovedItems.Count > 0 || ChangedItems.Count > 0 || RenamedItems.Count > 0 || ChangedProperties.Count > 0; } } }