Skip to content

Commit 01c5bac

Browse files
committed
Add test for SI-9010
This is extremely ugly (not only does it use reflection, is uses Java reflection with hard-coded mangled symbol name because of a bug in Scala reflection), but I don't know of a better solution. :-(
1 parent 72ea0d7 commit 01c5bac

File tree

1 file changed

+51
-0
lines changed
  • src/test/scala/scala/util/parsing/combinator

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import scala.util.parsing.combinator._
2+
import scala.util.DynamicVariable
3+
4+
import org.junit.Test
5+
6+
class t9010 {
7+
@Test
8+
def test: Unit = {
9+
val p = new grammar
10+
val lastNoSuccessVar = getLastNoSuccessVar(p)
11+
import p._
12+
13+
val res1 = parse(x, "x")
14+
assert(res1.successful)
15+
assert(lastNoSuccessVar.value == None)
16+
17+
val res2 = parse(x, "y")
18+
assert(!res2.successful)
19+
assert(lastNoSuccessVar.value == None)
20+
21+
val res3 = parseAll(x, "x")
22+
assert(res3.successful)
23+
assert(lastNoSuccessVar.value == None)
24+
25+
val res4 = parseAll(x, "y")
26+
assert(!res4.successful)
27+
assert(lastNoSuccessVar.value == None)
28+
}
29+
30+
private def getLastNoSuccessVar(p: Parsers): DynamicVariable[Option[_]] = {
31+
// use java reflection instead of scala (see below) because of
32+
// https://issues.scala-lang.org/browse/SI-9306
33+
val fn = "scala$util$parsing$combinator$Parsers$$lastNoSuccessVar"
34+
val f = p.getClass.getDeclaredMethod(fn)
35+
f.setAccessible(true)
36+
f.invoke(p).asInstanceOf[DynamicVariable[Option[_]]]
37+
38+
/*
39+
val ru = scala.reflect.runtime.universe
40+
val mirror = ru.runtimeMirror(getClass.getClassLoader)
41+
val lastNoSuccessVarField =
42+
ru.typeOf[Parsers].decl(ru.TermName("lastNoSuccessVar")).asTerm.accessed.asTerm
43+
mirror.reflect(p).reflectField(lastNoSuccessVarField).get.
44+
asInstanceOf[DynamicVariable[Option[_]]]
45+
*/
46+
}
47+
48+
private final class grammar extends RegexParsers {
49+
val x: Parser[String] = "x"
50+
}
51+
}

0 commit comments

Comments
 (0)