diff options
-rw-r--r-- | build.sbt | 2 | ||||
-rw-r--r-- | src/main/scala/hbt/StaticContext.scala | 25 | ||||
-rw-r--r-- | src/test/scala/hbt/StaticContextTests.scala | 36 |
3 files changed, 63 insertions, 0 deletions
@@ -9,6 +9,8 @@ libraryDependencies += "com.lihaoyi" %% "utest" % "0.5.4" % "test" testFrameworks += new TestFramework("utest.runner.Framework") libraryDependencies ++= Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided", + "org.scala-lang" % "scala-compiler" % scalaVersion.value % "provided", "com.lihaoyi" %% "sourcecode" % "0.1.4", "com.lihaoyi" %% "pprint" % "0.5.3", "com.lihaoyi" %% "ammonite-ops" % "1.0.2" diff --git a/src/main/scala/hbt/StaticContext.scala b/src/main/scala/hbt/StaticContext.scala new file mode 100644 index 00000000..7eb4fa8d --- /dev/null +++ b/src/main/scala/hbt/StaticContext.scala @@ -0,0 +1,25 @@ +package hbt + + +import scala.language.experimental.macros +import scala.reflect.macros._ + +case class StaticContext(value: Boolean) +object StaticContext { + implicit def apply: 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.StaticContext($staticContext)") + } +} diff --git a/src/test/scala/hbt/StaticContextTests.scala b/src/test/scala/hbt/StaticContextTests.scala new file mode 100644 index 00000000..022cfd1e --- /dev/null +++ b/src/test/scala/hbt/StaticContextTests.scala @@ -0,0 +1,36 @@ +package hbt + +import utest._ +class Helper{ + val static = implicitly[StaticContext] + object Nested { + val static = implicitly[StaticContext] + } + def method = implicitly[StaticContext] +} +object StaticContextTests extends TestSuite{ + val static = implicitly[StaticContext] + object Nested{ + val static = implicitly[StaticContext] + def method = implicitly[StaticContext] + class Helper{ + val static = implicitly[StaticContext] + } + } + + def method = implicitly[StaticContext] + val tests = Tests{ + val helper = new Helper() + 'inObject - assert(static.value) + 'inClass- assert(!helper.static.value) + 'inMethod - assert(!method.value) + + 'inObjectObject - assert(Nested.static.value) + 'inObjectClass- assert(!helper.static.value) + 'inObjectMethod- assert(!Nested.method.value) + + 'inClassObject - assert(!helper.Nested.static.value) + 'inClassMethod- assert(!helper.method.value) + + } +} |