diff options
Diffstat (limited to 'scalaplugin/src/main')
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala | 51 |
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) } |