summaryrefslogtreecommitdiff
path: root/scalaplugin/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'scalaplugin/src/main')
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala51
1 files changed, 27 insertions, 24 deletions
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
index 472b8c03..001f5844 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
@@ -33,7 +33,7 @@ object ScalaModule{
Locate.definesClass(classpathEntry)
}
- val compilerCache = new CompilerCache(2)
+ var scalaInstanceCache = Option.empty[(Long, ScalaInstance)]
def compileScala(scalaVersion: String,
sources: Seq[Path],
compileClasspath: Seq[Path],
@@ -51,7 +51,7 @@ object ScalaModule{
.toIO
}
- val outerClassLoader = getClass.getClassLoader
+
val compilerJars = compilerClasspath.toArray.map(_.toIO)
def binaryScalaVersion = scalaVersion.split('.').dropRight(1).mkString(".")
val compilerBridgeJar = new java.io.File(
@@ -59,24 +59,24 @@ object ScalaModule{
// s"out/bridges/$scalaVersion/compile/classes"
)
- val zincClassLoader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null){
- override def loadClass(name: String): Class[_] = {
- Option(findLoadedClass(name)) orElse
- (try Some(findClass(name)) catch {case e: ClassNotFoundException => None}) getOrElse {
- // Try to limit `outerClassLoader` to only stuff from the compiler-bridge jar
- if (name.startsWith("xsbt.")) outerClassLoader.loadClass(name)
- else super.loadClass(name)
- }
- }
+ val classloaderSig = compilerClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ println("classloaderSig: " + classloaderSig)
+ val scalaInstance = scalaInstanceCache match{
+ case Some((k, v)) if k == classloaderSig => v
+ case _ =>
+ val scalaInstance = new ScalaInstance(
+ version = scalaVersion,
+ loader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null),
+ libraryJar = grepJar(compilerClasspath, s"scala-library-$scalaVersion.jar"),
+ compilerJar = grepJar(compilerClasspath, s"scala-compiler-$scalaVersion.jar"),
+ allJars = compilerJars,
+ explicitActual = None
+ )
+ scalaInstanceCache = Some((classloaderSig, scalaInstance))
+ scalaInstance
}
- val scalaInstance = new ScalaInstance(
- version = scalaVersion,
- loader = zincClassLoader,
- libraryJar = grepJar(compilerClasspath, s"scala-library-$scalaVersion.jar"),
- compilerJar = grepJar(compilerClasspath, s"scala-compiler-$scalaVersion.jar"),
- allJars = compilerJars,
- explicitActual = None
- )
+
+
val scalac = ZincUtil.scalaCompiler(scalaInstance, compilerBridgeJar)
@@ -127,7 +127,6 @@ object ScalaModule{
skip = false,
zincFile,
new FreshCompilerCache,
-// compilerCache,
IncOptions.of(),
reporter,
Some(ignoreProgress),
@@ -141,8 +140,6 @@ object ScalaModule{
logger = logger
)
- zincClassLoader.close()
-
store.set(
AnalysisContents.create(
newResult.analysis(),
@@ -238,6 +235,7 @@ trait ScalaModule extends Module with TaskModule{ outer =>
override def projectDeps = Seq(outer)
}
def scalaVersion: T[String]
+ def mainClass: T[Option[String]] = None
def scalaBinaryVersion = T{ scalaVersion().split('.').dropRight(1).mkString(".") }
def ivyDeps = T{ Seq[Dep]() }
@@ -360,10 +358,15 @@ trait ScalaModule extends Module with TaskModule{ outer =>
def classpath = T{ Seq(resources(), compile()) }
def jar = T{
- createJar(Seq(resources(), compile()).map(_.path).filter(exists))
+ createJar(Seq(resources(), compile()).map(_.path).filter(exists), mainClass())
+ }
+
+ def run() = T.command{
+ val main = mainClass().getOrElse(throw new RuntimeException("No mainClass provided!"))
+ subprocess(main, runDepClasspath().map(_.path) :+ compile().path)
}
- def run(mainClass: String) = T.command{
+ def runMain(mainClass: String) = T.command{
subprocess(mainClass, runDepClasspath().map(_.path) :+ compile().path)
}