diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-03-15 08:54:58 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-03-22 14:41:56 -0700 |
commit | cc485a9c4f5764753a7d2d64815c2de84268d5ec (patch) | |
tree | b2c80c2ee288313a0c47ec15a897fbae55ce80f4 /src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala | |
parent | 482bef8079e2a2fecc2b8f77eb7c6da648125e3c (diff) | |
download | scala-cc485a9c4f5764753a7d2d64815c2de84268d5ec.tar.gz scala-cc485a9c4f5764753a7d2d64815c2de84268d5ec.tar.bz2 scala-cc485a9c4f5764753a7d2d64815c2de84268d5ec.zip |
SI-5717 error when bytecode cannot be written
If there's an existing file foo when emitting a class file for foo.Bar,
then emit an error at foo.Bar, similar to what javac does.
The error message looks something like:
foo.scala:4: error: error writing object Foo: ./mypkg/Foo.class: ./mypkg is not a directory
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala b/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala index c1cd3204e0..66aed14d1c 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala @@ -6,12 +6,15 @@ package scala.tools.nsc package backend.jvm -import java.io.{ DataOutputStream, FileOutputStream, OutputStream, File => JFile } +import java.io.{ DataOutputStream, FileOutputStream, IOException, OutputStream, File => JFile } import scala.tools.nsc.io._ import scala.tools.nsc.util.ScalaClassLoader import java.util.jar.Attributes.Name import scala.language.postfixOps +/** Can't output a file due to the state of the file system. */ +class FileConflictException(msg: String, val file: AbstractFile) extends IOException(msg) + /** For the last mile: turning generated bytecode in memory into * something you can use. Has implementations for writing to class * files, jars, and disassembled/javap output. @@ -20,16 +23,20 @@ trait BytecodeWriters { val global: Global import global._ - private def outputDirectory(sym: Symbol): AbstractFile = ( - settings.outputDirs.outputDirFor(enteringFlatten(sym.sourceFile)) - ) - private def getFile(base: AbstractFile, /*cls.getName()*/ clsName: String, suffix: String): AbstractFile = { + private def outputDirectory(sym: Symbol): AbstractFile = + settings.outputDirs outputDirFor enteringFlatten(sym.sourceFile) + + /** + * @param clsName cls.getName + */ + private def getFile(base: AbstractFile, clsName: String, suffix: String): AbstractFile = { + def ensureDirectory(dir: AbstractFile): AbstractFile = + if (dir.isDirectory) dir + else throw new FileConflictException(s"${base.path}/$clsName$suffix: ${dir.path} is not a directory", dir) var dir = base val pathParts = clsName.split("[./]").toList - for (part <- pathParts.init) { - dir = dir.subdirectoryNamed(part) - } - dir.fileNamed(pathParts.last + suffix) + for (part <- pathParts.init) dir = ensureDirectory(dir) subdirectoryNamed part + ensureDirectory(dir) fileNamed pathParts.last + suffix } private def getFile(sym: Symbol, clsName: String, suffix: String): AbstractFile = getFile(outputDirectory(sym), clsName, suffix) |