summaryrefslogtreecommitdiff
path: root/moduledefs
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-12-31 00:04:49 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-12-31 00:50:11 -0800
commit13f896a36eb275de9784ce3400dde09311afd6bd (patch)
treeb4effd6451be0b1c1d74bfbb380b668950b522d1 /moduledefs
parent982b1e07cb512d6a48c859950b7aa8ce9746dd25 (diff)
downloadmill-13f896a36eb275de9784ce3400dde09311afd6bd.tar.gz
mill-13f896a36eb275de9784ce3400dde09311afd6bd.tar.bz2
mill-13f896a36eb275de9784ce3400dde09311afd6bd.zip
- Convert `T.source` into a generic `Target` that flushes the cache every time
- Prepare `T.ctx().base: Path` that `Task`s (including `T.source`) can use to find a "default" path for source files. - Simplify `Cacher`
Diffstat (limited to 'moduledefs')
-rw-r--r--moduledefs/src/main/scala/mill/moduledefs/Cacher.scala22
1 files changed, 12 insertions, 10 deletions
diff --git a/moduledefs/src/main/scala/mill/moduledefs/Cacher.scala b/moduledefs/src/main/scala/mill/moduledefs/Cacher.scala
index cea2ca41..023f03be 100644
--- a/moduledefs/src/main/scala/mill/moduledefs/Cacher.scala
+++ b/moduledefs/src/main/scala/mill/moduledefs/Cacher.scala
@@ -4,19 +4,21 @@ import scala.collection.mutable
import scala.reflect.macros.blackbox.Context
-trait Cacher[C[_]]{
- private[this] lazy val cacherLazyMap = mutable.Map.empty[sourcecode.Enclosing, C[_]]
- def wrapCached[T](in: C[T], enclosing: String): C[T]
- protected[this] def cachedTarget[T](t: => C[T])
- (implicit c: sourcecode.Enclosing): C[T] = synchronized{
- cacherLazyMap.getOrElseUpdate(c, wrapCached(t, c.value)).asInstanceOf[C[T]]
+trait Cacher{
+ private[this] lazy val cacherLazyMap = mutable.Map.empty[sourcecode.Enclosing, Any]
+
+ protected[this] def cachedTarget[T](t: => T)
+ (implicit c: sourcecode.Enclosing): T = synchronized{
+ cacherLazyMap.getOrElseUpdate(c, t).asInstanceOf[T]
}
}
+
object Cacher{
- def impl0[M[_], T: c.WeakTypeTag](c: Context)(t: c.Expr[M[T]]): c.Expr[M[T]] = {
- c.Expr[M[T]](wrapCached(c)(t.tree))
+ def impl0[T: c.WeakTypeTag](c: Context)
+ (t: c.Expr[T]): c.Expr[T] = {
+ c.Expr[T](wrapCached[T](c)(t.tree))
}
- def wrapCached(c: Context)(t: c.Tree) = {
+ def wrapCached[R: c.WeakTypeTag](c: Context)(t: c.Tree) = {
import c.universe._
val owner = c.internal.enclosingOwner
@@ -24,7 +26,7 @@ object Cacher{
owner.owner.isClass &&
owner.owner.asClass.baseClasses.exists(_.fullName == "mill.moduledefs.Cacher")
- if (ownerIsCacherClass && owner.isMethod) q"this.cachedTarget($t)"
+ if (ownerIsCacherClass && owner.isMethod) q"this.cachedTarget[${weakTypeTag[R]}]($t)"
else c.abort(
c.enclosingPosition,
"T{} members must be defs defined in a Cacher class/trait/object body"