void MergeWith(InterfaceFamily f) { Debug.Assert(_interfaces.Intersect(f._interfaces).Any() == false); _interfaces.UnionWith(f._interfaces); _classes.AddRange(f._classes); }
public static IReadOnlyCollection <InterfaceFamily> Build( IActivityMonitor m, StObjObjectEngineMap _, IEnumerable <AutoServiceClassInfo> classes) { var families = new Dictionary <AutoServiceInterfaceInfo, InterfaceFamily>(); bool familiesHasBeenMerged = false; foreach (var c in classes) { Debug.Assert(c.IsIncluded && c.Interfaces != null && (c.Interfaces.Count == 0 || c.Interfaces.Any(i => i.SpecializationDepth == 0))); foreach (var baseInterface in c.Interfaces.Where(i => !i.IsSpecialized)) { InterfaceFamily?currentF = null; var rootInterfaces = baseInterface.SpecializationDepth == 0 ? new[] { baseInterface } : baseInterface.Interfaces.Where(i => i.SpecializationDepth == 0); foreach (var root in rootInterfaces) { if (families.TryGetValue(root, out var f)) { if (currentF == null) { currentF = f; } else if (currentF != f) { currentF.MergeWith(f); families[root] = currentF; m.Info($"Family interfaces merged because of '{baseInterface.Type}'."); familiesHasBeenMerged = true; } } else { if (currentF == null) { currentF = new InterfaceFamily(); } families.Add(root, currentF); } currentF._interfaces.AddRange(baseInterface.Interfaces); currentF._interfaces.Add(baseInterface); } if (currentF != null) { if (!currentF._classes.ContainsKey(c)) { currentF._classes.Add(c, new SCRClass(currentF, c)); } } } } IReadOnlyCollection <InterfaceFamily> result = families.Values; if (familiesHasBeenMerged) { result = result.Distinct().ToList(); } return(result); }