summaryrefslogtreecommitdiff
path: root/contrib/scoverage/src/ScoverageReportWorker.scala
blob: 1aaa31addbb4e334452aa5a7c634d6df40f9cd47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package mill.contrib.scoverage

import mill.{Agg, T}
import mill.api.{ClassLoader, Ctx, Result}
import mill.define.{Discover, ExternalModule, Worker}
import mill.eval.PathRef

class ScoverageReportWorker {
  private var scoverageInstanceCache = Option.empty[(Long, api.ScoverageReportWorkerApi)]

  def bridge(classpath: Agg[os.Path])
                    (implicit ctx: Ctx) = {
    val classloaderSig =
      classpath.map(p => p.toString().hashCode + os.mtime(p)).sum
    scoverageInstanceCache match {
      case Some((sig, bridge)) if sig == classloaderSig => bridge
      case _ =>
        val toolsClassPath = classpath.map(_.toIO.toURI.toURL).toVector
        ctx.log.debug("Loading classes from\n"+toolsClassPath.mkString("\n"))
        val cl = ClassLoader.create(
          toolsClassPath,
          getClass.getClassLoader
        )
        val bridge = cl
          .loadClass("mill.contrib.scoverage.worker.ScoverageReportWorkerImpl")
          .getDeclaredConstructor()
          .newInstance()
          .asInstanceOf[api.ScoverageReportWorkerApi]
        scoverageInstanceCache = Some((classloaderSig, bridge))
        bridge
    }
  }
}

object ScoverageReportWorkerApi extends ExternalModule {

  def scoverageReportWorker = T.worker { new ScoverageReportWorker() }
  lazy val millDiscover = Discover[this.type]
}