summaryrefslogtreecommitdiff
path: root/src/main/scala/hbt/DefCtx.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/hbt/DefCtx.scala')
-rw-r--r--src/main/scala/hbt/DefCtx.scala35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main/scala/hbt/DefCtx.scala b/src/main/scala/hbt/DefCtx.scala
new file mode 100644
index 00000000..1be06cd4
--- /dev/null
+++ b/src/main/scala/hbt/DefCtx.scala
@@ -0,0 +1,35 @@
+package hbt
+
+
+import scala.language.experimental.macros
+import scala.reflect.macros._
+
+
+case class DefCtx(staticEnclosing: Option[String])
+object DefCtx{
+ case class StaticContext(value: Boolean)
+ object StaticContext {
+ implicit def default: StaticContext = macro applyImpl
+ def rec(c: Context)(expr: c.Symbol): Boolean = {
+ import c.universe._
+ // Classes and traits and such
+ if(!expr.isModuleClass && expr.isClass) false
+ // Method contents
+ else if(expr.isMethod) false
+ else if(expr.owner == NoSymbol) true
+ else rec(c)(expr.owner)
+ }
+
+ def applyImpl(c: Context): c.Expr[StaticContext] = {
+ import c.universe._
+ val staticContext = rec(c)(c.internal.enclosingOwner)
+ c.Expr[StaticContext](q"hbt.DefCtx.StaticContext($staticContext)")
+ }
+ }
+
+ implicit def default(implicit enc: sourcecode.Enclosing,
+ sc: StaticContext) = {
+ if (sc.value) DefCtx(Some(enc.value))
+ else DefCtx(None)
+ }
+} \ No newline at end of file