diff options
author | Paul Phillips <paulp@improving.org> | 2011-05-17 06:13:06 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-05-17 06:13:06 +0000 |
commit | b3899406974bb1e2d684e4979a1a1477c0e136fc (patch) | |
tree | 725b3bbc344d2fef84c1259069d5b30e302d6fae /src/compiler/scala/tools/nsc/util/ClassPath.scala | |
parent | b4fd2ab8e83597e51600545a11a0d4ef5bc28b11 (diff) | |
download | scala-b3899406974bb1e2d684e4979a1a1477c0e136fc.tar.gz scala-b3899406974bb1e2d684e4979a1a1477c0e136fc.tar.bz2 scala-b3899406974bb1e2d684e4979a1a1477c0e136fc.zip |
Eliminated an unnecessary second traversal of j...
Eliminated an unnecessary second traversal of jars by reading classes
and packages in the same pass. And rewrote ZipArchive yet again. You'd
think I'd get tired of working on this file, but even now I don't think
we're quite there. No review.
Diffstat (limited to 'src/compiler/scala/tools/nsc/util/ClassPath.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/util/ClassPath.scala | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala index 25c09b6c15..2b3aa8696c 100644 --- a/src/compiler/scala/tools/nsc/util/ClassPath.scala +++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala @@ -307,16 +307,19 @@ class SourcePath[T](dir: AbstractFile, val context: ClassPathContext[T]) extends def asClasspathString = dir.path val sourcepaths: IndexedSeq[AbstractFile] = IndexedSeq(dir) - lazy val classes: IndexedSeq[ClassRep] = dir flatMap { f => - if (f.isDirectory || !validSourceFile(f.name)) Nil - else List(ClassRep(None, Some(f))) - } toIndexedSeq - - lazy val packages: IndexedSeq[SourcePath[T]] = dir flatMap { f => - if (f.isDirectory && validPackage(f.name)) List(new SourcePath[T](f, context)) - else Nil - } toIndexedSeq + private def traverse() = { + val classBuf = immutable.Vector.newBuilder[ClassRep] + val packageBuf = immutable.Vector.newBuilder[SourcePath[T]] + dir foreach { f => + if (!f.isDirectory && validSourceFile(f.name)) + classBuf += ClassRep(None, Some(f)) + else if (f.isDirectory && validPackage(f.name)) + packageBuf += new SourcePath[T](f, context) + } + (packageBuf.result, classBuf.result) + } + lazy val (packages, classes) = traverse() override def toString() = "sourcepath: "+ dir.toString() } @@ -333,25 +336,21 @@ class DirectoryClassPath(val dir: AbstractFile, val context: ClassPathContext[Ab def asClasspathString = dir.path val sourcepaths: IndexedSeq[AbstractFile] = IndexedSeq() - lazy val classes: IndexedSeq[ClassRep] = { - val buf = immutable.Vector.newBuilder[ClassRep] + // calculates (packages, classes) in one traversal. + private def traverse() = { + val classBuf = immutable.Vector.newBuilder[ClassRep] + val packageBuf = immutable.Vector.newBuilder[DirectoryClassPath] dir foreach { f => if (!f.isDirectory && validClassFile(f.name)) - buf += ClassRep(Some(f), None) - } - buf.result - } - - lazy val packages: IndexedSeq[DirectoryClassPath] = { - val buf = immutable.Vector.newBuilder[DirectoryClassPath] - dir foreach { f => - if (f.isDirectory && validPackage(f.name)) - buf += new DirectoryClassPath(f, context) + classBuf += ClassRep(Some(f), None) + else if (f.isDirectory && validPackage(f.name)) + packageBuf += new DirectoryClassPath(f, context) } - buf.result + (packageBuf.result, classBuf.result) } - override def toString() = "directory classpath: "+ dir + lazy val (packages, classes) = traverse() + override def toString() = "directory classpath: "+ origin.getOrElse("?") } /** |