using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MasterDevs.ChromeDevTools.ProtocolGenerator { class ProtocolMerger { public static void Merge(Protocol source, Protocol target) { foreach (var domain in source.Domains) { if (!target.Domains.Contains(domain, NameEqualityComparer<Domain>.Instance)) { target.Domains.Add(domain); } else { Merge(source, domain, target.Domains.Single(t => NameEqualityComparer<Domain>.Instance.Equals(domain, t))); } } } static void Merge(Protocol protocol, Domain source, Domain target) { Merge(protocol, source, source.Commands, target.Commands); Merge(protocol, source, source.Events, target.Events); Merge(protocol, source, source.Types, target.Types); } static void Merge<T>(Protocol protocol, Domain domain, Collection<T> source, Collection<T> target) where T : ProtocolItem { foreach (var item in source) { if (!target.Contains(item, NameEqualityComparer<T>.Instance)) { target.Add(item); } else { var targetItem = target.Single(t => NameEqualityComparer<T>.Instance.Equals(item, t)); if (!targetItem.Equals(item)) { Console.WriteLine($"{protocol.Alias};{domain.Name};{item.Name};{item};{targetItem};{typeof(T).Name}"); } else { foreach (var v in item.SupportedBy) { targetItem.SupportedBy.Add(v); } } } } } } }