diff options
author | Guillaume Martres <smarter@ubuntu.com> | 2017-04-11 17:45:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-11 17:45:55 +0200 |
commit | 65dc7ad151a38158a45c5836d5e1f0fd48b8e396 (patch) | |
tree | 7d1e2c9d1f848525a7d406e6046559081e70f675 /compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala | |
parent | f13e3a43d227933ce644f2503f658ea436ea11b4 (diff) | |
parent | 223f32b7658a77fb2ad6b30ad247c0e27204b558 (diff) | |
download | dotty-65dc7ad151a38158a45c5836d5e1f0fd48b8e396.tar.gz dotty-65dc7ad151a38158a45c5836d5e1f0fd48b8e396.tar.bz2 dotty-65dc7ad151a38158a45c5836d5e1f0fd48b8e396.zip |
Merge pull request #2191 from dotty-staging/sync-classpath-scalac
Fix #2186: Synchronize classpath handling with Scala 2.12
Diffstat (limited to 'compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala b/compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala new file mode 100644 index 000000000..5b0855554 --- /dev/null +++ b/compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala @@ -0,0 +1,52 @@ +package dotty.tools.dotc.classpath + +import dotty.tools.io.ClassRepresentation +import scala.reflect.io.{AbstractFile, Path, PlainFile, VirtualDirectory} +import FileUtils._ +import java.net.URL + +import scala.reflect.internal.util.AbstractFileClassLoader +import dotty.tools.io.ClassPath + +case class VirtualDirectoryClassPath(dir: VirtualDirectory) extends ClassPath with DirectoryLookup[ClassFileEntryImpl] with NoSourcePaths { + type F = AbstractFile + + // From AbstractFileClassLoader + private final def lookupPath(base: AbstractFile)(pathParts: Seq[String], directory: Boolean): AbstractFile = { + var file: AbstractFile = base + for (dirPart <- pathParts.init) { + file = file.lookupName(dirPart, directory = true) + if (file == null) + return null + } + + file.lookupName(pathParts.last, directory = directory) + } + + protected def emptyFiles: Array[AbstractFile] = Array.empty + protected def getSubDir(packageDirName: String): Option[AbstractFile] = + Option(lookupPath(dir)(packageDirName.split('/'), 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] = findClassFile(className) map ClassFileEntryImpl + + def findClassFile(className: String): Option[AbstractFile] = { + val relativePath = FileUtils.dirPath(className) + ".class" + Option(lookupPath(dir)(relativePath split '/', directory = false)) + } + + private[dotty] def classes(inPackage: String): Seq[ClassFileEntry] = files(inPackage) + + protected def createFileEntry(file: AbstractFile): ClassFileEntryImpl = ClassFileEntryImpl(file) + protected def isMatchingFile(f: AbstractFile): Boolean = f.isClass +} |