summaryrefslogtreecommitdiff
path: root/src/partest/scala/tools/partest/JavapTest.scala
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2012-12-27 03:33:11 -0800
committerSom Snytt <som.snytt@gmail.com>2013-01-09 02:12:35 -0800
commit942f078720cb05c9238913bae8e62900558c2c45 (patch)
tree8c8d58fece2706cf2f8e57b168ea5378f2502c18 /src/partest/scala/tools/partest/JavapTest.scala
parent666572261c41cc92b06c03bf4aa260c198240cd8 (diff)
downloadscala-942f078720cb05c9238913bae8e62900558c2c45.tar.gz
scala-942f078720cb05c9238913bae8e62900558c2c45.tar.bz2
scala-942f078720cb05c9238913bae8e62900558c2c45.zip
Repl javap decodes various synthetic names for us (fixing SI-6894)
For instance, javap -app Test is equivalent to javap Test$delayedInit$App with the correct line and iw prepended. This works by taking Test as a name in scope, translating that, and then supplying the suffix. Then javap -fun Test shows Test$$anonfun*, and for member m, javap -fun Test#m shows Test$$anonfun$$m*. This also works for classes and values defined in the repl. javap -fun -raw m shows $line3.$read$$iw$$iw$$anonfun$m$1. E.g., javap -fun scala.Enumeration obviates knowing or guessing scala/Enumeration$$anonfun$scala$Enumeration$$populateNameMap$1.class. Also, scala> :javap -fun scala.Array#concat but still to do is using imported syms. Both files and replout are supported for searching for artifacts. The trigger is detecting the synthetic name (has an interior dollar). Still to do, filter the output on Test#m to show only m. Need a way to explore the list of artifacts; ideally, related symbols would be available reflectively. Prefer companion class to object, otherwise it's not showable; for object, require dollar when both exist. A JavapTest is supplied that is a ReplTest that asserts something about its output instead of printing it.
Diffstat (limited to 'src/partest/scala/tools/partest/JavapTest.scala')
-rw-r--r--src/partest/scala/tools/partest/JavapTest.scala26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/partest/scala/tools/partest/JavapTest.scala b/src/partest/scala/tools/partest/JavapTest.scala
new file mode 100644
index 0000000000..3cb3dc6ca8
--- /dev/null
+++ b/src/partest/scala/tools/partest/JavapTest.scala
@@ -0,0 +1,26 @@
+
+package scala.tools.partest
+
+import scala.util.{Try,Success,Failure}
+import java.lang.System.{out => sysout}
+
+/** A trait for testing repl's javap command
+ * or possibly examining its output.
+ */
+abstract class JavapTest extends ReplTest {
+
+ /** Your Assertion Here, whatever you want to bejahen.
+ * Assertions must be satisfied by all flavors of javap
+ * and should not be fragile with respect to compiler output.
+ */
+ def yah(res: Seq[String]): Boolean
+
+ def baddies = List(":javap unavailable", ":javap not yet working")
+
+ // give it a pass if javap is broken
+ override def show() = try {
+ val res = eval().toSeq
+ val unsupported = res exists (s => baddies exists (s contains _))
+ assert ((unsupported || yah(res)), res.mkString("","\n","\n"))
+ } catch { case ae: AssertionError => ae.printStackTrace(sysout) }
+}