Skip to content

Commit 35d29a1

Browse files
committed
Add JarArchive as a new kind of output directory
1 parent 4a0606a commit 35d29a1

File tree

3 files changed

+44
-42
lines changed

3 files changed

+44
-42
lines changed

compiler/src/dotty/tools/backend/jvm/GenBCode.scala

+13-14
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,16 @@ class GenBCode extends Phase {
4949
superCallsMap.put(sym, old + calls)
5050
}
5151

52-
private[this] var jarFS: JarFS = _
53-
54-
def outputDir(implicit ctx: Context): AbstractFile = {
55-
val path = Directory(ctx.settings.outputDir.value)
56-
if (path.extension == "jar") {
57-
if (jarFS == null) {
58-
path.delete()
59-
jarFS = JarFS.create(path)
60-
}
61-
jarFS.getRoot()
52+
private[this] var myOutput: AbstractFile = _
53+
54+
protected def outputDir(implicit ctx: Context): AbstractFile = {
55+
if (myOutput eq null) {
56+
val path = Directory(ctx.settings.outputDir.value)
57+
myOutput =
58+
if (path.extension == "jar") JarArchive.create(path)
59+
else new PlainDirectory(path)
6260
}
63-
else new PlainDirectory(path)
61+
myOutput
6462
}
6563

6664
def run(implicit ctx: Context): Unit = {
@@ -71,9 +69,10 @@ class GenBCode extends Phase {
7169

7270
override def runOn(units: List[CompilationUnit])(implicit ctx: Context) = {
7371
try super.runOn(units)
74-
finally if (jarFS ne null) {
75-
jarFS.close()
76-
jarFS = null
72+
finally myOutput match {
73+
case jar: JarArchive =>
74+
jar.close()
75+
case _ =>
7776
}
7877
}
7978
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dotty.tools.io
2+
3+
import java.nio.file.{Files, FileSystem, FileSystems}
4+
5+
import scala.collection.JavaConverters._
6+
7+
/**
8+
* This class implements an [[AbstractFile]] backed by a jar
9+
* that be can used as the compiler's output directory.
10+
*/
11+
class JarArchive private (root: Directory) extends PlainDirectory(root) {
12+
def close() = jpath.getFileSystem().close()
13+
}
14+
15+
object JarArchive {
16+
/** Create a new jar file. Overwrite if file already exists */
17+
def create(path: Path): JarArchive = {
18+
require(path.extension == "jar")
19+
20+
path.delete()
21+
22+
// creating a new zip file system by using the JAR URL syntax:
23+
// https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
24+
val env = Map("create" -> "true").asJava
25+
val uri = java.net.URI.create("jar:file:" + path.toAbsolute.path)
26+
val fs = FileSystems.newFileSystem(uri, env)
27+
28+
val root = fs.getRootDirectories().iterator.next()
29+
new JarArchive(Directory(root))
30+
}
31+
}

compiler/src/dotty/tools/io/JarFS.scala

-28
This file was deleted.

0 commit comments

Comments
 (0)