private int MakeCloneSetTransitive()

in DuplicateCodeDetector/CloneGroups.cs [61:87]


        private int MakeCloneSetTransitive()
        {
            var filesToVisit = new HashSet<string>(FileToCloneSet.Keys);
            int numCloneSets = 0;

            while (filesToVisit.Count > 0)
            {
                var cloneSet = new HashSet<string>() { filesToVisit.First() };
                int lastCloneSetSize;

                do
                {
                    lastCloneSetSize = cloneSet.Count;
                    cloneSet = new HashSet<string>(cloneSet.SelectMany(c => FileToCloneSet[c]).Union(cloneSet));
                }
                while (lastCloneSetSize != cloneSet.Count);

                numCloneSets += 1;
                CloneSets.Add(cloneSet);
                foreach (var f in cloneSet)
                {
                    FileToCloneSet[f] = cloneSet;
                    filesToVisit.Remove(f);
                }
            }
            return numCloneSets;
        }