public TypeSummary(string assemblyQualifiedName, NameBuilder names, IEnumerable <MethodVisitor> methods) { Contract.Requires(!string.IsNullOrEmpty(assemblyQualifiedName)); Contract.Requires(names != null); Contract.Requires(methods != null); Contract.Ensures(ids.Keys.SetEquals(names.ThisNames())); this.AssemblyQualifiedName = assemblyQualifiedName; // give a union-find id to each instance expression name foreach (var name in names.ThisNames()) { ids.Add(name, comparability.AddElement()); } // union the sets, according to each method's opinion foreach (var name in names.ThisNames()) { HashSet <string> indexOpinion = new HashSet <string>(); foreach (var method in methods) { var opinion = method.ComparabilitySet(name).Intersect(ids.Keys); string last = null; foreach (var other in opinion) { if (last != null) { comparability.Union(comparability.FindSet(ids[last]), comparability.FindSet(ids[name])); } last = other; } indexOpinion.UnionWith(method.IndexComparabilityOpinion(name).Intersect(names.ThisNames())); } if (indexOpinion.Count > 0) { arrayIndexes.Add(name, indexOpinion); } } }