@@ -7,11 +7,9 @@ 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 , EfficientClassPath }
10+ import dotty .tools .io .{AbstractFile , PlainFile , ClassPath , ClassRepresentation }
1111import FileUtils ._
12-
1312import scala .collection .JavaConverters ._
14- import scala .collection .immutable .ArraySeq
1513
1614/**
1715 * A trait allowing to look for classpath entries in directories. It provides common logic for
@@ -20,7 +18,7 @@ import scala.collection.immutable.ArraySeq
2018 * when we have a name of a package.
2119 * It abstracts over the file representation to work with both JFile and AbstractFile.
2220 */
23- trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends EfficientClassPath {
21+ trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends ClassPath {
2422 type F
2523
2624 val dir : F
@@ -35,24 +33,27 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends EfficientCla
3533 protected def createFileEntry (file : AbstractFile ): FileEntryType
3634 protected def isMatchingFile (f : F ): Boolean
3735
38- private def getDirectory (forPackage : PackageName ): Option [F ] =
39- if (forPackage.isRoot )
36+ private def getDirectory (forPackage : String ): Option [F ] =
37+ if (forPackage == ClassPath . RootPackage )
4038 Some (dir)
41- else
42- getSubDir(forPackage.dirPathTrailingSlash)
39+ else {
40+ val packageDirName = FileUtils .dirPath(forPackage)
41+ getSubDir(packageDirName)
42+ }
4343
44- override private [dotty] def hasPackage (pkg : PackageName ): Boolean = getDirectory(pkg).isDefined
44+ override private [dotty] def hasPackage (pkg : String ): Boolean = getDirectory(pkg).isDefined
4545
46- private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
46+ private [dotty] def packages (inPackage : String ): 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- ArraySeq .unsafeWrapArray(nestedDirs).map(f => PackageEntryImpl (inPackage.entryName(getName(f))))
52+ val prefix = PackageNameUtils .packagePrefix(inPackage)
53+ nestedDirs.toIndexedSeq.map(f => PackageEntryImpl (prefix + getName(f)))
5354 }
5455
55- protected def files (inPackage : PackageName ): Seq [FileEntryType ] = {
56+ protected def files (inPackage : String ): Seq [FileEntryType ] = {
5657 val dirForPackage = getDirectory(inPackage)
5758 val files : Array [F ] = dirForPackage match {
5859 case None => emptyFiles
@@ -61,18 +62,21 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends EfficientCla
6162 files.iterator.map(f => createFileEntry(toAbstractFile(f))).toSeq
6263 }
6364
64- override def list (inPackage : PackageName , onPackageEntry : PackageEntry => Unit , onClassesAndSources : ClassRepresentation => Unit ): Unit = {
65+ private [dotty] def list (inPackage : String ): ClassPathEntries = {
6566 val dirForPackage = getDirectory(inPackage)
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- }
67+ val files : Array [F ] = dirForPackage match {
68+ case None => emptyFiles
69+ case Some (directory) => listChildren(directory)
7570 }
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)
7680 }
7781}
7882
@@ -155,25 +159,24 @@ final class JrtClassPath(fs: java.nio.file.FileSystem) extends ClassPath with No
155159 }
156160
157161 /** Empty string represents root package */
158- override private [dotty] def hasPackage (pkg : PackageName ): Boolean = packageToModuleBases.contains(pkg.dottedString )
162+ override private [dotty] def hasPackage (pkg : String ): Boolean = packageToModuleBases.contains(pkg)
159163
160- override private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
164+ override private [dotty] def packages (inPackage : String ): Seq [PackageEntry ] = {
161165 def matches (packageDottedName : String ) =
162166 if (packageDottedName.contains(" ." ))
163- packageOf(packageDottedName) == inPackage.dottedString
164- else inPackage.isRoot
167+ packageOf(packageDottedName) == inPackage
168+ else inPackage == " "
165169 packageToModuleBases.keysIterator.filter(matches).map(PackageEntryImpl (_)).toVector
166170 }
167-
168- private [dotty] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] =
169- if (inPackage.isRoot) Nil
171+ private [dotty] def classes (inPackage : String ): Seq [ClassFileEntry ] =
172+ if (inPackage == " " ) Nil
170173 else
171- packageToModuleBases.getOrElse(inPackage.dottedString , Nil ).flatMap(x =>
172- Files .list(x.resolve(inPackage.dirPathTrailingSlash )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
174+ packageToModuleBases.getOrElse(inPackage, Nil ).flatMap(x =>
175+ Files .list(x.resolve(FileUtils .dirPath(inPackage) )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
173176 ClassFileEntryImpl (new PlainFile (new dotty.tools.io.File (x)))).toVector
174177
175- override private [dotty] def list (inPackage : PackageName ): ClassPathEntries =
176- if (inPackage.isRoot ) ClassPathEntries (packages(inPackage), Nil )
178+ override private [dotty] def list (inPackage : String ): ClassPathEntries =
179+ if (inPackage == " " ) ClassPathEntries (packages(inPackage), Nil )
177180 else ClassPathEntries (packages(inPackage), classes(inPackage))
178181
179182 def asURLs : Seq [URL ] = Seq (new URL (" jrt:/" ))
@@ -211,7 +214,7 @@ case class DirectoryClassPath(dir: JFile) extends JFileDirectoryLookup[ClassFile
211214 protected def createFileEntry (file : AbstractFile ): ClassFileEntryImpl = ClassFileEntryImpl (file)
212215 protected def isMatchingFile (f : JFile ): Boolean = f.isClass
213216
214- private [dotty] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = files(inPackage)
217+ private [dotty] def classes (inPackage : String ): Seq [ClassFileEntry ] = files(inPackage)
215218}
216219
217220case class DirectorySourcePath (dir : JFile ) extends JFileDirectoryLookup [SourceFileEntryImpl ] with NoClassPaths {
@@ -235,5 +238,5 @@ case class DirectorySourcePath(dir: JFile) extends JFileDirectoryLookup[SourceFi
235238 }
236239 }
237240
238- private [dotty] def sources (inPackage : PackageName ): Seq [SourceFileEntry ] = files(inPackage)
241+ private [dotty] def sources (inPackage : String ): Seq [SourceFileEntry ] = files(inPackage)
239242}
0 commit comments