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