File: Traversers\DifferenceTraverser.cs
Web Access
Project: src\src\Microsoft.Cci.Extensions\Microsoft.Cci.Extensions.csproj (Microsoft.Cci.Extensions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using Microsoft.Cci.Differs;
using Microsoft.Cci.Filters;
using Microsoft.Cci.Mappings;
 
namespace Microsoft.Cci.Traversers
{
    public class DifferenceTraverser : MappingsTypeMemberTraverser
    {
        private readonly IDifferenceFilter _filter;
 
        public DifferenceTraverser(MappingSettings settings, IDifferenceFilter filter)
            : base(settings)
        {
            _filter = filter;
        }
 
        public void Visit(IEnumerable<IAssembly> oldAssemblies, IEnumerable<IAssembly> newAssemblies)
        {
            Contract.Requires(oldAssemblies != null);
            Contract.Requires(newAssemblies != null);
 
            AssemblySetMapping mapping = new AssemblySetMapping(this.Settings);
            mapping.AddMappings(oldAssemblies, newAssemblies);
 
            Visit(mapping);
        }
 
        public override void Visit(AssemblySetMapping mapping)
        {
            Visit(mapping.Differences);
            base.Visit(mapping);
        }
 
        public override void Visit(AssemblyMapping mapping)
        {
            Visit(mapping.Differences);
            base.Visit(mapping);
        }
 
        public override void Visit(NamespaceMapping mapping)
        {
            Visit(mapping.Differences);
            base.Visit(mapping);
        }
 
        public override void Visit(TypeMapping mapping)
        {
            Visit(mapping.Differences);
            if (mapping.ShouldDiffMembers)
                base.Visit(mapping);
        }
 
        public override void Visit(MemberMapping mapping)
        {
            Visit(mapping.Differences);
            base.Visit(mapping);
        }
 
        public virtual void Visit(IEnumerable<Difference> differences)
        {
            differences = differences.Where(_filter.Include);
 
            foreach (var difference in differences)
                Visit(difference);
        }
 
        public virtual void Visit(Difference difference)
        {
        }
 
        protected IDifferenceFilter DifferenceFilter => _filter;
    }
}