diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2016-03-22 21:25:35 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-03-22 21:28:27 +0100 |
commit | 6cb50acfb5ee4df342e83d8505116d4607f45d1c (patch) | |
tree | bd37410452b625a74c5337f9a5509ae8451b5189 /src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala | |
parent | ad48e5918081c679546f50b6f52dd8e0813754e7 (diff) | |
download | scala-6cb50acfb5ee4df342e83d8505116d4607f45d1c.tar.gz scala-6cb50acfb5ee4df342e83d8505116d4607f45d1c.tar.bz2 scala-6cb50acfb5ee4df342e83d8505116d4607f45d1c.zip |
Enable flat classpath by default
Implements VirtualDirectoryFlatClassPath, which is required for the
presentation compiler created for the repl's tab-completion.
Various minor cleanups in the flat classpath implementation.
Diffstat (limited to 'src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala b/src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala new file mode 100644 index 0000000000..06cdab583c --- /dev/null +++ b/src/compiler/scala/tools/nsc/classpath/VirtualDirectoryFlatClassPath.scala @@ -0,0 +1,39 @@ +package scala.tools.nsc.classpath + +import scala.tools.nsc.util.ClassRepresentation +import scala.reflect.io.{Path, PlainFile, VirtualDirectory, AbstractFile} +import FileUtils._ +import java.net.URL + +case class VirtualDirectoryFlatClassPath(dir: VirtualDirectory) extends FlatClassPath with DirectoryLookup[ClassFileEntryImpl] with NoSourcePaths { + type F = AbstractFile + + protected def emptyFiles: Array[AbstractFile] = Array.empty + protected def getSubDir(packageDirName: String): Option[AbstractFile] = + Option(dir.lookupName(packageDirName, directory = true)) + protected def listChildren(dir: AbstractFile, filter: Option[AbstractFile => Boolean] = None): Array[F] = filter match { + case Some(f) => dir.iterator.filter(f).toArray + case _ => dir.toArray + } + def getName(f: AbstractFile): String = f.name + def toAbstractFile(f: AbstractFile): AbstractFile = f + def isPackage(f: AbstractFile): Boolean = f.isPackage + + // mimic the behavior of the old nsc.util.DirectoryClassPath + def asURLs: Seq[URL] = Seq(new URL(dir.name)) + def asClassPathStrings: Seq[String] = Seq(dir.path) + + override def findClass(className: String): Option[ClassRepresentation[AbstractFile]] = findClassFile(className) map ClassFileEntryImpl + + def findClassFile(className: String): Option[AbstractFile] = { + val relativePath = FileUtils.dirPath(className) + val classFile = new PlainFile(Path(s"$dir/$relativePath.class")) + if (classFile.exists) Some(classFile) + else None + } + + private[nsc] def classes(inPackage: String): Seq[ClassFileEntry] = files(inPackage) + + protected def createFileEntry(file: AbstractFile): ClassFileEntryImpl = ClassFileEntryImpl(file) + protected def isMatchingFile(f: AbstractFile): Boolean = f.isClass +} |