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);
                }
            }
        }