summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/util/ClassPath.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-05-17 06:13:06 +0000
committerPaul Phillips <paulp@improving.org>2011-05-17 06:13:06 +0000
commitb3899406974bb1e2d684e4979a1a1477c0e136fc (patch)
tree725b3bbc344d2fef84c1259069d5b30e302d6fae /src/compiler/scala/tools/nsc/util/ClassPath.scala
parentb4fd2ab8e83597e51600545a11a0d4ef5bc28b11 (diff)
downloadscala-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.scala45
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("?")
}
/**