summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.sbt2
-rw-r--r--src/main/scala/hbt/StaticContext.scala25
-rw-r--r--src/test/scala/hbt/StaticContextTests.scala36
3 files changed, 63 insertions, 0 deletions
diff --git a/build.sbt b/build.sbt
index 4cffcc50..db008a0b 100644
--- a/build.sbt
+++ b/build.sbt
@@ -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)
+
+ }
+}