@@ -7,9 +7,11 @@ import java.io.{File => JFile}
77import java .net .URL
88import java .nio .file .{FileSystems , Files }
99
10- import dotty .tools .io .{AbstractFile , PlainFile , ClassPath , ClassRepresentation }
10+ import dotty .tools .io .{AbstractFile , PlainFile , ClassPath , ClassRepresentation , EfficientClassPath }
1111import FileUtils ._
12+
1213import scala .collection .JavaConverters ._
14+ import scala .collection .immutable .ArraySeq
1315
1416/**
1517 * A trait allowing to look for classpath entries in directories. It provides common logic for
@@ -18,7 +20,7 @@ import scala.collection.JavaConverters._
1820 * when we have a name of a package.
1921 * It abstracts over the file representation to work with both JFile and AbstractFile.
2022 */
21- trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends ClassPath {
23+ trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends EfficientClassPath {
2224 type F
2325
2426 val dir : F
@@ -33,27 +35,24 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends ClassPath {
3335 protected def createFileEntry (file : AbstractFile ): FileEntryType
3436 protected def isMatchingFile (f : F ): Boolean
3537
36- private def getDirectory (forPackage : String ): Option [F ] =
37- if (forPackage == ClassPath . RootPackage )
38+ private def getDirectory (forPackage : PackageName ): Option [F ] =
39+ if (forPackage.isRoot )
3840 Some (dir)
39- else {
40- val packageDirName = FileUtils .dirPath(forPackage)
41- getSubDir(packageDirName)
42- }
41+ else
42+ getSubDir(forPackage.dirPathTrailingSlash)
4343
44- override private [dotty] def hasPackage (pkg : String ): Boolean = getDirectory(pkg).isDefined
44+ override private [dotty] def hasPackage (pkg : PackageName ): Boolean = getDirectory(pkg).isDefined
4545
46- private [dotty] def packages (inPackage : String ): Seq [PackageEntry ] = {
46+ private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
4747 val dirForPackage = getDirectory(inPackage)
4848 val nestedDirs : Array [F ] = dirForPackage match {
4949 case None => emptyFiles
5050 case Some (directory) => listChildren(directory, Some (isPackage))
5151 }
52- val prefix = PackageNameUtils .packagePrefix(inPackage)
53- nestedDirs.toIndexedSeq.map(f => PackageEntryImpl (prefix + getName(f)))
52+ ArraySeq .unsafeWrapArray(nestedDirs).map(f => PackageEntryImpl (inPackage.entryName(getName(f))))
5453 }
5554
56- protected def files (inPackage : String ): Seq [FileEntryType ] = {
55+ protected def files (inPackage : PackageName ): Seq [FileEntryType ] = {
5756 val dirForPackage = getDirectory(inPackage)
5857 val files : Array [F ] = dirForPackage match {
5958 case None => emptyFiles
@@ -62,21 +61,18 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends ClassPath {
6261 files.iterator.map(f => createFileEntry(toAbstractFile(f))).toSeq
6362 }
6463
65- private [dotty] def list (inPackage : String ): ClassPathEntries = {
64+ override def list (inPackage : PackageName , onPackageEntry : PackageEntry => Unit , onClassesAndSources : ClassRepresentation => Unit ): Unit = {
6665 val dirForPackage = getDirectory(inPackage)
67- val files : Array [F ] = dirForPackage match {
68- case None => emptyFiles
69- case Some (directory) => listChildren(directory)
66+ dirForPackage match {
67+ case None =>
68+ case Some (directory) =>
69+ for (file <- listChildren(directory)) {
70+ if (isPackage(file))
71+ onPackageEntry(PackageEntryImpl (inPackage.entryName(getName(file))))
72+ else if (isMatchingFile(file))
73+ onClassesAndSources(createFileEntry(toAbstractFile(file)))
74+ }
7075 }
71- val packagePrefix = PackageNameUtils .packagePrefix(inPackage)
72- val packageBuf = collection.mutable.ArrayBuffer .empty[PackageEntry ]
73- val fileBuf = collection.mutable.ArrayBuffer .empty[FileEntryType ]
74- for (file <- files)
75- if (isPackage(file))
76- packageBuf += PackageEntryImpl (packagePrefix + getName(file))
77- else if (isMatchingFile(file))
78- fileBuf += createFileEntry(toAbstractFile(file))
79- ClassPathEntries (packageBuf, fileBuf)
8076 }
8177}
8278
@@ -159,24 +155,25 @@ final class JrtClassPath(fs: java.nio.file.FileSystem) extends ClassPath with No
159155 }
160156
161157 /** Empty string represents root package */
162- override private [dotty] def hasPackage (pkg : String ): Boolean = packageToModuleBases.contains(pkg)
158+ override private [dotty] def hasPackage (pkg : PackageName ): Boolean = packageToModuleBases.contains(pkg.dottedString )
163159
164- override private [dotty] def packages (inPackage : String ): Seq [PackageEntry ] = {
160+ override private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
165161 def matches (packageDottedName : String ) =
166162 if (packageDottedName.contains(" ." ))
167- packageOf(packageDottedName) == inPackage
168- else inPackage == " "
163+ packageOf(packageDottedName) == inPackage.dottedString
164+ else inPackage.isRoot
169165 packageToModuleBases.keysIterator.filter(matches).map(PackageEntryImpl (_)).toVector
170166 }
171- private [dotty] def classes (inPackage : String ): Seq [ClassFileEntry ] =
172- if (inPackage == " " ) Nil
167+
168+ private [dotty] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] =
169+ if (inPackage.isRoot) Nil
173170 else
174- packageToModuleBases.getOrElse(inPackage, Nil ).flatMap(x =>
175- Files .list(x.resolve(FileUtils .dirPath( inPackage) )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
171+ packageToModuleBases.getOrElse(inPackage.dottedString , Nil ).flatMap(x =>
172+ Files .list(x.resolve(inPackage.dirPathTrailingSlash )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
176173 ClassFileEntryImpl (new PlainFile (new dotty.tools.io.File (x)))).toVector
177174
178- override private [dotty] def list (inPackage : String ): ClassPathEntries =
179- if (inPackage == " " ) ClassPathEntries (packages(inPackage), Nil )
175+ override private [dotty] def list (inPackage : PackageName ): ClassPathEntries =
176+ if (inPackage.isRoot ) ClassPathEntries (packages(inPackage), Nil )
180177 else ClassPathEntries (packages(inPackage), classes(inPackage))
181178
182179 def asURLs : Seq [URL ] = Seq (new URL (" jrt:/" ))
@@ -214,7 +211,7 @@ case class DirectoryClassPath(dir: JFile) extends JFileDirectoryLookup[ClassFile
214211 protected def createFileEntry (file : AbstractFile ): ClassFileEntryImpl = ClassFileEntryImpl (file)
215212 protected def isMatchingFile (f : JFile ): Boolean = f.isClass
216213
217- private [dotty] def classes (inPackage : String ): Seq [ClassFileEntry ] = files(inPackage)
214+ private [dotty] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = files(inPackage)
218215}
219216
220217case class DirectorySourcePath (dir : JFile ) extends JFileDirectoryLookup [SourceFileEntryImpl ] with NoClassPaths {
@@ -238,5 +235,5 @@ case class DirectorySourcePath(dir: JFile) extends JFileDirectoryLookup[SourceFi
238235 }
239236 }
240237
241- private [dotty] def sources (inPackage : String ): Seq [SourceFileEntry ] = files(inPackage)
238+ private [dotty] def sources (inPackage : PackageName ): Seq [SourceFileEntry ] = files(inPackage)
242239}
0 commit comments