@@ -18,7 +18,7 @@ import java.nio.file.{FileSystems, Files}
18
18
import java .util
19
19
20
20
import scala .reflect .io .{AbstractFile , PlainFile , PlainNioFile }
21
- import scala .tools .nsc .util .{ClassPath , ClassRepresentation }
21
+ import scala .tools .nsc .util .{ClassPath , ClassRepresentation , EfficientClassPath }
22
22
import FileUtils ._
23
23
import scala .collection .JavaConverters ._
24
24
import scala .reflect .internal .JDK9Reflectors
@@ -32,7 +32,7 @@ import scala.tools.nsc.classpath.PackageNameUtils.{packageContains, separatePkgA
32
32
* when we have a name of a package.
33
33
* It abstracts over the file representation to work with both JFile and AbstractFile.
34
34
*/
35
- trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends ClassPath {
35
+ trait DirectoryLookup [FileEntryType <: ClassRepresentation ] extends EfficientClassPath {
36
36
type F
37
37
38
38
val dir : F
@@ -47,28 +47,26 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends ClassPath {
47
47
protected def createFileEntry (file : AbstractFile ): FileEntryType
48
48
protected def isMatchingFile (f : F ): Boolean
49
49
50
- private def getDirectory (forPackage : String ): Option [F ] = {
51
- if (forPackage == ClassPath . RootPackage ) {
50
+ private def getDirectory (forPackage : PackageName ): Option [F ] = {
51
+ if (forPackage.isRoot ) {
52
52
Some (dir)
53
53
} else {
54
- val packageDirName = FileUtils .dirPath(forPackage)
55
- getSubDir(packageDirName)
54
+ getSubDir(forPackage.dirPathTrailingSlash)
56
55
}
57
56
}
58
- override private [nsc] def hasPackage (pkg : String ) = getDirectory(pkg).isDefined
57
+ override private [nsc] def hasPackage (pkg : PackageName ) = getDirectory(pkg).isDefined
59
58
60
- private [nsc] def packages (inPackage : String ): Seq [PackageEntry ] = {
59
+ private [nsc] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
61
60
val dirForPackage = getDirectory(inPackage)
62
61
63
62
val nestedDirs : Array [F ] = dirForPackage match {
64
63
case None => emptyFiles
65
64
case Some (directory) => listChildren(directory, Some (isPackage))
66
65
}
67
- val prefix = PackageNameUtils .packagePrefix(inPackage)
68
- nestedDirs.map(f => PackageEntryImpl (prefix + getName(f)))
66
+ nestedDirs.map(f => PackageEntryImpl (inPackage.entryName(getName(f))))
69
67
}
70
68
71
- protected def files (inPackage : String ): Seq [FileEntryType ] = {
69
+ protected def files (inPackage : PackageName ): Seq [FileEntryType ] = {
72
70
val dirForPackage = getDirectory(inPackage)
73
71
val files : Array [F ] = dirForPackage match {
74
72
case None => emptyFiles
@@ -77,22 +75,18 @@ trait DirectoryLookup[FileEntryType <: ClassRepresentation] extends ClassPath {
77
75
files.map(f => createFileEntry(toAbstractFile(f)))
78
76
}
79
77
80
- private [nsc] def list (inPackage : String ): ClassPathEntries = {
78
+ override private [nsc] def list (inPackage : PackageName , onPackageEntry : PackageEntry => Unit , onClassesAndSources : ClassRepresentation => Unit ): Unit = {
81
79
val dirForPackage = getDirectory(inPackage)
82
- val files : Array [F ] = dirForPackage match {
83
- case None => emptyFiles
84
- case Some (directory) => listChildren(directory)
85
- }
86
- val packagePrefix = PackageNameUtils .packagePrefix(inPackage)
87
- val packageBuf = collection.mutable.ArrayBuffer .empty[PackageEntry ]
88
- val fileBuf = collection.mutable.ArrayBuffer .empty[FileEntryType ]
89
- for (file <- files) {
90
- if (isPackage(file))
91
- packageBuf += PackageEntryImpl (packagePrefix + getName(file))
92
- else if (isMatchingFile(file))
93
- fileBuf += createFileEntry(toAbstractFile(file))
80
+ dirForPackage match {
81
+ case None =>
82
+ case Some (directory) =>
83
+ for (file <- listChildren(directory)) {
84
+ if (isPackage(file))
85
+ onPackageEntry(PackageEntryImpl (inPackage.entryName(getName(file))))
86
+ else if (isMatchingFile(file))
87
+ onClassesAndSources(createFileEntry(toAbstractFile(file)))
88
+ }
94
89
}
95
- ClassPathEntries (packageBuf, fileBuf)
96
90
}
97
91
}
98
92
@@ -196,21 +190,21 @@ final class JrtClassPath(fs: java.nio.file.FileSystem) extends ClassPath with No
196
190
}
197
191
198
192
/** Empty string represents root package */
199
- override private [nsc] def hasPackage (pkg : String ) = packageToModuleBases.contains(pkg)
200
- override private [nsc] def packages (inPackage : String ): Seq [PackageEntry ] = {
201
- packageToModuleBases.keysIterator.filter(pack => packageContains(inPackage, pack)).map(PackageEntryImpl (_)).toVector
193
+ override private [nsc] def hasPackage (pkg : PackageName ) = packageToModuleBases.contains(pkg.dottedString )
194
+ override private [nsc] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
195
+ packageToModuleBases.keysIterator.filter(pack => packageContains(inPackage.dottedString , pack)).map(PackageEntryImpl (_)).toVector
202
196
}
203
- private [nsc] def classes (inPackage : String ): Seq [ClassFileEntry ] = {
204
- if (inPackage == " " ) Nil
197
+ private [nsc] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = {
198
+ if (inPackage.isRoot ) Nil
205
199
else {
206
- packageToModuleBases.getOrElse(inPackage, Nil ).flatMap(x =>
207
- Files .list(x.resolve(inPackage.replace( '.' , '/' ) )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
200
+ packageToModuleBases.getOrElse(inPackage.dottedString , Nil ).flatMap(x =>
201
+ Files .list(x.resolve(inPackage.dirPathTrailingSlash )).iterator().asScala.filter(_.getFileName.toString.endsWith(" .class" ))).map(x =>
208
202
ClassFileEntryImpl (new PlainNioFile (x))).toVector
209
203
}
210
204
}
211
205
212
- override private [nsc] def list (inPackage : String ): ClassPathEntries =
213
- if (inPackage == " " ) ClassPathEntries (packages(inPackage), Nil )
206
+ override private [nsc] def list (inPackage : PackageName ): ClassPathEntries =
207
+ if (inPackage.isRoot ) ClassPathEntries (packages(inPackage), Nil )
214
208
else ClassPathEntries (packages(inPackage), classes(inPackage))
215
209
216
210
def asURLs : Seq [URL ] = Seq (new URL (" jrt:/" ))
@@ -262,21 +256,21 @@ final class CtSymClassPath(ctSym: java.nio.file.Path, release: Int) extends Clas
262
256
}
263
257
264
258
/** Empty string represents root package */
265
- override private [nsc] def hasPackage (pkg : String ) = packageIndex.contains(pkg)
266
- override private [nsc] def packages (inPackage : String ): Seq [PackageEntry ] = {
267
- packageIndex.keysIterator.filter(pack => packageContains(inPackage, pack)).map(PackageEntryImpl (_)).toVector
259
+ override private [nsc] def hasPackage (pkg : PackageName ) = packageIndex.contains(pkg.dottedString )
260
+ override private [nsc] def packages (inPackage : PackageName ): Seq [PackageEntry ] = {
261
+ packageIndex.keysIterator.filter(pack => packageContains(inPackage.dottedString , pack)).map(PackageEntryImpl (_)).toVector
268
262
}
269
- private [nsc] def classes (inPackage : String ): Seq [ClassFileEntry ] = {
270
- if (inPackage == " " ) Nil
263
+ private [nsc] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = {
264
+ if (inPackage.isRoot ) Nil
271
265
else {
272
- val sigFiles = packageIndex.getOrElse(inPackage, Nil ).iterator.flatMap(p =>
266
+ val sigFiles = packageIndex.getOrElse(inPackage.dottedString , Nil ).iterator.flatMap(p =>
273
267
Files .list(p).iterator().asScala.filter(_.getFileName.toString.endsWith(" .sig" )))
274
268
sigFiles.map(f => ClassFileEntryImpl (new PlainNioFile (f))).toVector
275
269
}
276
270
}
277
271
278
- override private [nsc] def list (inPackage : String ): ClassPathEntries =
279
- if (inPackage == " " ) ClassPathEntries (packages(inPackage), Nil )
272
+ override private [nsc] def list (inPackage : PackageName ): ClassPathEntries =
273
+ if (inPackage.isRoot ) ClassPathEntries (packages(inPackage), Nil )
280
274
else ClassPathEntries (packages(inPackage), classes(inPackage))
281
275
282
276
def asURLs : Seq [URL ] = Nil
@@ -310,7 +304,7 @@ case class DirectoryClassPath(dir: File) extends JFileDirectoryLookup[ClassFileE
310
304
protected def createFileEntry (file : AbstractFile ): ClassFileEntryImpl = ClassFileEntryImpl (file)
311
305
protected def isMatchingFile (f : File ): Boolean = f.isClass
312
306
313
- private [nsc] def classes (inPackage : String ): Seq [ClassFileEntry ] = files(inPackage)
307
+ private [nsc] def classes (inPackage : PackageName ): Seq [ClassFileEntry ] = files(inPackage)
314
308
}
315
309
316
310
case class DirectorySourcePath (dir : File ) extends JFileDirectoryLookup [SourceFileEntryImpl ] with NoClassPaths {
@@ -334,5 +328,5 @@ case class DirectorySourcePath(dir: File) extends JFileDirectoryLookup[SourceFil
334
328
}
335
329
}
336
330
337
- private [nsc] def sources (inPackage : String ): Seq [SourceFileEntry ] = files(inPackage)
331
+ private [nsc] def sources (inPackage : PackageName ): Seq [SourceFileEntry ] = files(inPackage)
338
332
}
0 commit comments