@@ -7,11 +7,9 @@ import java.io.{File => JFile}
7
7
import java .net .URL
8
8
import java .nio .file .{FileSystems , Files }
9
9
10
- import dotty .tools .io .{AbstractFile , PlainFile , ClassPath , ClassRepresentation , EfficientClassPath }
10
+ import dotty .tools .io .{AbstractFile , PlainFile , ClassPath , ClassRepresentation }
11
11
import FileUtils ._
12
-
13
12
import scala .collection .JavaConverters ._
14
- import scala .collection .immutable .ArraySeq
15
13
16
14
/**
17
15
* A trait allowing to look for classpath entries in directories. It provides common logic for
@@ -20,7 +18,7 @@ import scala.collection.immutable.ArraySeq
20
18
* when we have a name of a package.
21
19
* It abstracts over the file representation to work with both JFile and AbstractFile.
22
20
*/
23
- trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends EfficientClassPath {
21
+ trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends ClassPath {
24
22
type F
25
23
26
24
val dir : F
@@ -35,24 +33,27 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends EfficientCla
35
33
protected def createFileEntry (file : AbstractFile ): FileEntryType
36
34
protected def isMatchingFile (f : F ): Boolean
37
35
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 )
40
38
Some (dir)
41
- else
42
- getSubDir(forPackage.dirPathTrailingSlash)
39
+ else {
40
+ val packageDirName = FileUtils .dirPath(forPackage)
41
+ getSubDir(packageDirName)
42
+ }
43
43
44
- override private [dotty] def hasPackage (pkg : PackageName ): Boolean = getDirectory(pkg).isDefined
44
+ override private [dotty] def hasPackage (pkg : String ): Boolean = getDirectory(pkg).isDefined
45
45
46
- private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
46
+ private [dotty] def packages (inPackage : String ): Seq [PackageEntry ] = {
47
47
val dirForPackage = getDirectory(inPackage)
48
48
val nestedDirs : Array [F ] = dirForPackage match {
49
49
case None => emptyFiles
50
50
case Some (directory) => listChildren(directory, Some (isPackage))
51
51
}
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)))
53
54
}
54
55
55
- protected def files (inPackage : PackageName ): Seq [FileEntryType ] = {
56
+ protected def files (inPackage : String ): Seq [FileEntryType ] = {
56
57
val dirForPackage = getDirectory(inPackage)
57
58
val files : Array [F ] = dirForPackage match {
58
59
case None => emptyFiles
@@ -61,18 +62,21 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends EfficientCla
61
62
files.iterator.map(f => createFileEntry(toAbstractFile(f))).toSeq
62
63
}
63
64
64
- override def list (inPackage : PackageName , onPackageEntry : PackageEntry => Unit , onClassesAndSources : ClassRepresentation => Unit ): Unit = {
65
+ private [dotty] def list (inPackage : String ): ClassPathEntries = {
65
66
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)
75
70
}
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)
76
80
}
77
81
}
78
82
@@ -155,25 +159,24 @@ final class JrtClassPath(fs: java.nio.file.FileSystem) extends ClassPath with No
155
159
}
156
160
157
161
/** 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)
159
163
160
- override private [dotty] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
164
+ override private [dotty] def packages (inPackage : String ): Seq [PackageEntry ] = {
161
165
def matches (packageDottedName : String ) =
162
166
if (packageDottedName.contains(" ." ))
163
- packageOf(packageDottedName) == inPackage.dottedString
164
- else inPackage.isRoot
167
+ packageOf(packageDottedName) == inPackage
168
+ else inPackage == " "
165
169
packageToModuleBases.keysIterator.filter(matches).map(PackageEntryImpl (_)).toVector
166
170
}
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
170
173
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 =>
173
176
ClassFileEntryImpl (new PlainFile (new dotty.tools.io.File (x)))).toVector
174
177
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 )
177
180
else ClassPathEntries (packages(inPackage), classes(inPackage))
178
181
179
182
def asURLs : Seq [URL ] = Seq (new URL (" jrt:/" ))
@@ -211,7 +214,7 @@ case class DirectoryClassPath(dir: JFile) extends JFileDirectoryLookup[ClassFile
211
214
protected def createFileEntry (file : AbstractFile ): ClassFileEntryImpl = ClassFileEntryImpl (file)
212
215
protected def isMatchingFile (f : JFile ): Boolean = f.isClass
213
216
214
- private [dotty] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = files(inPackage)
217
+ private [dotty] def classes (inPackage : String ): Seq [ClassFileEntry ] = files(inPackage)
215
218
}
216
219
217
220
case class DirectorySourcePath (dir : JFile ) extends JFileDirectoryLookup [SourceFileEntryImpl ] with NoClassPaths {
@@ -235,5 +238,5 @@ case class DirectorySourcePath(dir: JFile) extends JFileDirectoryLookup[SourceFi
235
238
}
236
239
}
237
240
238
- private [dotty] def sources (inPackage : PackageName ): Seq [SourceFileEntry ] = files(inPackage)
241
+ private [dotty] def sources (inPackage : String ): Seq [SourceFileEntry ] = files(inPackage)
239
242
}
0 commit comments