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