diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2019-05-20 07:17:49 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2019-05-20 07:17:49 +0800 |
commit | d12a0d762193d83f83c837eb4affad389744a6cd (patch) | |
tree | 3c26c7dfff35b27b843cdc6175fe05c53f930b76 /contrib/scoverage/src/ScoverageReportWorker.scala | |
parent | 827c72af63fdfd3ee6e4ed0e18a3e5a42e2c0c1c (diff) | |
parent | 1cb439fce4af7a61166f13a3c5045fa7c73b25de (diff) | |
download | mill-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.scala | 39 |
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] +} |