summaryrefslogtreecommitdiff
path: root/src/partest
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-09-08 18:37:59 +0200
committerJason Zaugg <jzaugg@gmail.com>2012-09-08 18:47:49 +0200
commitc619f94a9cfbddc12c9c5df3affb4636f8982a0a (patch)
tree8f0b988c9ab4cdb10723118453a4bda76d753457 /src/partest
parent5b9b394d99bd7e4446e0f15475b34ec287d91685 (diff)
downloadscala-c619f94a9cfbddc12c9c5df3affb4636f8982a0a.tar.gz
scala-c619f94a9cfbddc12c9c5df3affb4636f8982a0a.tar.bz2
scala-c619f94a9cfbddc12c9c5df3affb4636f8982a0a.zip
SI-6331 Avoid typing an If tree with a constant type.
The fast path in typedIf added in 8552740b avoided lubbing the if/else branch types if they are identical, but this fails to deconst the type. This could lead to the entire if expression being replaced by a constant. Also introduces a new tool in partest for nicer checkfiles. // in Test.scala trace(if (t) -0d else 0d) // in Test.check trace> if (Test.this.t) -0.0 else 0.0 res: Double = -0.0
Diffstat (limited to 'src/partest')
-rw-r--r--src/partest/scala/tools/partest/package.scala27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/partest/scala/tools/partest/package.scala b/src/partest/scala/tools/partest/package.scala
index 08934ef143..49d3ed301c 100644
--- a/src/partest/scala/tools/partest/package.scala
+++ b/src/partest/scala/tools/partest/package.scala
@@ -73,4 +73,31 @@ package object partest {
def isPartestDebug: Boolean =
propOrEmpty("partest.debug") == "true"
+
+
+ import language.experimental.macros
+
+ /**
+ * `trace("".isEmpty)` will return `true` and as a side effect print the following to standard out.
+ * {{{
+ * trace> "".isEmpty
+ * res: Boolean = true
+ *
+ * }}}
+ *
+ * An alternative to [[scala.tools.partest.ReplTest]] that avoids the inconvenience of embedding
+ * test code in a string.
+ */
+ def trace[A](a: A) = macro traceImpl[A]
+
+ import scala.reflect.macros.Context
+ def traceImpl[A: c.AbsTypeTag](c: Context)(a: c.Expr[A]): c.Expr[A] = {
+ import c.universe._
+ val exprCode = c.literal(show(a.tree))
+ val exprType = c.literal(show(a.actualType))
+ reify {
+ println(s"trace> ${exprCode.splice}\nres: ${exprType.splice} = ${a.splice}\n")
+ a.splice
+ }
+ }
}