summaryrefslogtreecommitdiff
path: root/contrib/scoverage/src/ScoverageReportWorker.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2019-05-20 07:17:49 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2019-05-20 07:17:49 +0800
commitd12a0d762193d83f83c837eb4affad389744a6cd (patch)
tree3c26c7dfff35b27b843cdc6175fe05c53f930b76 /contrib/scoverage/src/ScoverageReportWorker.scala
parent827c72af63fdfd3ee6e4ed0e18a3e5a42e2c0c1c (diff)
parent1cb439fce4af7a61166f13a3c5045fa7c73b25de (diff)
downloadmill-d12a0d762193d83f83c837eb4affad389744a6cd.tar.gz
mill-d12a0d762193d83f83c837eb4affad389744a6cd.tar.bz2
mill-d12a0d762193d83f83c837eb4affad389744a6cd.zip
Merge branch '599'
Diffstat (limited to 'contrib/scoverage/src/ScoverageReportWorker.scala')
-rw-r--r--contrib/scoverage/src/ScoverageReportWorker.scala39
1 files changed, 39 insertions, 0 deletions
diff --git a/contrib/scoverage/src/ScoverageReportWorker.scala b/contrib/scoverage/src/ScoverageReportWorker.scala
new file mode 100644
index 00000000..1aaa31ad
--- /dev/null
+++ b/contrib/scoverage/src/ScoverageReportWorker.scala
@@ -0,0 +1,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]
+}