From 51524055f795bb333520af75c93c217c8666eb80 Mon Sep 17 00:00:00 2001 From: Adriaan Moors Date: Tue, 1 Dec 2015 14:54:47 -0800 Subject: [PATCH] Reduce memory usage of ExtractDependenciesTraverser --- .../interface/src/main/scala/xsbt/Dependency.scala | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/compile/interface/src/main/scala/xsbt/Dependency.scala b/compile/interface/src/main/scala/xsbt/Dependency.scala index a72f615a6..89e02d6d3 100644 --- a/compile/interface/src/main/scala/xsbt/Dependency.scala +++ b/compile/interface/src/main/scala/xsbt/Dependency.scala @@ -95,12 +95,9 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile { } private abstract class ExtractDependenciesTraverser extends Traverser { - protected val depBuf = collection.mutable.ArrayBuffer.empty[Symbol] - protected def addDependency(dep: Symbol): Unit = depBuf += dep - def dependencies: collection.immutable.Set[Symbol] = { - // convert to immutable set and remove NoSymbol if we have one - depBuf.toSet - NoSymbol - } + private val deps = collection.mutable.HashSet.empty[Symbol] + protected def addDependency(dep: Symbol): Unit = if (dep ne NoSymbol) deps += dep + def dependencies: Iterator[Symbol] = deps.iterator } private class ExtractDependenciesByMemberRefTraverser extends ExtractDependenciesTraverser { @@ -158,7 +155,7 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile { } } - private def extractDependenciesByMemberRef(unit: CompilationUnit): collection.immutable.Set[Symbol] = { + private def extractDependenciesByMemberRef(unit: CompilationUnit): Iterator[Symbol] = { val traverser = new ExtractDependenciesByMemberRefTraverser traverser.traverse(unit.body) val dependencies = traverser.dependencies @@ -184,7 +181,7 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile { } } - private def extractDependenciesByInheritance(unit: CompilationUnit): collection.immutable.Set[Symbol] = { + private def extractDependenciesByInheritance(unit: CompilationUnit): Iterator[Symbol] = { val traverser = new ExtractDependenciesByInheritanceTraverser traverser.traverse(unit.body) val dependencies = traverser.dependencies