diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-04 13:57:01 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-04 13:57:01 -0700 |
commit | bc6eb79f74a30aef2eb874eb7ba3c443c49e7554 (patch) | |
tree | 8302e85440240d13006694dcdace9b77a4ee0778 /core/src/main/scala/forge/util/LocalDef.scala | |
parent | c103d7b024c3b0edce800c0dbd4cfaffd1aabfba (diff) | |
download | mill-bc6eb79f74a30aef2eb874eb7ba3c443c49e7554.tar.gz mill-bc6eb79f74a30aef2eb874eb7ba3c443c49e7554.tar.bz2 mill-bc6eb79f74a30aef2eb874eb7ba3c443c49e7554.zip |
Add some basic compile-time checks to enforce usage of `T{...}` within traits
Diffstat (limited to 'core/src/main/scala/forge/util/LocalDef.scala')
-rw-r--r-- | core/src/main/scala/forge/util/LocalDef.scala | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/core/src/main/scala/forge/util/LocalDef.scala b/core/src/main/scala/forge/util/LocalDef.scala new file mode 100644 index 00000000..2a58bbd2 --- /dev/null +++ b/core/src/main/scala/forge/util/LocalDef.scala @@ -0,0 +1,28 @@ +package forge.util + +import scala.reflect.macros.blackbox +import language.experimental.macros +class LocalDef +object LocalDef { + implicit def default: LocalDef = macro enclosing + def enclosing(c: blackbox.Context): c.Expr[LocalDef] = { + + import c.universe._ + val current = c.internal.enclosingOwner + + if ( + !current.isMethod || + // We can't do this right now because it causes recursive method errors + // current.asMethod.paramLists.nonEmpty || + !(current.owner.isClass || current.owner.isModuleClass) + ) { + c.abort( + c.enclosingPosition, + "T{} can only be used directly within a zero-arg method defined in a class body" + ) + }else{ + + c.Expr[LocalDef](q"""new forge.util.LocalDef()""") + } + } +} |