summaryrefslogtreecommitdiff
path: root/core/src/main/scala/forge/util/LocalDef.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/scala/forge/util/LocalDef.scala')
-rw-r--r--core/src/main/scala/forge/util/LocalDef.scala28
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()""")
+ }
+ }
+}