summaryrefslogtreecommitdiff
path: root/scalaplugin/src
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-12-26 23:06:25 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-12-26 23:06:25 -0800
commit370d026c3135cb3a1ee1838201d008a6d88e028f (patch)
treedacdb88cbacc7681a26d195b7b699b69d988b6dc /scalaplugin/src
parent761b0297b44a491b2874068eefcccbbfccec2804 (diff)
downloadmill-370d026c3135cb3a1ee1838201d008a6d88e028f.tar.gz
mill-370d026c3135cb3a1ee1838201d008a6d88e028f.tar.bz2
mill-370d026c3135cb3a1ee1838201d008a6d88e028f.zip
Cache scala compiler jars in a separate classloader from the compiler plugin jars, since the compiler jars change much less frequently and the code can thus be kept hot rather than being discarded each time
Diffstat (limited to 'scalaplugin/src')
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala23
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala5
2 files changed, 21 insertions, 7 deletions
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala b/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
index b314454c..7dad791d 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
@@ -26,6 +26,7 @@ object ZincWorker extends Worker[ZincWorker]{
def make() = new ZincWorker
}
class ZincWorker{
+ var scalaClassloaderCache = Option.empty[(Long, ClassLoader)]
var scalaInstanceCache = Option.empty[(Long, ScalaInstance)]
}
object Lib{
@@ -49,6 +50,7 @@ object Lib{
sources: Seq[Path],
compileClasspath: Seq[Path],
compilerClasspath: Seq[Path],
+ pluginClasspath: Seq[Path],
compilerBridge: Path,
scalacOptions: Seq[String],
scalacPluginClasspath: Seq[Path],
@@ -58,21 +60,32 @@ object Lib{
val compileClasspathFiles = compileClasspath.map(_.toIO).toArray
val compilerJars = compilerClasspath.toArray.map(_.toIO)
+ val pluginJars = pluginClasspath.toArray.map(_.toIO)
- val classloaderSig = compilerClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ val compilerClassloaderSig = compilerClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ val scalaInstanceSig =
+ compilerClassloaderSig + pluginClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+
+ val compilerClassLoader = zincWorker.scalaClassloaderCache match{
+ case Some((k, v)) if k == compilerClassloaderSig => v
+ case _ =>
+ val classloader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null)
+ zincWorker.scalaClassloaderCache = Some((compilerClassloaderSig, classloader))
+ classloader
+ }
val scalaInstance = zincWorker.scalaInstanceCache match{
- case Some((k, v)) if k == classloaderSig => v
+ case Some((k, v)) if k == scalaInstanceSig => v
case _ =>
val scalaInstance = new ScalaInstance(
version = scalaVersion,
- loader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null),
+ loader = new URLClassLoader(pluginJars.map(_.toURI.toURL), compilerClassLoader),
libraryJar = grepJar(compilerClasspath, s"scala-library-$scalaVersion.jar"),
compilerJar = grepJar(compilerClasspath, s"scala-compiler-$scalaVersion.jar"),
- allJars = compilerJars,
+ allJars = compilerJars ++ pluginJars,
explicitActual = None
)
- zincWorker.scalaInstanceCache = Some((classloaderSig, scalaInstance))
+ zincWorker.scalaInstanceCache = Some((scalaInstanceSig, scalaInstance))
scalaInstance
}
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
index 49720863..b1102234 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
@@ -164,8 +164,8 @@ trait ScalaModule extends Module with TaskModule { outer =>
*/
def scalaCompilerClasspath: T[Seq[PathRef]] = T{
resolveDeps(
- T.task{scalaCompilerIvyDeps(scalaVersion()) ++ scalaRuntimeIvyDeps(scalaVersion())},
- )() ++ scalacPluginClasspath()
+ T.task{scalaCompilerIvyDeps(scalaVersion()) ++ scalaRuntimeIvyDeps(scalaVersion())}
+ )()
}
/**
@@ -191,6 +191,7 @@ trait ScalaModule extends Module with TaskModule { outer =>
allSources().map(_.path),
compileDepClasspath().map(_.path),
scalaCompilerClasspath().map(_.path),
+ scalacPluginClasspath().map(_.path),
compilerBridge().path,
scalacOptions(),
scalacPluginClasspath().map(_.path),