diff --git a/src/main/scala/leon/purescala/DependencyFinder.scala b/src/main/scala/leon/purescala/DependencyFinder.scala index 5382046e1bba0fd5b6040f3a6b01c994a29595b4..c96e5c92b5b6d8007a14ef58d9b4599f45de8cdf 100644 --- a/src/main/scala/leon/purescala/DependencyFinder.scala +++ b/src/main/scala/leon/purescala/DependencyFinder.scala @@ -20,7 +20,6 @@ class DependencyFinder { private class Finder(var current: Definition) extends TreeTraverser { val foundDeps: MutableMap[Definition, MutableSet[Definition]] = MutableMap.empty - foundDeps(current) = MutableSet.empty private def withCurrent[T](d: Definition)(b: => T): T = { if (!(foundDeps contains d)) foundDeps(d) = MutableSet.empty @@ -35,31 +34,35 @@ class DependencyFinder { override def traverse(cd: ClassDef): Unit = if (!foundDeps(current)(cd)) { foundDeps(current) += cd - if (!(deps contains cd) && !(foundDeps contains cd)) { - for (cd <- cd.root.knownDescendants :+ cd) { - cd.invariant foreach (fd => withCurrent(cd)(traverse(fd))) - withCurrent(cd)(cd.fieldsIds foreach traverse) - cd.parent foreach { p => - foundDeps(p.classDef) = foundDeps.getOrElse(p.classDef, MutableSet.empty) + cd - foundDeps(cd) = foundDeps.getOrElse(cd, MutableSet.empty) + p.classDef - } + if (!(deps contains cd) && !(foundDeps contains cd)) traverseClassDef(cd) + } + + private def traverseClassDef(cd: ClassDef): Unit = { + for (cd <- cd.root.knownDescendants :+ cd) { + cd.invariant foreach (fd => withCurrent(cd)(traverse(fd))) + withCurrent(cd)(cd.fieldsIds foreach traverse) + cd.parent foreach { p => + foundDeps(p.classDef) = foundDeps.getOrElse(p.classDef, MutableSet.empty) + cd + foundDeps(cd) = foundDeps.getOrElse(cd, MutableSet.empty) + p.classDef } } } override def traverse(fd: FunDef): Unit = if (!foundDeps(current)(fd)) { foundDeps(current) += fd - if (!(deps contains fd) && !(foundDeps contains fd)) withCurrent(fd) { - fd.params foreach (vd => traverse(vd.id)) - traverse(fd.returnType) - traverse(fd.fullBody) - } + if (!(deps contains fd) && !(foundDeps contains fd)) traverseFunDef(fd) + } + + private def traverseFunDef(fd: FunDef): Unit = withCurrent(fd) { + fd.params foreach (vd => traverse(vd.id)) + traverse(fd.returnType) + traverse(fd.fullBody) } def dependencies: Set[Definition] = { current match { - case fd: FunDef => traverse(fd) - case cd: ClassDef => traverse(cd) + case fd: FunDef => traverseFunDef(fd) + case cd: ClassDef => traverseClassDef(cd) case _ => } @@ -69,8 +72,9 @@ class DependencyFinder { var changed = false do { + changed = false for ((d, ds) <- deps.toSeq) { - val next = ds.flatMap(d => deps.getOrElse(d, Set.empty)) + val next = ds ++ ds.flatMap(d => deps.getOrElse(d, Set.empty)) if (!(next subsetOf ds)) { deps(d) = next changed = true