diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-12-31 00:04:49 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-12-31 00:50:11 -0800 |
commit | 13f896a36eb275de9784ce3400dde09311afd6bd (patch) | |
tree | b4effd6451be0b1c1d74bfbb380b668950b522d1 /moduledefs/src | |
parent | 982b1e07cb512d6a48c859950b7aa8ce9746dd25 (diff) | |
download | mill-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/src')
-rw-r--r-- | moduledefs/src/main/scala/mill/moduledefs/Cacher.scala | 22 |
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" |